web-dev-qa-db-fra.com

Comment créer archives.php pour une seule catégorie?

J'ai un fichier archive.php de base. J'essayais de l'afficher uniquement pour les publications de la catégorie 1. Lorsque je fais query_posts ('cat = 1'), l'URL est alors ignorée et toutes les publications de la catégorie 1 sont affichées.

Par exemple, disons que j'ai un message de la catégorie 1: il s'appelle "test de poste" et porte la date du 1er novembre 2012. Disons que j'ai un autre message de la catégorie 5 daté du 2 avril 2012.

Avec le fichier archives.php actuel (en utilisant les messages de requête pour le chat 1), l'URL: http://testing.com/2012/04 décide d'afficher tous les messages de la catégorie 1. Rien de bon, le message étant daté Novembre, et l’URL interroge pour avril (04).

Le fichier archives.php résoudra http://testing.com/2012/04 et http://testing.com/2012/11 car chacun de ces mois contient une publication (bien que non de la catégorie 1), il ne résoudra cependant pas http://testing.com/2012/09 car ce mois-ci n’a aucun message (catégorie 1 ou autre)

Comment puis-je effectuer la requête de fichier archives.php pour le mois en cours (quel que soit le contenu de l'URL) mais uniquement pour afficher les messages de la catégorie 1? Quand on me pose une autre question, comment puis-je créer http://testing.com/2012/04 arriver avec un message "Désolé, il n'y a pas de messages ici", comme dans http://testing.com/2012/09 while http://testing.com/2012/11 affiche toujours le message de la catégorie 1?

1
Kegan Quimby

D'abord:n'utilisez pas query_posts(), jamais.

Deuxièmement, pour créer un modèle de page d'index d'archivage de catégories pour une catégorie spécifique, reportez-vous à l'entrée du Codex pour la hiérarchie des modèles :

  • category-{slug}.php
  • category-{id}.php
  • category.php
  • archive.php
  • index.php

Ainsi, si vous avez une catégorie, 'foobar', avec un ID de catégorie de 1, vous pouvez effectuer l’une des opérations suivantes:

  • category-foobar.php
  • category-1.php

Et WordPress utilisera ce modèle pour afficher la page d'index d'archivage de cette catégorie.

La raison pour laquelle votre requête est traitée n'a rien à voir avec votre fichier de modèle, cependant; c'est parce que vous surchargez complètement la requête par défaut, en utilisant query_posts().

Pour filtrer vos archives datées selon une catégorie spécifique, utilisez pre_get_posts à la place:

function wpse75668_filter_pre_get_posts( $query ) {
    // Only modify the main loop query
    // on the front end
    if ( $query->is_main_query() && ! is_admin() ) {
        // Only modify date-based archives
        if ( is_date() ) {
            // Only display posts from category ID 1
            $query->set( 'cat', '1' );
        }
    }
}
add_action( 'pre_get_posts', 'wpse75668_filter_pre_get_posts' );

Pour plus d'informations, voir la présentation WordCamp de Nacin,Requête inconnue.

3
Chip Bennett