CPT和常规帖子/页面的永久链接不同,但为什么?

时间:2014-03-25 作者:Charles

后端Permalink结构:http://domain.com/%year%/%category%/%postname%

对于“常规”帖子/页面,一切正常,但一旦显示CPT%year% 都走了

显示的帖子/页面Url类似于:http://domain.com/2014/category01/regular-post001
显示的CPT Url类似于:http://domain.com/category01/cpt-post002

(对我来说)最奇怪的是,当我(为了那个CPT)屈服时http://domain.com/2014/category01/cpt-post002 它显示了CPT,但在没有2014(年份)的情况下省略/重定向到url。

我错过了什么/做错了什么?

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

Wordpress后端中的permalink配置仅适用于标准帖子和页面。对于CPT,默认URL结构为http://example.com/cpt-identifier/post-slug. 如果您想要为您的CPT提供不同的URL结构,那么您必须定义并注册自己的重写规则。

例如:

add_action( \'init\', \'register_posttype\' );
function register_posttype() {
register_post_type( \'my_cpt\', //this will be in the URL as CPT identifier
    array(
        \'labels\' => array(
            \'name\' => __( \'My Custom Post Types\' ),
            \'singular_name\' => __( \'Custom Post Type\' )
        ),
        \'public\' => true,
        \'has_archive\' => true,
        \'rewrite\' => array(\'slug\' => \'products\'), //This will override the CPT identifier
    )
);
}
如果您想在CPT的URL结构中包括dinamic标记,如year,则必须定义自己的重写规则和永久链接过滤器:

add_action( \'init\', \'register_posttype\' );
function register_posttype() {
register_post_type( \'my_cpt\', //this will be in the URL as CPT identifier
    array(
        \'labels\' => array(
            \'name\' => __( \'My Custom Post Types\' ),
            \'singular_name\' => __( \'Custom Post Type\' )
        ),
        \'public\' => true,
        \'has_archive\' => true,
        \'rewrite\' => array(\'slug\' => \'%year%/my_cpt\'), //This will override the CPT identifier
    )
);
}

add_filter(\'post_type_link\', \'modify_permalink\');
function modify_permalink($url, $post = null) {
    // limit to certain post type. remove if not needed
    if (get_post_type($post) != \'my_cpt\') {
        return $url;
    } elseif(!is_object($post)) {
        global $post;
    }
    $url = str_replace("%year%",  get_the_date(\'Y\'), $url);

    return $url;
}

add_action(\'init\',\'my_add_rewrite_rules\');
function my_add_rewrite_rules() {
    add_rewrite_rule(\'([0-9])/my_cpt/(.+)/?$\', \'index.php?post_type=my_cpt&post=$matches[1]\', \'top\' );
}

结束

相关推荐

Redirect loop in /wp-admin/

今天,我管理的一个网站管理员无法访问。我刚刚在服务器上更新了apache,以启用mod\\u deflate,并将PHP从5.3升级到5.4。因为每次我尝试访问/wp admin/I时都会收到重定向循环错误。我尝试了所有常见的嫌疑犯,即:清除了Cookie和缓存,尝试了不同的浏览器,禁用了主题,删除了禁用的Cookie。htaccess检查了wp\\U选项中的site\\u url等,但运气不佳。我可以访问wp登录。php很好,但不是/wp管理员/任何帮助都将不胜感激,因为我完全被难住了。