web-dev-qa-db-fra.com

Supprimer la catégorie de la requête (afficher tous les articles dans archive.php) pre_get_posts ()

J'utilise pre_get_posts() pour permettre à tous les messages d'être affichés sur toutes les catégories d'archives. En effet, je vais fournir une méthode de tri et de filtrage javascript à l'aide d'isotope.js. Toutes les pages de catégorie afficheront tous les articles, mais celles qui ne font pas partie de cette catégorie seront initialement masquées.

function show_all_cats( $query ) {
    if ( !$query->is_main_query() ){
        return;
    }
    if ( is_admin() ){
        return;
    }
    if ( $query->is_archive ) {
        $query->set('cat', ''); //here is the problem
        var_dump($query);
        return;
    }
    return;
}
add_action( 'pre_get_posts', 'show_all_cats' );

J'ai essayé de régler 'cat' à 0, null, '' et '-' . $currentcategoryid. Ils affichent tous uniquement des messages qui seraient affichés autrement (tous dans la catégorie) ou aucun.

J'ai essayé d'utiliser query_posts() qui n'a pas fonctionné non plus. On m'a aussi dit:

la manipulation des taxonomies peut nécessiter de réexécuter le traitement des méta-requêtes.

1
Bill

Désactiver la variable cat n'est probablement pas suffisant. Le hook pre_get_posts se produit après que les variables de requête ont déjà été analysées. Donc, il y a probablement une tax_query avec la taxonomie = catégorie et les termes = votre catégorie.

Vous êtes déjà en train de décharger la requête $ dans votre code, probablement pour le débogage. Alors, regardez ce que vous êtes en train de dumping. Voyez-vous le tax_query? Changez votre code pour ajuster cette requête $ pour avoir ce que vous voulez.

1
Otto

Avez-vous essayé cela?

unset( $query->query_vars['cat'] );
0
Tom J Nowell

C'est environ 4 ans plus tard, mais si quelqu'un a besoin de réponse, c'est la solution:

if ( $query->is_archive ) {
    $q->set( 'category_name', '*your-category-slug*' );
}

À votre santé

0
karlosuccess

Vous pouvez utiliser un filtre pre_get_posts() pour modifier la partie WHERE de la requête SQL:

add_filter( 'posts_where', function ( $where ) {
    $where = preg_replace("regex pattern", "", $where);
        return $where;
    }, 10, 2 );

C'est un peu la solution de piratage mais devrait fonctionner.

0
user9909