web-dev-qa-db-fra.com

query_vars écrasant les arguments WP_Query

À la recherche de nouveaux yeux,

J'ai une archive personnalisée pour mon CPT et ses taxonomies.

La page contient un formulaire de recherche permettant de filtrer les publications du CPT, ainsi que des menus déroulants permettant de filtrer par terme.

Le problème est que lors du chargement de la page, lorsque la boucle instancie les arguments WP_Query, ils sont remplacés par get_query_vars.

Par exemple, le posts_per_page est défini sur 2. Cependant, query_vars détourne les arguments et le remplace par 12 (pour une raison quelconque, non déclaré ailleurs sur le site).

Logique ci-dessous.

$q = get_query_var( 'q' ); 


$args = array(
    'post_type'      => $post_type, 
    'post_status'    => 'publish',
    'orderby'        => 'post_date',
    'order'          => 'DESC',
    'paged'          => $paged,
    'posts_per_page' => $posts_per_page, // tried 2
    'tax_query'      => $tax_query,
    's'              => $q
);
$wp_query = new WP_Query( $args );

Forme - voir q comme valeur

 <form id="filter-form" role="search" method="get" class="" action="<?php the_permalink(); ?>">
 <!-- Query -->
<label>
<span class="screen-reader-text"><?php echo _x( 'Enter Keyword', 'label' )?></span>
<input type="search" class="search-field"
       placeholder="Keywords"
       value="<?= $q ?>"
       name="q"
       title="<?php echo esc_attr_x( 'Enter Keyword', 'label' ) ?>"/>
</label>
etc

Le filtre est enregistré et accroché dans functions.php conformément au codex.

function add_query_vars_filter( $vars ){
    $vars[] = "q";
    return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );
1
ste

Résolu avec une simple condition préalable à la configuration de la requête

if (isset($_GET['q'])) {
    $q = get_query_var( 'q' );
} else{
    // otherwise null, nothing to see here
    $q = null;
}
0
ste

Je ne pense pas que cela fasse ce que vous pensez, mais il existe une solution triviale

Utilisez le paramètre s avec un filtre pre_get_posts

Utiliser s comme nom de votre entrée vous permettra d’effectuer une recherche directe via la requête principale, ce qui accélérera le chargement de la page.

De plus, vous pouvez ensuite modifier la recherche en utilisant le filtre pre_get_posts pour ajouter les autres paramètres souhaités, par exemple.

add_filter( 'pre_get_posts', function( \WP_Query $q ) {
    if ( !$q->is_main_query() || !$q->is_search() ) {
        return;
    }
    $q->set( 'posts_per_page', 2 );
    // etc...
} );

Mais je ne veux pas utiliser search.php, j'ai un modèle différent pour cette chose en particulier

Ce serait une autre question que vous devriez poser séparément, mais heureusement, quelqu'un vous a battu:

Comment créer une recherche personnalisée pour le type de publication personnalisé?

0
Tom J Nowell