-
投稿者投稿
-
2025年5月10日 8:41 AM #145156
【お使いの Snow Monkey のバージョン】29.0.0
【お使いの Snow Monkey Blocks のバージョン】24.0.4
【お使いの Snow Monkey Editor のバージョン】11.0.1
【お使いのブラウザ】Google Chrome
【当該サイトのURL】いつも大変お世話になっております。
Snow Monkey Search を使用した検索機能において、実現したいことがあり、フォーラム内でも探したのですが解決しないので、ご質問させていただきます。
【実現したいこと】
カスタム投稿タイプ「クローゼット(スラッグ: closet)」があり、これにカスタムタクソノミー「スタイル(スラッグ: style)」が関連付けられています。「スタイル」タクソノミーには、Classic, Stylish, Vivid, REMIX, LIMITED というタームがあります。
1.検索フォームのターム表示制御:
検索フォームに表示される「スタイル」の選択肢(ラジオボタンまたはチェックボックス)から、特定のターム(例: LIMITED)を条件付きで非表示にしたい。具体的には、通常の検索ページでは LIMITED を表示せず、特定の会員専用ページでは LIMITED を表示したいと考えています。2.検索結果のフィルタリング:
上記のフォーム表示制御に加え、通常の検索結果からは、LIMITED スタイルに属する「クローゼット」投稿を完全に除外したい。会員専用ページでの検索では LIMITED も含めて検索できるようにしたいのです。【試したことと現在の状況】
1.検索フォームのターム表示制御について:
このフォーラムの過去ログを参考に、sms_taxonomy_search_terms フィルターフックを使用することで、検索フォームの「スタイル」の選択肢から「LIMITED」タームを条件付きで非表示にすることに成功しました。このフックは大変役立ちました。ありがとうございます。2.検索結果のフィルタリングについて:
次に、検索結果から「LIMITED」タームを持つ投稿を除外するため、WordPress 標準の pre_get_posts アクションフックを使用し、検索結果ページのメインクエリ ($query->is_search() && $query->is_main_query()) に対して、以下のように tax_query を設定しました。// functions.php に追加したコードの抜粋
add_action( ‘pre_get_posts’, function( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}if ( $query->is_search() /* && 通常検索であることの追加条件 */ ) {
$tax_query = $query->get( ‘tax_query’ );
if ( ! is_array( $tax_query ) ) {
$tax_query = array( ‘relation’ => ‘AND’ );
}
$tax_query[] = array(
‘taxonomy’ => ‘style’,
‘field’ => ‘slug’,
‘terms’ => ‘limited’,
‘operator’ => ‘NOT IN’,
);
$query->set( ‘tax_query’, $tax_query );
// デバッグログで $query->get(‘tax_query’) を確認
}
} );デバッグログ (debug.log) を確認したところ、上記の pre_get_posts フックは検索結果ページのメインクエリに対して正しく呼び出され、$query->get(‘tax_query’) には意図した通り「style タクソノミーの limited タームを NOT IN で除外する」条件が設定されていることが確認できました。ログの抜粋は以下の通りです。
[日付時刻] pre_get_posts is_search(): true | is_main_query(): true
[日付時刻] pre_get_posts: is_search() is true. tax_query を設定します。
[日付時刻] pre_get_posts: 設定後のtax_query: Array
(
[relation] => AND
[0] => Array
(
[taxonomy] => style
[field] => slug
[terms] => limited
[operator] => NOT IN
)
)しかしながら、この状態で検索を実行しても、実際の検索結果ページには依然として「limited」タームを持つ投稿が表示されてしまいます。
この状況から、Snow Monkey Search (あるいは Snow Monkey テーマの検索結果表示処理) が、pre_get_posts で変更されたメインクエリの結果を最終的な表示に利用していない、あるいは何らかの形でその変更を上書きしているのではないかと推測しています。つきましては、pre_get_posts でメインクエリの tax_query を変更しても Snow Monkey Search の検索結果に反映されない場合、Snow Monkey Search の検索結果から、特定の条件(例:特定のタクソノミーの特定のタームを持つ)に合致する投稿を除外するための、推奨されるフックや他のカスタマイズ方法がございましたらご教示いただけますでしょうか。
例えば、Snow Monkey Search が生成する検索結果の投稿配列($posts など)を直接フィルタリングできるフックなどはございますでしょうか。
お忙しいところ大変恐縮ですが、ご回答いただけますと幸いです。
どうぞよろしくお願いいたします。♥ 0Who liked: No user -
投稿者投稿
- このトピックに返信するにはログインが必要です。