web-dev-qa-db-fra.com

Catégorie de type de message personnalisé WordPress pagination 404 Erreur

Ce problème me donne mal à la tête et je me demandais si quelqu'un savait comment le réparer.

J'ai un type de message personnalisé appelé Review. Voici comment cela est défini:

function codex_custom_init() {
    $args = array( 'rewrite' => array('slug' => 'review'), 
                    'public' => true, 
                    'has_archive' => true, 
                    'show_ui' => true,
                    'label' => 'Review', 
                    'publicly_queryable' => true,
                    'taxonomies' => array('category', 'post_tag'), 
                    'supports' => array( 'title', 'editor', 'comments', 'excerpt', 'custom-fields', 'thumbnail', 'author')
                  );
    register_post_type( 'review', $args );
}

add_action( 'init', 'codex_custom_init' );

Ma page d'archive, gérée par archive-review.php, fonctionne bien pour des pages comme celle-ci.

http://www.acme.com/review/page/3/

Cependant, lorsque des catégories sont impliquées, wordpress n’affiche pas la page "suivante". Au lieu de cela, il passe à un 404. Par exemple, lorsque j'essaie d'accéder à ceci:

http://www.acme.com/category/random/page/2/

Pourquoi cela donne-t-il un 404? En outre, il n'est plus alimenté par archive-review.php, mais archive.php (ce qui est logique, je suppose)

quelque chose de requête archive.php:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
        $cat = get_category(get_query_var('cat'));
        $catID = $cat->term_id;
        $args = (array('post_type' => array('post', 'review'), 'cat' => $catID, 'paged' => $paged));
        query_posts($args);

S'il vous plaît aider! Je suis très frustré!

1
21zna9

Créer une requête secondaire ou écraser la requête principale dans un modèle de page est le moyen le plus rapide et le plus simple que je connaisse pour rompre la pagination.

La requête principale, qui détermine la page à charger s'exécute avant votre modèle ainsi, les résultats sur la page et la requête qui charge la page sont désynchronisés. La requête principale ne connaît pas vos modifications dans le modèle. Peu importe que votre requête dans le modèle modifie la requête "principale". Les changements arrivent trop tard.

Ce que vous devez faire est d’utiliser un filtre sur pre_get_posts. À moins que je ne le lise mal, tout ce que vous avez à faire est de définir le post_status.

function set_post_type_for_archive_wpse_109213($qry) {
  if ($qry->is_archive()) {
    $post_type = $qry->get('post_type');
    if (empty($post_type)) {
      $post_type = array('post');
    }
    $post_type[] = 'review';
    $qry->set('post_type',  $post_type);
  }
}
add_action('pre_get_posts','set_post_type_for_archive_wpse_109213');

query_posts n'est jamais applicable, à moins que vous ne soyez le noyau WordPress et que vous ne l'êtes pas. Juste ne l'utilisez pas.

4
s_ha_dum