包含核心类别的CPT档案

时间:2019-07-30 作者:zfors

我有一个自定义的帖子类型news_archive 他们正在使用WordPress类别。我想得到这些类别的档案页,只有CPT,没有核心帖子。我设法找到了这个url,当与我的自定义存档页面绑定时,它正是我想要的:

/stories/category/in-the-news/?post_type=archived_news/
在哪里stories 是在Permalinks页面的自定义结构中设置的博客文章permalink。

我想做的是把它变成

/news/category/in-the-news/
新闻在哪里rewrite 对于archived_news 职位

我试着这样做:

function category_cpt_rewrites() {
    $categories = array( \'in-the-news\', \'press-release\' );
    foreach ( $categories as $category ) {
        $rule    = \'/stories/category/\' . $category . \'/?post_type=archived_news\';
        $rewrite = \'/archived_news/category/\' . $category . \'/\';
        add_rewrite_rule( $rule, $rewrite, \'top\' );
    }
}

add_action( \'init\', \'category_cpt_rewrites\' );
但我觉得我的语法不对。我的想法对吗?

*editOk我成功了sort。必须交换规则/重写值,然后使用正确的正则表达式。

function category_cpt_rewrites() {
    $categories = array( \'in-the-news\', \'press-release\' );
    foreach ( $categories as $category ) {
        $rule    = \'^news/category/([^/]*)/?\';
        $rewrite = \'index.php?post_type=archived_news&category=\' . $category;
        add_rewrite_rule( $rule, $rewrite, \'top\' );
    }
}

add_action( \'init\', \'category_cpt_rewrites\' );
我仍然在显示这两个类别,但我想我已经接近了。然而,现在分页不起作用,我不知道为什么。/news/category/press-release/page/2/ 返回与第一页相同的帖子,但/stories/category/press-release/page/2/?post_type=archived_news 给我下一页的帖子

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

您需要显示给定类型的帖子({post_type}) 来自类别({term})链接的结构应如下所示:

{post\\u type}/类别/{term}

为避免与页面链接和“博客”帖子发生冲突,表达式不能以开头([^/]+), 但应包含显式输入的post类型的slug。这意味着每个自定义帖子类型都有一个单独的规则。

$regex = \'^news/category/(.+?)/?$\';
对于上述表达式$redirect 应包含category_namepost_type 参数:

$redirect = \'index.php?category_name=$matches[1]&post_type=news\';
如果是自定义分类法(^news/custom_tax_slug/(.+?)/?$):

$redirect = \'index.php?CUSTOM_TAX_SLUG=$matches[1]&taxonomy=CUSTOM_TAX_SLUG&post_type=news\';
要处理分页,您需要另一个规则,它是上述规则的扩展版本。

$regex = \'^news/category/(.+?)/page/?([0-9]{1,})/?$\';
$redirect = \'index.php?category_name=$matches[1]&post_type=news&paged=$matches[2]\';
总之:

function category_cpt_rewrites()
{
    add_rewrite_rule( \'^news/category/(.+?)/page/?([0-9]{1,})/?$\',
        \'index.php?category_name=$matches[1]&post_type=news&paged=$matches[2]\',
        \'top\'
    );
    add_rewrite_rule( \'^news/category/(.+?)/?$\',
        \'index.php?category_name=$matches[1]&post_type=news\',
        \'top\'
    );
}
或:

function category_cpt_rewrites()
{
    $post_types = [ \'news\' ];
    foreach ( $post_types as $cpt )
    {
        add_rewrite_rule( \'^\'. $cpt .\'/category/(.+?)/page/?([0-9]{1,})/?$\',
            \'index.php?category_name=$matches[1]&post_type=\'. $cpt .\'&paged=$matches[2]\',
            \'top\'
        );
        add_rewrite_rule( \'^\'. $cpt .\'/category/(.+?)/?$\',
            \'index.php?category_name=$matches[1]&post_type=\' . $cpt,
            \'top\'
        );
    }
}