没有一个干净的方法来满足你的要求。您希望WordPress检查给定URL中是否有包含该段代码的帖子,如果没有,请尝试查找包含该段代码的类别。除了页面之外,WordPress在“提交”到匹配的重写规则之前不会检查对象(post,term)是否存在。因此,当您有冲突的重写规则时,第二个规则将永远不会被读取。
最好的答案是为你的帖子或类别找到不同的重写结构。前缀是理想的,比如/blog/%postname%/
, /articles/%postname%/
对于帖子,或/category/%category%/
, /topic/%category%/
对于类别。
也就是说,按你的要求去做并不是不可能的,只是不是最优的。您需要做的是拦截request
并检查该帖子是否存在。如果不是,请更改查询变量。请注意,这会增加每篇文章的页面负载,因此请权衡成本与收益。还请记住,如果帖子和类别共享相同的名称,则无法访问该类别。不用再多说了,
function wpse_75604_check_rewrite_conflicts( $qv ) {
if ( isset( $qv[\'name\'] ) ) {
if ( ! get_page_by_path( $qv[\'name\'], OBJECT, \'post\' ) ) {
$qv[\'category_name\'] = $qv[\'name\'];
unset( $qv[\'name\'] );
}
}
return $qv;
}
add_filter( \'request\', \'wpse_75604_check_rewrite_conflicts\' );