前提・実現したいこと
wordpressにて、search and filter proを使用しています。
その中のSearchのフィールドを使用して検索欄を出力しました。
その検索欄で検索をかけると、カスタムフィールド内の情報からの検索が出来ていないことがわかりました。
カスタムフィールド内を検索対象にした、検索欄が作りたいです。
発生している問題・エラーメッセージ
カスタムフィールド内の情報が検索対象になっていない
試したこと1
search everythingを導入しました。
同プラグイン内の検索欄からはカスタムフィールドが検索対象になっていました。
故に、search and filter proにおいてカスタムフィールドが検索対象から除外されているのかと思っています。
試したこと2
下記コードをfunctionに入れましたが、効果はありませんでした。
(なぜ動作しなかったかは不明です…)
php
1 2/** 3 * 参考 http://wpcj.net/1363 4 */ 5function posts_search_custom_fields( $orig_search, $query ) { 6 if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) { 7 // 4.4のWP_Query::parse_search()の処理を流用。(検索語の分割処理などはすでにquery_vars上にセット済のため省く) 8 global $wpdb; 9 $q = $query->query_vars; 10 $n = ! empty( $q['exact'] ) ? '' : '%'; 11 $searchand = ''; 12 if($q['search_terms']) { 13 foreach ( $q['search_terms'] as $term ) { 14 $like_op = 'LIKE'; 15 $andor_op = 'OR'; 16 $like = $n . $wpdb->esc_like( $term ) . $n; 17 // カスタムフィールド用の検索条件を追加 18 // COLLATE utf8_unicode_ciでカスタムフィールドを「ひらがな」と「カタカナ」、「全角英数」と「半角英数」を区別しないでマッチさせる 19 $search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s) $andor_op (custom.meta_value COLLATE utf8_unicode_ci $like_op %s))", $like, $like, $like ); 20 $searchand = ' AND '; 21 } 22 } 23 if ( ! empty( $search ) ) { 24 $search = " AND ({$search}) "; 25 if ( ! is_user_logged_in() ) 26 $search .= " AND ($wpdb->posts.post_password = '') "; 27 } 28 return $search; 29 } 30 else { 31 return $orig_search; 32 } 33} 34add_filter( 'posts_search', 'posts_search_custom_fields', 10, 2 ); 35 36/** 37 * カスタムフィールド検索用のJOIN 38 */ 39function posts_join_custom_fields( $join, $query ) { 40 if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) { 41 // group_concat()したmeta_valueをJOINすることでレコードの重複を除きつつ検索しやすくする 42 global $wpdb; 43 $join .= " INNER JOIN ( "; 44 $join .= " SELECT post_id, group_concat( meta_value separator ' ') AS meta_value FROM $wpdb->postmeta "; 45 // $join .= " WHERE meta_key IN ( 'test' ) "; 46 $join .= " GROUP BY post_id "; 47 $join .= " ) AS custom ON ($wpdb->posts.ID = custom.post_id) "; 48 } 49 return $join; 50} 51add_filter( 'posts_join', 'posts_join_custom_fields', 10, 2 );
###最後に
検索が重要視されるコンテンツを作成しているので、ぜひご回答いただければ幸いです。
よろしくお願いします!
回答1件
あなたの回答
tips
プレビュー