Pre_get_postsフックを使用して、特定の(複数の)タグが適用された投稿に制限することでユーザーが検索を絞り込めるようにしています。
これは私のフックと機能です:
add_filter('pre_get_posts', array($this, 'pre_get_posts'), 0);
function pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search ) {
$query->set( 'post_type', array( 'post', 'resource', 'initiative') );
if (isset($_GET['tags'])) {
$tax_query = array(
array(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => $_GET['tags'],
'operator' => 'AND',
)
);
$tax_query = new WP_Tax_Query($tax_query);
$query->set('tax_query', $tax_query);
}
}
return $query;
}
お分かりのように、私は2つのカスタム投稿タイプを含むように検索を拡張しています。検索の結果では、カスタム投稿タイプが正しく追加され、生成されたクエリでそれらを見ることができるので、フックと関数が正しく呼び出されていることがわかります。ただし、クエリのpost_tag部分は追加されていません。
WP_Queryオブジェクトのquery_vars
要素には正しく(tax_query
)が含まれていますが、WP_Queryオブジェクトには空の独自のtax_query
が含まれており、request
内のSQLにも含まれていません。これはWP_Queryオブジェクトの(やや削除された)var_dumpです。
WP_Query Object (
[query_vars] => Array
(
[s] => ecosystem
[post_type] => Array
(
[0] => post
[1] => resource
[2] => initiative
)
[tax_query] => WP_Tax_Query Object
(
[queries] => Array
(
[0] => Array
(
[taxonomy] => post_tag
[terms] => Array
(
[0] => culture-change
[1] => peace
)
[include_children] => 1
[field] => slug
[operator] => AND
)
)
[relation] => AND
)
[search_terms_count] => 1
[search_terms] => Array
(
[0] => ecosystem
)
[search_orderby_title] => Array
(
[0] => jcgy_posts.post_title LIKE '%ecosystem%'
)
[order] => DESC
)
[tax_query] => WP_Tax_Query Object
(
[queries] => Array
(
)
[relation] => AND
)
[query] => Array
(
[s] => ecosystem
)
[request] => SELECT SQL_CALC_FOUND_ROWS DISTINCT jcgy_posts.* FROM jcgy_posts LEFT JOIN jcgy_postmeta as jcgy_postmeta on jcgy_posts.ID = jcgy_postmeta.post_id AND jcgy_postmeta.meta_key = '_EventStartDate' WHERE 1=1 AND (((jcgy_posts.post_title LIKE '%ecosystem%') OR (jcgy_posts.post_content LIKE '%ecosystem%'))) AND jcgy_posts.post_type IN ('post', 'resource', 'initiative') AND (jcgy_posts.post_status = 'publish' OR jcgy_posts.post_author = 1 AND jcgy_posts.post_status = 'private') ORDER BY jcgy_posts.post_title LIKE '%ecosystem%' DESC, post_date DESC LIMIT 0, 10
私が行ったすべての調査から、クエリへの追加を正しく構成したことがわかりましたが、明らかに何かが機能していないことがわかりました。髪を引き裂いています。何か案は?
私は物事を動かしました、私は完全にどうやってかわからないけれども。
2つの変更を加えました。「配列をTax_Queryオブジェクトに変換する」ステップを削除しました(これまでは配列を使用していなかったためだけに追加しました)。 () 方法)。
私の最後の(働く)機能は次のとおりです。
function pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search ) {
if (isset($_GET['post_types'])) {
$query->set( 'post_type', $_GET['post_types']);
} else {
$query->set( 'post_type', array( 'post', 'resource', 'initiative') );
}
if (isset($_GET['tags'])) {
$tax_query = array(
array(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => $_GET['tags'],
'operator' => 'AND',
)
);
$query->set('tax_query', $tax_query); // do I need both of these lines?
$query->tax_query = $tax_query; // let's leave them both in for safety
}
}
return $query;
}