web-dev-qa-db-fra.com

Exécuter des requêtes dans tag.php

Je suis probablement dense, mais je n'arrive pas à comprendre le problème.

Le site que je développe utilise une boucle personnalisée, avec une requête excluant les publications cochées comme archivées.

La raison pour laquelle je souhaite modifier le modèle tag.php est de générer une méta personnalisée au début et d'ajuster l'apparence de toutes les publications sur les pages d'archive.

Cela fonctionne parfaitement pour la majorité du site, mais sur tag.php, le nuage de tags se brise, faisant que chaque tag sur lequel vous cliquez affiche la liste complète des publications.

Lorsque je supprime la requête, le nuage de tags fonctionne bien, mais les publications archivées sont toujours affichées et ne sont pas présentées comme elles doivent être.

Le code de requête que j'utilise est le suivant:

// The Queries
   $args = array(
      'post_type' => array('post', 'report', 'analysis', 'guest-blog'),
      'order'     => 'DESC',
      'meta_query'     => array(
            array(
               'key'     => 'epi_pubarchive',
               'value'   => 1,
               'compare' => '!=',
           )
      )
   );

 $the_query = new WP_Query( $args );

La méta clé, epi_pubarchive, est une case à cocher créée à l'aide de la boîte à méta, qui vérifie essentiellement si la case est cochée ou non.

J'ai essayé de supprimer meta_query et de l'essayer avec les arguments de base post_type et order, mais cela ne fonctionnera pas non plus.

Quelqu'un sait quel est le problème avec le modèle de balise et les requêtes?

Y a-t-il un meilleur moyen d'obtenir le résultat souhaité?

4
Jon Watson

En effet, la requête principale est supprimée et remplacée par votre requête personnalisée. Vous n'avez pas demandé à votre requête personnalisée de rechercher cette balise, alors pourquoi le ferait-elle? Vous remarquerez peut-être également que votre pagination est interrompue pour la même raison. Vous n'avez pas indiqué à la nouvelle requête la page sur laquelle vous vous trouvez. Pourquoi devrait-elle afficher la bonne page?

De plus, cette requête principale coûte cher! Pourquoi le jetez-vous! Pourquoi ne pas le modifier à la place?

Imaginez que vous ayez envoyé votre café chaque matin à votre ami, et que tous les jours, après 20 minutes de voyage, vous jetiez le café à la poubelle et vous disiez: "Je suis intolérant au lactose, donnez-moi un chocolat chaud à la place". Ils partent ensuite pour un autre voyage de 20 minutes pour aller chercher le chocolat chaud, laissant votre ami énervé, et vous attendez 40 minutes au lieu de 20. Ne serait-il pas plus facile de les taper sur l’épaule avant de partir et de leur dire "Hey I J'ai changé d'avis, je veux un chocolat chaud "?

Utilisez le filtre pre_get_posts pour modifier les options de la requête principale avant qu'elle ne se produise, par exemple. voici comment vous pouvez changer le nombre de messages par page:

add_filter( 'pre_get_posts', function( \WP_Query $query ) {
    if ( $query->is_tag() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', 5 );
    }
} );

Vous pouvez également utiliser $query->set pour modifier d'autres options. Pour ce faire, définissez vos types de publication et votre exclusion de taxonomie.

Une note finale sur le stockage de données et la performance

Vous ne devriez jamais tout rechercher, mais XYZ, vous voulez dire ce que vous cherchez, pas ce que vous ne cherchez pas. C'est plus lent, et pas d'échelle. Parfois, il est en fait plus rapide de tout récupérer puis de le supprimer manuellement en PHP!

Ainsi, au lieu d’ajouter des publications à un terme archivé, envisagez d’utiliser un terme non lu/non archivé et de rechercher ceux-ci?

4
Tom J Nowell