web-dev-qa-db-fra.com

pre_get_posts Supprimer tax_query si $ _GET ['tax'] == tous

J'utilise pre_get_posts pour filtrer à l'aide de $wp_query->set( 'tax_query', $tax_query );

Je ferais probablement mieux de faire cela avec un new WP_Query, mais si quelqu'un sait quelque chose, j'adorerais l'entendre

Par exemple:

/cpt/?taxo=this affiche tous les cpt qui ont un taxo-term == this.

$taxo_terms = [];
if( !empty( $_GET['taxo'] ) ){
  $types = explode(',', $_GET['taxo']);
  foreach ($types as $key => $val) {
    $taxo_terms[$key] = sanitize_key($val);
  }
}
else{
    $taxo_terms[]='this'; // here's where things get ugly.
}

$tax_query = [];
if( !empty($taxo_terms) ){
  $tax_query[] = [
    'taxonomy' => 'taxo',
    'field' => 'slug',
    'terms' => $taxo_terms,
    'operator' => 'AND',
  ];
  $wp_query->set( 'tax_query', $tax_query );
}

Ensuite, je veux ajouter /cpt/?taxo=all pour afficher tous les articles, quel que soit le taxo->terms dont ils disposent.

J'espère trouver un moyen de unset le tax_query actuel à partir de la boucle, en utilisant pre_get_posts.

Existe-t-il un moyen de $wp_query->UNSET?

J'ai essayé $wp_query->set( 'tax_query', null );

Le prochain plan d’attaque consiste à travailler avec l’opérateur et/ou l’opérateur, ce qui peut aider.

Suggestions appréciées. Peut fournir plus de contexte si quelqu'un est intéressé. Merci!

edit: technique utile trouvée ici: Supprimer la requête principale et la remplacer

1
admcfajn

Cela a résolu le problème! :) Hat-tip gmazzap pour l'info utile: Annulez la requête principale et remplacez-la

function wpse_286813_omit_all( $query_vars ){

  // triggered also in admin pages
  if ( is_admin() )
    return $query_vars;

  if( !empty($query_vars['taxo']) && $query_vars['taxo'] === 'all' ){
    $query_vars['taxo']='';
  }
  return $query_vars;

}
add_filter( 'request', 'wpse_286813_omit_all' );
1
admcfajn