用两个而不是一个分类插件重写CPT插件

时间:2019-05-23 作者:Asifur Rahman

我有一个帖子类型location 其中包含2种分类法-service &;sector. 现在,wordpress通常会显示permalink,如-site_url/location/post_name我成功地展示了-site_url/service_slug/sector_slug/post_name

这正是我想要的,我已经做到了。问题是,它破坏了所有页面的url!示例:我有一个联系人页面siteurl/contact. 现在,当我转到联系人页面url时,它显示为404。这意味着permalink结构可以与我的location 但它打破了我所有的页面永久链接。

我已将wordpress permalink结构更新为/%postname%/ 好几次。

下面是我的代码-

位置post类型重写段塞-

\'rewrite\' = array(
    \'slug\' => \'%sector%/%service%\',
    \'with_front\' => true
);
*我也尝试过“with\\u front”false,同样的事情。

用于更新slug的自定义函数-

function rewrite_location_post_slug( $post_link, $id = 0 ){
$post = get_post($id);  
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 );
    }
} else {
return $post_link; 
}   
}
add_filter( \'post_type_link\', \'rewrite_location_post_slug\', 1, 3 );
分类法的代码中没有任何重写段塞。此处为完整代码-https://pastebin.com/3eLZhga2

这是wordpress的bug还是我遗漏了什么?请告知。

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

当你使用这个字符时,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.

因此,如果您有两个术语:ChemicalConstruction, 默认情况下,他们的鼻涕虫是chemicalconstruction. 但根据前缀规则,它们的slug应该改为sector-chemicalsector-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.

相关推荐

如何用ACF值替换自定义POST类型的Slug?

我在高级自定义字段中有一个下拉选择类型字段。值为视频和图像。我想替换自定义的post类型slug。目前,它是视频。我想改变我的网站。com/video/post name到mysite。com/1/post name或mysite。com/0/post名称我的意思是,当选择下拉值视频时,它将显示mysite。com/1/post名称。我可以替换post-type slug。function update_video_slug( $args, $post_type) { $cptslug