WordPress内の検索対象にカスタムフィールドも適用する
現象
デフォルトではカスタムフィールドは検索対象には含まれません。カスタムフィールドをコンテンツとして適用している場合は検索漏れと指摘されることがあります。
プラグイン「Search Everything」などを使用すると改善できるようなのですが、検索関連のプラグインはとにかく重くてスペックの低いサーバでは使い物にならないことが言われております。
対策
コードのカスタマイズが簡単で、なおかつ、動作が軽快な方法を紹介します。
方法
以下のコードをfunctions.phpにコピペしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
//サイト内検索の設定 function filter_search($query) { if ($query->is_search() && $query->is_main_query() && !is_admin()) { // 検索に含めるもの(記事、ページ、カスタム投稿) $post_array = array('post', 'page', 'items'); // 検索に含めたくないもの(例えばお問い合わせの確認、完了画面とか) $page_ID_contact_confirm = get_page_by_path('contact/confirm')->ID; $page_ID_contact_completion = get_page_by_path('contact/completion')->ID; $not_in_array = array($page_ID_contact_confirm,$page_ID_contact_completion); $query->set('post_type', $post_array); $query->set('post__not_in', $not_in_array); } } add_filter('pre_get_posts', 'filter_search'); // 検索 function custom_search($search, $wp_query) { global $wpdb; if (!$wp_query->is_search) return $search; if (!isset($wp_query->query_vars)) return $search; $search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : ''); if (count($search_words) > 0) { $search = ''; foreach ($search_words as $word) { if (!empty($word)) { $search_word = '%' . esc_sql($word) . '%'; $search .= " AND ( {$wpdb->posts}.post_title LIKE '{$search_word}' OR {$wpdb->posts}.post_content LIKE '{$search_word}' OR {$wpdb->posts}.ID IN ( SELECT distinct r.object_id FROM {$wpdb->term_relationships} AS r INNER JOIN {$wpdb->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id WHERE t.name LIKE '{$search_word}' OR t.slug LIKE '{$search_word}' OR tt.description LIKE '{$search_word}' ) OR {$wpdb->posts}.ID IN ( SELECT distinct post_id FROM {$wpdb->postmeta} WHERE {$wpdb->postmeta}.meta_key IN ('カスタムフィールド1','カスタムフィールド2') AND meta_value LIKE '{$search_word}' ) )"; // 最初 タイトルにキーワードが含まれているかどうか // 1番目OR コンテンツにキーワードが含まれているかどうか // 2番目OR タグ、カテゴリー、タームにキーワードが含まれているかどうか // → post.ID に紐づけられている term_relationships と紐づけられている terms, term_taxonomy の terms.name, terms.slug, term_taxonomy.description に検索キーワードがあるかどうか // 3番目OR カスタムフィールドにキーワードが含まれているかどうか // → post.ID に紐づけられている postmeta の meta_key が指定のカスタムフィールドである meta_value に検索キーワードがあるかどうか } } } return $search; } add_filter('posts_search', 'custom_search', 10, 2); |
全てのカスタムフィールドを検索対象にしたい場合は、
WHERE {$wpdb->postmeta}.meta_key IN (‘カスタムフィールド1’,’カスタムフィールド2’) AND meta_value LIKE ‘{$search_word}’
を
WHERE meta_value LIKE ‘{$search_word}’
に変える。
補足
下記サイトを参考にさせていただきました。
wordpressのサイト内検索にカスタムフィールドを含める
(※ 当ページは社内技術資料としての位置付けですので読みにくいこともあるかもしれませんが、一般の方の課題解決に役立てれば幸いです。)
弊社サイトご案内
弊社ではデザイン会社様やウェブサイト制作会社様との提携・協業を随時お願いしております。