web-dev-qa-db-fra.com

Est-ce que category.php et The Loop doivent être utilisés si la requête doit être personnalisable?

J'ai besoin que l'utilisateur puisse trier et filtrer les articles lors de l'affichage d'une catégorie. La bonne façon de créer une page de catégorie consiste à utiliser catégorie (- {id}/{slug}). Php, mais son utilisation crée automatiquement une boucle. Ainsi, quelle que soit la méthode que j'utilise pour trier et filtrer les publications qu'il fera. une autre boucle.

Dans ce cas, devrais-je créer un fichier qui ne s'appelle pas catégorie (- {id}/{slug}). Php et le lier d'une manière ou d'une autre aux catégories, ou serait-il préférable d'ignorer simplement que deux boucles sont effectuées quoi qu'il en soit et l'un d'eux ne sera pas utilisé?

Aussi dans ce cas utilise à nouveau la boucle, mais avec la requête modifiée, plus efficace que get_posts ()?

6
Nadroev

Oui, la boucle et un modèle de catégorie spécifique doivent être utilisés même si vous souhaitez personnaliser la requête. Pourquoi?:

  1. Même avec une page personnalisée, la requête principale sera exécutée. Ainsi, avec une page personnalisée, vous n'évitez pas la requête principale, vous ne la remplacez que par une requête différente.

  2. La requête principale elle-même est personnalisable.

  3. Si vous vous écartez du comportement par défaut de WordPress, il vous sera difficile de maintenir à l'avenir, surtout pour d'autres développeurs si quelqu'un d'autre prend en charge votre travail à l'avenir.

Comment modifier la requête principale:

Heureusement, WordPress est extrêmement personnalisable, ce qui signifie que la requête principale (la boucle) est également personnalisable. Vous pouvez utiliser le hook pre_get_posts action ou la fonction query_posts() pour modifier la requête principale. Cependant, il est recommandé d'utiliser le hook pre_get_posts.

Par exemple, supposons que vous souhaitiez modifier l'ordre des publications dans une catégorie en fonction de l'ordre croissant des dates. Pour cela, vous pouvez utiliser le code suivant dans le fichier functions.php de votre thème:

add_action( 'pre_get_posts', 'wpse258109_customize_category_query' );
function wpse258109_customize_category_query( $query ) {
    if( ! is_admin() && $query->is_main_query()  && $query->is_category( 'your-category-slug' ) ) {
        // get the orderby value from where ever you want and set in the main query
        $query->set( 'orderby', array( 'date' => 'ASC' ) );
    }
}

Ce code modifiera le comportement par défaut de la requête principale et vos publications de catégorie pour la page d'archivage your-category-slug se chargeront par ordre croissant. Bien entendu, vous pouvez apporter des modifications à cette requête principale, comme vous le feriez pour toute requête personnalisée à l'aide de WP_Query class.

5
Fayaz

Tout d'abord: c'est génial que vous pensiez à une requête gâchée! :)

Deuxièmement: WP exécute toujours une requête principale, peu importe ce que vous faites. Mais ce que vous pouvez faire, c'est modifier cette requête au lieu de l'ignorer et de créer une boucle secondaire. Cela peut être fait en utilisant le pre get posts hook.

2
kraftner