web-dev-qa-db-ja.com

Tax_queryを使用すると、$ wp_query-> requestに1 =または1 = 1が作成されます。

これはpre_get_postsアクション/フィルタを使用してメインクエリを修正する私の最初の試みです。

これは現在それにフックされている関数です:

function advanced_product_search_filter($query)
{
  if(!is_admin() &&
     is_main_query() && 
     is_search() && $query->query_vars['post_type'] == 'product')
  {
    $keyword = $_GET['s'];

    if($_GET['exactly'])
      $keyword = $_GET['s'] . ' "'. $_GET['exactly'] . '"';

    if($_GET['without'])
    {
      $excluded = exclude_product_keyword_search($_GET['without'], 
                    $_GET['pname'],
                    $_GET['pcode']
                  );
      $query->set('post__not_in', $excluded);
    }

    if($_GET['pname'])
      $query->set('s', $keyword);
    else
      $query->set('s', '');

    if($_GET['pcode'])
    {
      $tax_queries = $query->get('tax_query');
      $tax_queries[] = array(
        array(
          'taxonomy' => 'pa_ordering-code',
          'field' => 'name',
          'terms' => array($keyword),
          'operator' => 'LIKE'
        )
      );
      $query->set('tax_query', $tax_queries);
    }
  }
}

これはWooCommerceインストールの上に構築されたプラグインです。したがって、基本的にこの関数は標準検索(titleおよびcontent)またはOrdering Codeというカスタム属性での属性検索によるWooCommerce製品の検索をサポートするよう試みますpa_ordering-codeテーブルのterm_taxonomy

spost__not_in varsは問題なく変更できますが、tax_query itを使おうとすると、クエリが壊れるようです。

あなたがアイデアを与えるために、私がこれを試すとき:

?s=foo&post_type=product&pname=1&pcode=1&without=non&exactly=foo+bar

WHERE節をダンプすると、これがわかります。

AND wp_posts.ID NOT IN (219) 
AND 0 = 1 
AND 
(
  (
    (wp_posts.post_title LIKE '%foo%') OR 
    (wp_posts.post_content LIKE '%foo%')
  ) AND (
    (wp_posts.post_title LIKE '%foo bar%') OR 
    (wp_posts.post_content LIKE '%foo bar%')
  )
) 
AND wp_posts.post_type = 'product' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
AND
( 
  (
    wp_postmeta.meta_key = '_visibility' AND
    CAST(wp_postmeta.meta_value AS CHAR) IN ('visible','search')
  ) 
)

AND 0 = 1に注意してください。 JOIN句をダンプすると、そこにあるのはpostmetaテーブルだけなので、tax_queryパラメータが正しく解釈されていないことがわかります。 termsterm_relationships、またはterm_taxonomyテーブルはありません。

そして私はまたこれをすることによって既存のtax_query(もしあれば)を単に上書きしようとしました:

$args = array(
  array(
    'taxonomy' => 'pa_ordering-code',
    'field' => 'name',
    'terms' => array($keyword),
    'operator' => 'LIKE'
  )
);
$query->set('tax_query', $args);

しかし、私はまだそれを機能させることができませんでした。私が悪いことをしている可能性があるものに関して何かアイデアはありますか?

3
Rolando Cruz

0 = 1は、用語が存在しない場合に発生します。

あなたはいくつかの用語のセットに対するクエリを作成しています。そのメインクエリにSQLを追加する前に、関連する用語のterm_idを取得するために、セカンダリクエリを最初に行います。何も見つからない場合は、代わりに0 = 1を返し、要求に一致する用語がないためメインクエリを短縮します。

5
Otto

"pa_ordering-code"分類法の定義を確認してください。

"query_var"属性に誤った値がある可能性があります。

このコードは同様の効果を引き起こす可能性があります。

    register_taxonomy(...
        'query_var' => true,
    ));

その場合は、query_var部分を削除(または変更)してから、もう一度確認してください。

0