Taxonomy rewrite question

时间:2019-04-06 作者:Pediwent

我有定制的餐饮、住宿和活动职位类型。这些自定义帖子类型中的每一种都使用一种称为region的自定义分类法。例如,如果我有一个名为“闹市区”的地区,我希望能够通过转到域来显示该地区的用餐选项。com/市中心/餐饮。或者通过进入域名展示该地区的酒店。通讯/市中心/住宿。所以,基本上,我喜欢创建一个重写规则来给出结构域。com/tax term/cpt slug显示已选择该税项的cpt的所有帖子。有什么办法吗?

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

分类法的permalink结构将与页面的默认结构冲突。

就地址而言domain.com/item-one/item-two Wordpress如何知道这是一个页面item-two 使用父页item-one or item-two 是自定义帖子类型,并且item-one 是的期限region 分类学
重写规则的顺序将决定,因为您的结构的规则将是第一个,所以链接到子页面(如domain.com/parent-page/child-page) 将被定向到分类页(分类法=“区域”、术语=“父页”、post\\u类型=“子页”)。

有两种方式,我会选择第一种。

在结构中添加一些前缀,例如。regions/{term}/{cpt_slug}

为所有术语生成重写规则(downtown 和其他)来自region 分类法(每个术语一条规则)。添加和删除自定义分类术语后,必须重复生成。

在这两种情况下,要使重写规则起作用,您必须单击Save 在里面Dashboard -> Settings -> Permalinks 或使用flush_rewrite_fules() ("important note")

我使用了选项1regions 作为url前缀和region_cpt 作为查询变量名,您可以将它们更改为您喜欢的名称。

add_action( \'init\', \'se333633_rewrite_tags\', 10 );
add_action( \'init\', \'se333633_rewrite_rules\' );
add_action( \'pre_get_posts\', \'se333633_pre_get_posts\', 30 );

function se333633_rewrite_tags() 
{
     add_rewrite_tag( \'%region_cpt%\', \'([^/]+)\' );
}

function se333633_rewrite_rules()
{
     add_rewrite_rule(
         \'^regions/([^/]+)/([^/]+)/?$\',
         \'index.php?taxonomy=region&region=$matches[1]&region_cpt=$matches[2]\',
         \'top\'
     );
}

function se333633_pre_get_posts( $query ) 
{
     $cpt_for_region = get_query_var( \'region_cpt\', false );
     if ($cpt_from_region !== false && $query->is_main_query() ) 
     {
         $query->query_vars[\'post_type\'] = $cpt_for_region;
     }
}
代码中的选项2option #1, se333633_rewrite_rules 添加了更改和两个新函数,以在术语更改后刷新重写规则。

add_action( \'created_term\', \'se333633_created_term\', 20, 3);
add_action( \'delete_region\', \'se333633_region_term_deleted\' );

function se333633_rewrite_rules()
{
     $region_terms = get_terms([
         \'taxonomy\'  => \'region\',
         \'hide_empty\' => false,
         \'fields\'    => \'id=>slug\',
     ]);
     if ( is_array($region_terms) && count($region_terms) )
     {
         foreach( $region_terms as $slug )
         {
             add_rewrite_rule(
                 \'^\'.$slug.\'/([^/]+)/?$\',
                 \'index.php?taxonomy=region&region=\'. $slug. \'&region_cpt=$matches[1]\',
                 \'top\'
             );
         }
     }
}
function se333633_created_term ( $term_id, $tt_id, $taxonomy ) 
{
     if ( $taxonomy != \'region\')
         return;
     flush_rewrite_rules();
}
function se333633_region_term_deleted( $term )
{
     flush_rewrite_rules();
}

相关推荐

Non editable custom taxonomy

我已经复习过了Creating a non-removable taxonomy term 但它并没有回答我的问题。内置的分类术语之一是“post格式”。无法编辑。我想做的是注册一个分类法,我的插件将为其提供同样无法编辑的术语。我该怎么做?有没有可能钩住核心中的任何东西来锁定格式分类法?