web-dev-qa-db-fra.com

Pourquoi ai-je un 404 sur la page 1 de ma requête?

J'ai une barre de navigation de filtrage sur la page de messages avec "Tous" et certaines catégories ("Stratégie", "Design et UX", "Technologie" et "Société et culture") qui modifie la requête en utilisant pre_get_posts pour afficher les messages appartenant à ces catégories particulières.

Voici ce que j'ai dans mon functions.php:

function owr_blog_topic_endpoint() {
    add_rewrite_endpoint( 'topic', EP_ALL );
}
add_action( 'init', 'owr_blog_topic_endpoint' );

function owr_pre_get_posts( $query ) {
    $topic = get_query_var( 'topic' );
    if ( $query->is_home() && $query->is_main_query() && isset( $topic ) ) {
        $query->set( 'category_name', $topic );
    }
}
add_action( 'pre_get_posts', 'owr_pre_get_posts' );  

J'affiche 7 articles à la fois et au bas de la page, j'utilise the_posts_pagination() pour générer les liens vers les pages avec le reste des articles. Cela fonctionne bien dans le sens où il montre le nombre correct de pages compte tenu du nombre de messages appartenant à cette catégorie.

Ainsi, lorsque "Tous" est défini, l'URL est /notes et lorsqu'un utilisateur clique sur "Stratégie", par exemple, l'URL est /notes/topic/strategy. Lorsque nous passons à la deuxième page de "Tous", l'URL est /notes/page/2 et la même chose à partir de "Stratégie" crée l'URL /notes/topic/strategy/page/2, à l'endroit où le 404 se produit.

J'ai le sentiment que je dois ajouter d'autres règles de réécriture, mais je ne suis pas sûr.

Modifier
Donc, il s’avère que mon intuition était correcte et que la solution consiste à ajouter des règles de réécriture. Voici ce que j'ai ajouté:

function owr_blog_rewrite( $rules ) {
    return [
        'notes/topic/([^/]+)/?$' => 'topic=$matches[1]',
        'notes/topic/([^/]+)/page/([0-9]+)/?$' => 'topic=$matches[1]&paged=$matches[2]',
    ] + $rules;
}
add_filter( 'rewrite_rules_array', 'owr_blog_rewrite' );  

Tout fonctionne comme prévu maintenant

2
syzygy333

Donc, mon intuition était correcte et la solution consiste à ajouter des règles de réécriture. Voici ce que j'ai ajouté:

function owr_blog_rewrite( $rules ) {
    return [
        'notes/topic/([^/]+)/?$' => 'topic=$matches[1]',
        'notes/topic/([^/]+)/page/([0-9]+)/?$' => 'topic=$matches[1]&paged=$matches[2]',
    ] + $rules;
}
add_filter( 'rewrite_rules_array', 'owr_blog_rewrite' );  

Tout fonctionne comme prévu maintenant

1
syzygy333