どうも、久々の記事更新になります。私情(引っ越し、フリーランスの仕事)によりしばらく記事を書く時間がとれずにいました。ちなみにバンクーバーに来て引っ越しは5回目になります。荷物がそんなに多くないのと引っ越す先も比較的近場なためタクシーだけで引っ越しできてしまいます。なんて便利な街。
話は戻りますが、仕事でやっていた案件ですがセレクトボックスが変更されたらその値(カスタムフィールドの値です)をJSでURL書き換えして検索結果を表示するということをやっていた時に少しスタックしたので共有いたします。もしかしたらこの方法じゃなくて他のやりやすい方法があったのかもしれませんができたので良しとします。
状況
商品一覧ページでのセレクトボックスを使用しての検索機能。セレクトボックスには各カスタムフィールドの値を選べるようにしていました。
セレクトボックスが変更されたらjQueryで検知⇨その値でURLを書き換え⇨URLからその値を取得して検索結果を表示する
という流れで商品検索を実装していました。そこで検索結果を表示した際にヘッダー・フッターで表示していたカスタムメニューが消えていることに気づきました。
原因
カスタムフィールドの値で検索をするためにpre_get_postsにフックを使用し変更を加えていました。カスタムメニューも内部では一つのカスタム投稿として扱われているらしく、pre_get_postsにカスタムフィールドの値を追加したクエリではメニューのデータが正常に取得できなくなっていたというわけでした。ただ単にpre_get_postsに関する自分の理解不足でした。。。
・pre_get_posts
WordPressがクエリを取得する前に必ず実行されるフィルターフック。
対策
カスタムメニューに影響が出て欲しくないため、商品検索時のみフックが有効になるようis_main_queryを使用し変更。
add_action('pre_get_posts', 'my_pre_get_posts', 10, 1); function my_pre_get_posts( $query ) { if( is_admin() ) { return; } if($query->is_main_query()){ $meta_query = $query->get('meta_query'); foreach( $GLOBALS['my_query_filters'] as $key => $name ) { if(empty($_GET[$name])){ continue; } if(isset($_GET[$GLOBALS['my_query_filters'][$name]])){ $meta_query[] = array( 'key' => $GLOBALS['my_query_filters'][$name], 'value' => $_GET[$GLOBALS['my_query_filters'][$name]], 'compare' => 'LIKE' ); } } $query->set('meta_query',$meta_query); } return; }