web-dev-qa-db-fra.com

Un filtre de recherche personnalisé provoque des problèmes de menu et de query_posts

J'utilise un filtre de recherche personnalisé (à l'aide de ma requête personnalisée var type), comme suit:

function fteh_pre_get_posts( $query ){
    if( isset( $query->query_vars['type'] ) )
        $types = explode( ',', $query->query_vars['type'] );
        $query->set( 'post_type', $types );

    return $query;
}

if ( ! is_admin() ) {
     add_action( 'pre_get_posts', 'fteh_pre_get_posts' );
}

J'ai remarqué que cela faisait disparaître un menu personnalisé enregistré.

Sans la !is_admin(), le constructeur de menus a également été dérouté (certains messages ont été affichés au lieu de toutes mes pages dans la section Pages). L'ajout de la condition a aidé avec cela, mais je ne peux pas comprendre comment ramener mon menu.

Il est correctement enregistré et appelé, construit et enregistré dans l'emplacement de thème approprié et fonctionne avant d'ajouter ce filtre. Maintenant, il utilise simplement le fallback_cb (dans mon cas, le wp_page_menu par défaut) au lieu de mon menu personnalisé.

Dès que je supprime cette action de pre_get_posts, tout est revenu à la normale.

Je ne vois pas en quoi le crochet pre_get_posts est lié aux menus personnalisés. Quelqu'un sait-il pourquoi cela provoquerait un comportement aussi étrange?

METTRE À JOUR:

J'ai maintenant découvert un autre problème causé spécifiquement par l'extrait de code ci-dessus: toutes mes requêtes personnalisées sur des pages (des éléments simples tels que query_posts('post_type=organization')) ne fonctionnaient plus et affichaient des publications normales au lieu des types de publication personnalisés configurés dans query_posts.

5
Justine

Utilisez is_main_query() pour modifier uniquement la requête principale afin que le menu reste non affecté.

Essayez ceci:

add_action( 'pre_get_posts', 'fteh_pre_get_posts' );

    function fteh_pre_get_posts( $query ){
        if( !is_admin() && $query->is_main_query() && isset( $query->query_vars['type'] ) )
            $types = explode( ',', $query->query_vars['type'] );
            $query->set( 'post_type', $types );

        return $query;
    }
12
Sisir

Je suis peut-être un peu en retard à la fête, mais c’est ce que j’ai fait pour résoudre le problème de disparition du menu lorsque je visionnais des publications personnalisées par catégorie. J'utilise des catégories de messages par défaut et non des taxonomies personnalisées.

public function include_custom_post_search( $query ) {
        if( ! is_admin() ) {

            if( is_category() && 'nav_menu_item' !== $query->get('post_type') )
                $query->set( 'post_type', 'custom_post_place_slug' );
        }
    }

    add_action( 'pre_get_posts', 'include_custom_post_search' );
0
Andrew Schultz