web-dev-qa-db-ja.com

URLからCPTスラッグを削除すると、アーカイブページで404エラーが発生する

次のような書き換えルールを使用してCPTを作成しました。

"rewrite" => array( "slug" => "/", "with_front" => false ),

Functions.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スラッグを削除するためにこれを機能させました。しかし、ここでの問題は、すべてのアーカイブページで404エラーが発生することです。著者のアーカイブページも機能していません。

誰も私がこれを解決するのを助けることができますか?

前もって感謝します。

2
Annapurna

問題を理解するのに時間がかかりましたが、完了しました。

書き換えスラッグに「/」を渡すことは、この場合のように解決するよりも多くの問題を引き起こし、他のページで404エラーを引き起こすため、お勧めしません。

したがって、それを削除することが最初のステップでした。

次に、「functions.php」に次のコードを記述する必要がありました。

  1. 公開された投稿からスラッグを削除するには:

    /**
     * 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」の投稿タイプのみが投稿タイプのスラッグなしでurlを持つことができると指定しているため、エラーを引き起こします。

WPに、CPTにもスラッグのないURLがあることを教えるために、functions.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' );
1
Annapurna