我有一个网站,有一个自定义的帖子类型和一个博客。
对于自定义post类型,我希望slug作为root,如下所示
http://domain.com/<title>
还有我想在/blog下显示的博客帖子,如是
http://domain.com/blog/<title>
我已通过使用以下两个函数“最小化”自定义帖子类型的URL:
add_filter( \'post_type_link\', function($post_link, $post, $leavename) {
if(\'custom\' == $post->post_type && \'publish\' == $post->post_status) {
$post_link = str_replace( \'/\' . $post->post_type . \'/\', \'/\', $post_link);
return $post_link;
}
return $post_link;
}, 10, 3 );
以及
add_action(\'pre_get_posts\', function($query) {
if ( ! $query->is_main_query() || 3 != count( $query->query ) || ! isset( $query->query[\'page\'] ) ) {
return;
}
if ( ! empty( $query->query[\'name\'] ) ) {
$query->set( \'post_type\', array( \'post\', \'custom\', \'page\' ) );
}
});
但是,我还没有将我的博客帖子移动到/blog。
我尝试将permalink结构设置为
/blog/%postname%/
自定义帖子类型重写为
\'rewrite\' => array(\'slug\' => \'custom\', \'with_front\' => false)
然而,这并没有产生预期的效果(domain.com/title)。相反,“自定义”slug现在再次成为url的一部分。手动删除它(domain.com/title)会生成404。
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成
将博客帖子移动到/blog/
这非常简单,您可以使用WordPress设置来实现这一点-无需编码。
但问题是,在移动帖子后,您的CPT URL结构将与页面的URL结构冲突,因此您必须修改您的
pre_get_posts
作用
至于你的post_type_link
您可以将其简化很多(如果它不是分层的……是吗?):
add_filter( \'post_type_link\', function($post_link, $post, $leavename) {
if (\'custom\' == $post->post_type && \'publish\' == $post->post_status) {
$post_link = site_url(\'/\') . $post->post_name .\'/\';
}
return $post_link;
}, 10, 3 );
我也不会使用
pre_get_posts
选择合适的职位。使用
parse_request
对于这项任务来说要容易得多,它允许您更容易地防止404错误。
add_action( \'parse_request\', function ( $wp ) {
if ( ! is_admin() ) {
if ( array_key_exists(\'error\', $wp->query_vars) && \'404\' == $wp->query_vars[\'error\'] ) {
$custom_post = get_page_by_path( $wp->request, OBJECT, \'CUSTOM\' );
if ( $custom_post instanceof WP_Post ) {
unset( $wp->query_vars[\'error\'] );
$wp->query_vars[\'page\'] = \'\';
$wp->query_vars[\'CUSTOM\'] = $wp->query_vars[\'name\'] = $wp->request;
$wp->query_vars[\'post_type\'] = \'CUSTOM\';
}
}
}
return $wp;
} );