web-dev-qa-db-fra.com

Empêcher le filtre pre_get_posts sur un type de publication spécifique

Je rencontre un problème avec pre_get_post filter.

En fait, j'ai 4 types de post. Publier, Pages, Événements et Lieu. J'ai créé un champ personnalisé appelé city pour le type de message d'événement et de lieu.

Lors de la création d'un champ personnalisé, j'ai une option pour sélectionner le type de publication sur lequel je souhaite afficher ce champ personnalisé.

Maintenant, sur la partie frontale, j’ai ajouté un filtre sur pre_get_posts et modifié la requête principale pour obtenir tous les messages de la ville en question.

Tout fonctionne parfaitement pour les événements, la liste des sites et une page mais ce filtre s’applique également aux articles et aux pages.

Ce que je veux, c'est: ** Je veux supprimer le filtre this du type de publication qui n'est pas inclus dans ce champ personnalisé.

J'ai essayé avec $ wp_query-> query_vars ['page_id'] ce code mais il ne fonctionne plus.

Quelqu'un peut-il m'aider à résoudre ce problème?

FYI: Mon code ressemble à,

add_action( 'pre_get_posts', 'citywise_post_filter' );
function citywise_post_filter($query) {
    global $wp_query;
    if( isset( $_REQUEST['city_filter'] ) ){
        $city = $_REQUEST['city_filter'];
    }else{
        $city = $_SESSION['CURR_CITY'];
    }
    if ( !is_admin() ){
        $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
        $query->set( 'meta_value', $city );
        return;
    }
}

Merci Aezaz

4
Shaikh Aezaz

Améliorez votre condition pour inclure une vérification du type de message interrogé. Cela peut être fait via WP_Query::get method

Alors, où vous avez

if ( !is_admin() ){
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
} 

remplacer par

if ( ! is_admin() && in_array ( $query->get('post_type'), array('event','venue') ) ) {
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
}

Notez également qu'en utilisant ce code, comme @offroff noté dans sa réponse, le filtre s'appliquera à toutes les requêtes, celles que vous avez déclenchées en visitant une page (requête principale) et celles déclenchées via le code, à l'aide de new WP_Query ($args) (requêtes secondaires).

Pour que le filtre de code n'affecte pas les requêtes secondaires, ajoutez une vérification pour $query->is_main_query(), afin que le code devienne:

if ( is_admin() || ! $query->is_main_query() ) return;

if ( in_array ( $query->get('post_type'), array('event','venue') ) ) {
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
}
12
gmazzap

Wordpress a une bonne page sur balises conditionnelles

En plus de !is_admin(), vous voudrez peut-être faire && $query->is_main_query()

Dans la partie supérieure de votre fonction, vous pouvez utiliser if(is_single() || is_page()) {return;} si vous ne souhaitez pas que le filtre s'applique à ces pages.

Les autres conditions que vous pourriez utiliser sont is_post_type_archive('event') && is_post_type_archive('venue')

Edit: Je ne suis pas sûr de comprendre votre problème, mais je me suis dit que cela pourrait vous aider:

$query->set('post_type',array('event','venue'));
3
offroff