自定义帖子类型在根目录中,博客帖子在子目录中

时间:2019-01-15 作者:FSH

我有一个网站,有一个自定义的帖子类型和一个博客。

对于自定义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。

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

将博客帖子移动到/blog/ 这非常简单,您可以使用WordPress设置来实现这一点-无需编码。

enter image description here

但问题是,在移动帖子后,您的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;
} );

相关推荐

在创建函数.php之后,对未定义函数的调用是_BLOG_INSTALLED()

我想在中放置一些自定义代码functions.php 这是我无法做到的。为什么我在创建后会出现以下错误(即使是空的)functions.php? 我正在使用WP 5.4.2Heroku-wp?Fatal error: Uncaught Error: Call to undefined function is_blog_installed() in /app/public.built/wp-includes/load.php:606 Stack trace: #0 /app/public.built/wp-