将自定义重写限制为仅一种自定义帖子类型

时间:2011-03-03 作者:rhyslbw

我正在使用以下代码为我的一个自定义帖子类型创建一个简短的永久链接。我还有另一个cpt,我希望只使用默认的permalink结构,那么,将此过滤限制为仅使用cpt1的最佳方式是什么呢?老实说,我认为这里的一个函数已经可以处理这个问题了(add\\u permastruct?)但同样的permalink重写也适用于其他CPT。抄本中的文档对此有点单薄……谢谢Rhys

function cpt1_rewrite() {
global $wp_rewrite;
$queryarg = \'post_type=cpt1name&p=\';
$wp_rewrite->add_rewrite_tag(\'%cpt1_id%\', \'([^/]+)\', $queryarg);
$wp_rewrite->add_permastruct(\'cpt1name\', \'/cpt1/%cpt1_id%\', false);}

function cpt1_permalink($post_link, $id = 0, $leavename) {
global $wp_rewrite;
$post = &get_post($id);
if ( is_wp_error( $post ) )
    return $post;   
$newlink = $wp_rewrite->get_extra_permastruct(\'cpt1name\');
$newlink = str_replace("%cpt1_id%", $post->ID, $newlink);
$newlink = home_url(user_trailingslashit($newlink));
return $newlink;}

add_action(\'init\', \'cpt1_rewrite\');
add_filter(\'post_type_link\', \'cpt1_permalink\', 1, 3);

1 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

这个post_type_link 钩子用于所有指向自定义帖子类型的链接,您负责检查链接类型。记住使用passed$post 对象(不是post ID),否则检查当前全局$post 变量,它可能不是您现在正在为其创建链接的帖子。因此,您在评论中添加的代码几乎是正确的,我会这样写:

function cpt1_permalink( $post_link, $post, $leavename )
{
    // Yoda condition to be safe
    // http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307
    if ( \'cpt1name\' != $post->post_type ) {
        return $post_link;
    }
    // Rest of your code
}

结束

相关推荐