これは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
s
とpost__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
パラメータが正しく解釈されていないことがわかります。 terms
、term_relationships
、またはterm_taxonomy
テーブルはありません。
そして私はまたこれをすることによって既存のtax_query
(もしあれば)を単に上書きしようとしました:
$args = array(
array(
'taxonomy' => 'pa_ordering-code',
'field' => 'name',
'terms' => array($keyword),
'operator' => 'LIKE'
)
);
$query->set('tax_query', $args);
しかし、私はまだそれを機能させることができませんでした。私が悪いことをしている可能性があるものに関して何かアイデアはありますか?
0 = 1
は、用語が存在しない場合に発生します。
あなたはいくつかの用語のセットに対するクエリを作成しています。そのメインクエリにSQLを追加する前に、関連する用語のterm_idを取得するために、セカンダリクエリを最初に行います。何も見つからない場合は、代わりに0 = 1を返し、要求に一致する用語がないためメインクエリを短縮します。
"pa_ordering-code"分類法の定義を確認してください。
"query_var"属性に誤った値がある可能性があります。
このコードは同様の効果を引き起こす可能性があります。
register_taxonomy(...
'query_var' => true,
));
その場合は、query_var部分を削除(または変更)してから、もう一度確認してください。