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
です。したがって、基本的に、この関数は、標準検索 (タイトルとコンテンツ) またはテーブル内にあるカスタム属性での属性検索のいずれかによる製品の検索をサポートしようとします。WooCommerce
Ordering Code
pa_ordering-code
term_taxonomy
コードの他の部分は正常に動作し、varss
とpost__not_in
vars を問題なく変更できますが、それを使用しようとするtax_query
と、クエリが壊れているように見えます。
あなたにアイデアを与えるために、私がこれを試すとき:
?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
句をダンプすると、そこにテーブルtax_query
しか表示されないため、パラメーターが適切に解釈されていないことがわかります。postmeta
いいえ、、、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);
しかし、私はまだそれを機能させることができませんでした。私が間違っているかもしれないことについてのアイデアはありますか?