web-dev-qa-db-fra.com

Afficher uniquement les publications de la catégorie référencée sur la page d'archive

J'utilise wp_get_archive () dans category.php.

Si je suis sur la page de la catégorie = 2, il devrait afficher uniquement les archives de cette catégorie Cependant c'est pour toutes les catégories. Voici le code de mon category.php ainsi que de archive.php

<?php get_header(); ?>
 <?php 
   $args =array(               
                'posts_per_page' =>1,                 
           );
  $loop = new WP_Query( $args );                                            
  if($loop->have_posts()):while ( $loop->have_posts() ): $loop->the_post();
   the_content();
  endwhile;
  endif;
 ?>
 <?php wp_get_archives( array( 'type' => 'daily') ); ?>

La première partie qui consiste à afficher les archives de catégories spécifiques a été résolue par ce code grâce à Pieter Goosen - Réponse donnée par lui sur Comment puis-je modifier la requête SQL pour wp_get_archive ()

Mais maintenant, le problème est que si je vais à cette archive à partir de la page de la catégorie, je dois également afficher uniquement les messages de cette catégorie.

2
user3848698

Avant de recommencer, je tiens simplement à souligner le fait que vous ne devez pas exécuter de requête personnalisée à la place de la requête principale sur vos pages d'archive. Veuillez consulter cet article pour savoir quand utiliser une requête personnalisée ou non. Si vous ne revenez pas à la boucle par défaut, ma solution ne fonctionnera pas

Dans le post précédent, nous avons déjà résolu le problème pour afficher uniquement les archives de la catégorie actuellement consultée. Le prochain numéro consiste à afficher uniquement les publications de la catégorie actuelle lorsque vous visitez les archives de date de la catégorie actuelle.

Pour ce faire, nous allons utiliser les filtres et actions suivants

Pour que la page d'archivage des dates sache si la demande provient d'une page de catégorie et ne diffuse que les articles de cette catégorie, nous devons définir un type de référent. Comme wp_get_referer() et $_SERVER['HTTP_REFERER'] sont très peu fiables (voir cet article pour plus d'informations), nous allons utiliser des paramètres supplémentaires dans l'URL pour définir des valeurs que nous vérifierons et utiliserons pour déterminer les articles à diffuser. Pour ce faire, nous allons définir une nouvelle variable de requête cq qui contiendra l'ID de catégorie actuel.

Nous devons ensuite modifier les liens d’archive de wp_get_archives() lorsqu’ils sont affichés sur les pages de catégorie. Nous devons ajouter l'ID de catégorie à l'URL afin de pouvoir lire l'ID de catégorie lorsque nous sommes sur la page d'archive pour modifier la requête principale. Pour modifier les liens afin d'inclure notre variable de requête personnalisée, nous allons utiliser le filtre get_archives_link pour modifier les liens et add_query_arg pour ajouter les variables de requête personnalisées aux nouveaux liens.

Maintenant que nous avons les nouveaux liens, si nous cliquons sur les liens à partir des pages de catégorie, vous verrez quelque chose comme ceci ajouté à votre URL sur les pages d'archive de date ?cq=21. 21 est l'ID de la catégorie sur mon site de test.

Nous devons maintenant vérifier chaque fois que nous sommes sur une page d'archive de date si la nouvelle variable quey est ajoutée à l'URL. Nous allons utiliser filter_input( INPUT_GET, 'cq', FILTER_VALIDATE_INT ); pour obtenir la valeur, la désinfecter et la valider à partir de l'URL. Si la nouvelle variable de requête est ajoutée à l'URL, nous devons ajuster notre requête principale pour renvoyer uniquement les publications de la catégorie dont l'ID est ajouté en tant que valeur à cq. pre_get_posts sera utilisé ici

Voici le code complet:

add_filter( 'query_vars', function ( $vars ) {

    $query_vars = [
        'cq'  
    ];
    $vars = array_merge( $vars, $query_vars );

    return $vars;

});


add_filter( 'get_archives_link', function ( $link_html ) {

    if( is_category() ) {

        preg_match ( "/href='(.+?)'/", $link_html, $url );

        $old_url = $url[1];
        $new_url = add_query_arg( ['cq' => get_queried_object_id()], $old_url );
        $link_html = str_replace( $old_url, $new_url, $link_html );

    }

    return $link_html;

});

add_action( 'pre_get_posts', function ( $q ) {

    $cat_id = filter_input( INPUT_GET, 'cq', FILTER_VALIDATE_INT );
    if(     !is_admin() // Target only the front end
         && $q->is_main_query() // Target only the main query
         && $q->is_date() // Only target the date archive pages
         && $cat_id // Only run the condition if we have a valid ID
    ) {

        $q->set( 'cat', $cat_id );

    }
});
2
Pieter Goosen