当你使用这个字符时,WordPress似乎打破了其他重写规则%
用于重写CPT的slug。不知道为什么。
不管怎样,我在代码中做了以下更改。
停止使用%
. 实际上不需要:
$rewrite = array(
\'slug\' => \'sector/service\',
\'with_front\' => false // It has nothing to due with the solution, but you\'d better put false here.
);
更换
/sector/
和
/service/
而不是
%sector%
和
%service%
:
function rewrite_location_post_slug( $post_link, $post ) {
if ( $post->post_type == \'location\' ) {
$terms_service = wp_get_object_terms( $post->ID, \'service\' );
$terms_sector = wp_get_object_terms( $post->ID, \'sector\' );
if ( $terms_service && $terms_sector ) {
$sector_replaced = str_replace( \'/sector/\', "/{$terms_sector[0]->slug}/", $post_link );
return str_replace( \'/service/\', "/{$terms_service[0]->slug}/", $sector_replaced );
}
}
return $post_link;
}
add_filter( \'post_type_link\', \'rewrite_location_post_slug\', 1, 2 );
到目前为止还不错。现在,如果你刷新你的永久链接,你会看到你的联系人页面回来了,但是你的
site_url/sector/service/location/
不见了。与失踪者有关
%
, 因此,我们必须添加我们在评论中提到的自定义重写规则,这实际上很危险,因为它是一种;“假图案”:
function rewrite_sector_service_location_url() {
add_rewrite_rule( \'^([^/]+)/([^/]+)/([^/]+)/?\', \'index.php?location=$matches[3]\', \'top\' );
}
add_action( \'init\', \'rewrite_sector_service_location_url\' );
刷新你的重写规则,你会发现现在一切都正常了。
它应该适合您,但我建议您为您的部门和/或服务使用前缀,以便我们可以为重写模式添加一个标准。
[编辑]
如果您选择在术语中添加前缀,我将尝试解释解决方案。
假设您选择了前缀sector 用于分类法中的所有术语sector
.
因此,如果您有两个术语:Chemical 和Construction, 默认情况下,他们的鼻涕虫是chemical
和construction
. 但根据前缀规则,它们的slug应该改为sector-chemical
和sector-construction
, 分别地顺便说一句,WordPress有一个过滤器(https://developer.wordpress.org/reference/hooks/pre_insert_term/) 您可以使用它自动添加前缀。
使用该前缀标准,我们的重写规则应更改为:
function rewrite_sector_service_location_url() {
add_rewrite_rule( \'^(sector-[^/]+)/([^/]+)/([^/]+)/?\', \'index.php?location=$matches[3]\', \'top\' );
}
add_action( \'init\', \'rewrite_sector_service_location_url\' );
上面的规则确保我们可以匹配如下内容
http://example.com/sector-chemical/service/post-slug
并且永远不会匹配其他URL,如:
http://example.com/blog/page/2
.