web-dev-qa-db-fra.com

La suppression du slug CPT de l'URL entraîne une erreur 404 pour la page d'archivage

J'ai créé un CPT avec des règles de réécriture comme suit:

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

Dans le functions.php, j'ai ajouté le code suivant:

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' )

Je travaille pour supprimer le slug CPT pour mes URL CPT. Mais le problème est que toutes mes pages d’archives me donnent une erreur 404. Même la page d'archive d'auteur ne fonctionne pas.

Quelqu'un peut-il m'aider à résoudre ce problème?

Merci d'avance.

2
Annapurna

Il a fallu du temps pour comprendre le problème, mais je l’ai fait.

Passer "/" pour réécrire slug n'est pas recommandé, car cela cause plus de problèmes qu'il n'en résout, comme dans ce cas, causant une erreur 404 dans d'autres pages.

Donc, le retirer était la première étape.

Ensuite, je devais écrire le code suivant dans mon 'functions.php':

  1. Pour supprimer le slug des publications publiées:

    /**
     * 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 );
    

Cela provoquera toujours une erreur car il spécifie que seuls les types de publication 'post' et 'page' peuvent avoir l'URL sans slug de type.

Maintenant, pour enseigner à WP que le CPT aura également une URL sans slug, nous devons l'obtenir dans notre fichier 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