web-dev-qa-db-fra.com

Modifier la requête dans l'action pre_get_posts est en train de bousiller mon menu de navigation

Je modifie la requête pour les pages d'archive personnalisées. J'utilise l'action pre_get_posts. Je dois attraper quelques variables GET pour modifier ma requête. Cela fonctionne très bien sur la page d’archive pour un type de publication personnalisé, mais pas pour le reste. Cela casse mes menus de navigation.

add_action( 'pre_get_posts', 'search_provider');
function search_provider($query){
if(is_post_type_archive(array('provider'))){
   $query->set( 'posts_per_page', -1 );
   $query->set( 'orderby', 'title' );
    $query->set( 'order', 'ASC' );
    if(isset($_GET['providersearch']) && $_GET['providersearch'] == 'Y'){
        if(!empty($_GET['s']))
        $query->set( 's', $_GET['s'] );
    } else {
        $query->set ('exclude', array(10054, 10068));
    }
  }
}

Dois-je effacer les variables de la requête une fois le contenu renvoyé?

1
jppower175

pre_get_posts s'exécute pour chaque requête. Cela inclut la requête principale, les requêtes secondaires et les menus. Le problème est que is_post_type_archive(array('provider')) vérifie si la requêtemainest l'archive de type publication, pas une requête spécifique passant par pre_get_posts.

Ainsi, lorsque vous vérifiez cela et que vous modifiez ensuite la requête actuelle en passant par pre_get_posts, vous allez modifier toutes les requêtes en fonction d'une condition de la requête principale.

Pour faire ce que vous voulez correctement, vous devez vérifier chaque requête dans pre_get_posts afin de vérifier que la requête particulière transmise au rappel d'action concerne l'archive de type publication. En d'autres termes, la même requête que vous définissez les arguments avec $query->set().

Vous pouvez le faire en utilisant la méthode $query->is_post_type_archive().

add_action( 'pre_get_posts', 'search_provider'); 
function search_provider( $query ) {
    if ( $query->is_post_type_archive( array( 'provider' ) ) ) {
        $query->set( 'posts_per_page', -1 );
        $query->set( 'orderby', 'title' );
        $query->set( 'order', 'ASC' );

        if ( isset( $_GET['providersearch'] ) && $_GET['providersearch'] == 'Y' ) {
            if ( ! empty( $_GET['s'] ) ) {
                $query->set( 's', $_GET['s'] );
            }
        } else {
            $query->set( 'exclude', array( 10054, 10068 ) );
        }
    }
}

Désormais, $query->set() ne définira des valeurs que si cette requête spécifique est une archive de type publication.

3
Jacob Peattie