未指定自定义发布时显示自定义发布存档

时间:2019-12-31 作者:Kha Kali

我有一个自定义的帖子类型,叫做produce 在WordPress中设置和一个名为produce_category.

此自定义帖子类型中帖子的URL格式如下http://mywebsite/produce/%produce_category%/%postname%/. 当然%produce_category%%postname% 因此,一个有效的url示例如下http://mywebsite/produce/fruits-and-vegetables/avocado.

如果用户访问,我想做的是显示product\\u category自定义分类存档http://mywebsite/produce/%produce_category%, 没有在末尾指定职位名称,例如http://mywebsite/produce/fruits-and-vegetables 显示果蔬农产品类别中的所有农产品。

除此之外,当用户访问http://mywebsite/produce/ 我想展示所有的产品档案。编辑:我现在正在工作。

我知道如何创建归档页面,完全没有问题。我一直致力于创建永久链接。当我访问时http://mywebsite/produce/%produce_category% 我得到一个404错误。

我正在寻找最好的方法来实现这一点的建议。目前我正在使用Custom Post Type PermalinksCPTUI.

CPTUI自定义分类设置界面不允许自定义重写段塞中有空白。它默认为自定义分类slug,produce_category, 当我什么都不填的时候。enter image description here

这使前端Product\\u category taxonomy归档url为http://mywebsite/produce/produce_category/%produce_category%/ e、 g。http://mywebsite/produce/produce_category/fish-and-seafood/ 当我想要归档的是http://mywebsite/produce/fish-and-seafood/.

请帮助我提出关于实现自定义分类url的最佳方法的建议。

谢谢大家。

2 个回复
SO网友:matija

尝试在中重写分类法url。htaccess

RewriteRule ^produce_category(.*)$ /$1 [L]
(未测试)

SO网友:nmr

在开始时,我将指出预期的结构与自定义帖子类型的默认结构冲突produce 职位。

该问题的解决方案需要更改为自定义类别创建的链接,并对新链接进行适当的解析,以显示正确的帖子。

使用pre_term_link 筛选以更改链接。传递的参数之一是为其生成链接的WP\\u Term对象。如果其分类是produce_category 然后是新的{cpt}/%{taxonomy}% 应该返回结构,即produce/%produce_category%.

add_filter( \'pre_term_link\', \'se355448_pre_term_link\', 10, 2 );

function se355448_pre_term_link( $termlink, $term )
{
    if ( ! $term instanceof \\WP_Term || $term->taxonomy != \'produce_category\' )
        return $termlink;

    return \'/produce/%produce_category%\';
}
然后,要正确识别链接,请使用add_rewrite_rule() 函数添加必要的重写规则。如前所述,目标结构与自定义帖子类型的链接冲突produce 这就是为什么你需要重写produce_category 分类法,它们应该是before CPT公司produce 规则。

add_action( \'init\', \'se355448_rewrite_rules\' );

function se355448_rewrite_rules()
{
    $cpt = \'produce\';
    $tax = \'produce_category\';
    //$terms = [\'fruits-and-vegetables\', \'fish-and-seafood\'];
    $terms = get_terms([
        \'taxonomy\'  => $tax,
        \'hide_empty\' => false,
        \'fields\'    => \'id=>slug\',
    ]);
    if ( is_array($terms) && count($terms) )
    {
        foreach( $terms as $slug )
        {
            add_rewrite_rule(
                "{$cpt}/{$slug}(?:/page/([0-9]+))?/?$",
                "index.php?{$tax}={$slug}&taxonomy={$tax}&post_type={$cpt}&paged=\\$matches[1]",
                \'top\'
            );
        }
    }
}
每个术语都需要一个重写规则,所以在添加新术语、删除新术语或更改现有术语的slug后,需要刷新重写规则。这可以通过单击“设置”(Settings)中的“保存”(Save)来完成。

下面的代码将自动使用created_{$taxonomy}delete_{$taxonomy} 操作挂钩,更新重写规则after adding or removing 条款来自produce_category 分类学

add_action( \'created_produce_category\', \'se355448_refresh_rules\', 20);
add_action( \'delete_produce_category\',  \'se355448_refresh_rules\' );

function se355448_refresh_rules()
{
    se355448_rewrite_rules();
    flush_rewrite_rules();
}

相关推荐

Problem with permalinks

我已经更改了类别的基本名称,现在它是“博客”,工作正常。但当我通过/blog/%category%/%postname%/更改结构时。显示404。如果我删除结构中的blog,它会再次工作,但我想使用blog word。问题出在哪里?非常感谢。