从URL中删除CPT插件会导致存档页面出现404错误

时间:2018-09-25 作者:Annapurna

我创建了一个具有以下重写规则的CPT:

"rewrite" => array( "slug" => "/", "with_front" => false ),
在函数中。php,我添加了以下代码:

function sh_parse_request_tricksy( $query ) {

    // Only noop the main query
    if ( ! $query->is_main_query() )
        return;

    // Only noop our very specific rewrite rule match
    if ( 2 != count( $query->query )
        || ! isset( $query->query[\'page\'] ) )
        return;

    // \'name\' will be set if post permalinks are just post_name, 
otherwise the page rule will match
    if ( ! empty( $query->query[\'name\'] ) ) {
        $query->set( \'post_type\', array( \'my_cpt1\',\'my_cpt2\' ) );
    }
}
add_action( \'pre_get_posts\', \'sh_parse_request_tricksy\' )
我的工作是为了删除我的CPT URL的CPT slug。但这里的问题是,我所有的归档页面都给了我404错误。甚至“作者存档”页面也无法正常工作。

有人能帮我解决这个问题吗?

提前谢谢。

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

解决这个问题花了一些时间,但我已经解决了。

不建议为重写slug传递“/”,因为它会导致比解决问题更多的问题,就像在本例中一样,会在其他页面中导致404错误。

因此,移除它是第一步。

接下来,我必须在我的函数中编写以下代码。php’:

要删除已发布帖子中的slug,请执行以下操作:

/**
 * Remove the slug from published post permalinks. Only affect our CPT though.
 */
function sh_remove_cpt_slug( $post_link, $post, $leavename ) {

    if ( in_array( $post->post_type, array( \'my_cpt1\' ) )
        || in_array( $post->post_type, array( \'my_cpt2\' )
        || \'publish\' == $post->post_status )
        $post_link = str_replace( \'/\' . $post->post_type . \'/\', \'/\', $post_link );
        return $post_link;
}
add_filter( \'post_type_link\', \'sh_remove_cpt_slug\', 10, 3 );
这仍然会导致错误,因为它指定只有“post”和“page”post类型可以有url而没有post类型slug。

现在要告诉WP,out CPT也会有URL而没有slug,我们需要在函数中实现这一点。php:

function sh_parse_request( $query ) {

    // Only loop the main query
    if ( ! $query->is_main_query() ) {
        return;
    }

    // Only loop our very specific rewrite rule match
    if ( 2 != count( $query->query )
        || ! isset( $query->query[\'page\'] ) )
        return;

    // \'name\' will be set if post permalinks are just post_name, otherwise the page rule will match
    if ( ! empty( $query->query[\'name\'] ) ) {
        $query->set( \'post_type\', array( \'my_cpt1\',\'my_cpt2\' ) );
    }
}
add_action( \'pre_get_posts\', \'sh_parse_request\' );

结束