web-dev-qa-db-ja.com

pre_get_posts $ _GET ['tax'] == allの場合、tax_queryを削除します

$wp_query->set( 'tax_query', $tax_query );を使用してフィルタリングするためにpre_get_postsを使用しています

私はおそらくnew WP_Queryを使ってこれをやるほうが賢明ですが、誰かが何かを知っているなら私はそれを聞きたくありません

例えば:

/cpt/?taxo=thisは、分類用語== thisを持つすべてのcptを表示します。

$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 );
}

次に、/cpt/?taxo=allの種類にかかわらず、すべての投稿を表示するためにtaxo->termsを追加します。

tax_queryを使って、ループから現在のpre_get_postsunsetする方法を見つけたいと思っています。

$wp_query->UNSETへの道はありますか?

$wp_query->set( 'tax_query', null );を試しました

次の攻撃計画は、andまたはoperator、あるいはその両方と連携することです。

提案は大歓迎です。誰かが興味を持っていれば、より多くのコンテキストを提供できます。ありがとうございます。

編集:ここで見つけた便利なテクニック: 主なクエリを消去し、それを置き換えます

1
admcfajn

これで解決しました! :) Hat-tip gmazzap 有用な情報: メインクエリを削除して置き換えます

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