web-dev-qa-db-fra.com

Types de messages personnalisés, modèles de page et pagination. Pourquoi ai-je une erreur 404?

Aujourd'hui, j'ai passé des heures sur un problème épineux d'affichage d'un type de message personnalisé. Tout était bien présenté, sauf la pagination qui ne fonctionnerait tout simplement pas correctement.

J'ai une configuration de modèle de page pour afficher une "page de publications" (voir Codex: Page de publications ) pour un type de publication personnalisé ("news").

Je continue à recevoir une erreur 404 lorsque je clique sur "Messages plus anciens". J'ai remarqué que beaucoup d'autres personnes avaient ou avaient ce problème.

Pourquoi cela arrive-t-il? Voici ma requête et le code de la boucle:

<?php 
    // Enable Pagination
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    // The Args
    $args= array(
        'post_type' => 'news',
        'paged' => $paged,
        );

    // The Query
    query_posts($args); 

    // The Loop
    while ( have_posts() ) : the_post(); ?>
// ...
2
timshutes

J'ai compris ce problème littéralement quelques secondes avant de poster la question, alors j'ai décidé d'aller de l'avant et de poster la réponse ici. J'ai remarqué qu'il n'y a pas beaucoup d'aide consolidée pour résoudre ce problème.

Cela vous aidera si vos liens "Articles plus anciens" ou "Articles plus récents" vous donnent une erreur 404 lorsque vous essayez d'afficher des articles personnalisés sur un modèle de page.

Voici les étapes à suivre pour résoudre le problème 404 (dans la plupart des cas) si vous le rencontrez. Vérifiez après chacun pour voir si le problème disparaît.

Étape 1: Rincez vos permaliens

Aller aux paramètres => permaliens. Sélectionnez par défaut. Sauvegarder. Tester. Sélectionnez votre préférence. Sauvegarder. Testez à nouveau.

Étape 2: Vérifiez votre requête.

Si vider les permaliens ne résout pas le problème, vérifiez bien votre requête. Utilisez le Codex (voir: Pages> page de messages ). Vous devez définir la variable $ paged et l’utiliser dans vos options de requête.

Étape 3: assurez-vous que votre publication posts_per_page n'entre pas en conflit avec la valeur par défaut.

Il y a des gens qui discutent de cela en tant que bogue dans le noyau de wordpress. Que ce soit ou non le cas, l'option posts_per_page => x peut entraîner des problèmes de pagination si x est inférieur à l'option par défaut.

Une solution astucieuse à ce problème consiste à définir la valeur par défaut sur 1 (paramètres> lecture> "les blogs affichent au plus _ pages").

NOTE: À ce stade, le problème me concernait TOUJOURS. C'est l'étape 4 qui a finalement résolu le problème.

Étape 4: Assurez-vous que votre page contient un slug! = Votre post_type.

Dans mon cas, j'avais post_type => 'news'. Et la page que j’utilisais était www.monsite.com/news. Cela a provoqué le conflit qui a finalement gaffé la pagination. Pour résoudre ce problème, j'ai changé mon post_type en 'news-articles' et j'ai rincé les permaliens. Le problème est parti.

J'espère que cela vous aidera si vous rencontrez le même problème. J'ai l'impression que beaucoup de gens tombent dans ce piège - c'est facile à faire et ce n'est pas très intuitif à comprendre. (du moins ce n'était pas pour moi).

5
timshutes

À propos de l'étape 3. En voici l'explication: "La pagination est calculée avant que vous obteniez le fichier de modèle qui exécute query_posts. Le moyen approprié pour modifier posts_per_page de manière conditionnelle consiste à utiliser le hook pre_get_posts pour modifier la requête principale." https://wordpress.stackexchange.com/a/42063/17177 J'ai trouvé une implémentation "pre_get_posts" qui fonctionne pour moi http://uncommoncontent.com/2012/01/28/add-custom- post-types-to-the-loop :

if ( ! function_exists( 'ucc_add_cpts_to_pre_get_posts' ) ) {
    function ucc_add_cpts_to_pre_get_posts( $query ) {
        if ( $query->is_main_query() && ! is_post_type_archive() && ! is_singular() && ! is_404() ) {
        $my_post_type = get_query_var( 'post_type' );
            if ( empty( $my_post_type ) ) {
                $args = array(
                    'exclude_from_search' => false,
                    'public' => true,
                    '_builtin' => false
                );
                $output = 'names';
                $operator = 'and';
                $post_types = get_post_types( $args, $output, $operator );

                // Or uncomment and edit to explicitly state which post types you want.
                // $post_types = array( 'event', 'location' );
                // Add 'link' and/or 'page' to array() if you want these included.
                // array( 'post', 'link', 'page' ), etc.
                $post_types = array_merge( $post_types, array( 'post' ) );
                $query->set('post_type', $post_types );
            }
        }
    } 
}

add_action( 'pre_get_posts', 'ucc_add_cpts_to_pre_get_posts' );
4
Dmitry Misharov

Je suis venu avec une solution simple, après des heures de recherche :)

J'ai tout mis sur le blog pour tous ceux qui devraient rencontrer ce problème :)

http://www.jqui.net/wordpress/wp-post-type-pagination/

J'espère que quelqu'un obtient de la joie :)

0
Val