カスタムフィールドが無限に増えてもプラグインなしで検索対象にする
下記メリットがある。
- WordPressのデフォルト検索フォームを加工する必要なし
- 作成済み、またはこれから作成する全てのカスタムフィールドが対象
- Advanced Custom Fields などプラグインで作成したカスタムフィールドも対象
- プラグイン不使用なので検索結果の表示速度が若干上がる
デメリットもあり。
- get_template_part など、投稿内容以外のテキストも全て検索対象になる
- 管理画面での記事一覧検索にも反映される
大した問題じゃない。
※「このフィールドは含めたくない」などのカスタマイズはご自分でどうぞ。
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 | /** * Extend WordPress search to include custom fields * http://adambalee.com */ /** * Join posts and postmeta tables * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join */ function cf_search_join($join) { global $wpdb; if (is_search()) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id '; } return $join; } add_filter('posts_join', 'cf_search_join'); /** * Modify the search query with posts_where * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where */ function cf_search_where($where) { global $wpdb; if (is_search()) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where); } return $where; } add_filter('posts_where', 'cf_search_where'); /** * Prevent duplicates * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct */ function cf_search_distinct($where) { global $wpdb; if (is_search()) { return "DISTINCT"; } return $where; } add_filter('posts_distinct', 'cf_search_distinct'); |
このコードを作成した方は、WorePress公式サイトを参考にしたらしい。
posts join なんてフィルターは初めて知った。
カスタムフィールドを検索対象にするプラグインのダメなとこ
- Search Everything
- 重くて使い物にならない
- 低スペックの共用サーバーならリソースオーバー間違い無し
- Custom Fields Search by BestWebSoft
- 同系プラグインの中ではおそらく一番軽い
- が、検索対象にできるカスタムフィールド数に上限がある
- ゴミ箱から削除したカスタムフィールドも管理画面に表示されるため、高確率でスパゲッティになる
3コメント
初めまして。hiroakiと申します。
当ブログ記事を読ませていただき、WordPressの検索周りでぶち当たった壁に少しだけ光が差したところでした。
「カスタムフィールドが無限に増えてもプラグインなしで検索対象にする」の記事で、実はどうしても特定のカスタムフィールドの値のみ除外するという部分の実装ができず困っております。
もしご迷惑でなければ何かヒントとなる部分でも教えていただく事は可能でしょうか。
お礼とか現状では何もできないので勝手を言っているのは百も承知なのですが…
お忙しいところを恐縮ですが、何卒よろしくお願いいたします。
hiroakiさん初めまして。
コメント頂きありがとうございました。
正解のコードはこれだよ!と提示して差し上げたいところですが、ゆっくり考えている余裕がありません。
申し訳ないです。
ヒントになるか何とも言えないのですが、
get post meta
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_post_meta
カスタムフィールドを使ったさらに高度なテクニック
https://wpdocs.osdn.jp/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9#.E3.82.AB.E3.82.B9.E3.82.BF.E3.83.A0.E3.83.95.E3.82.A3.E3.83.BC.E3.83.AB.E3.83.89.E3.82.92.E4.BD.BF.E3.81.A3.E3.81.9F.E3.81.95.E3.82.89.E3.81.AB.E9.AB.98.E5.BA.A6.E3.81.AA.E3.83.86.E3.82.AF.E3.83.8B.E3.83.83.E3.82.AF
でカスタムフィールドのメタデータを取得し、
$custom_field = get_post_meta();
if (! $custom_field) {}
みたいな条件分岐除外を追加して出来ないだろうかと考えました。
[…] コードは鼻ちょうちんさんの「カスタムフィールドが無限に増えてもプラグインなしで検索対象にする」の内容を引用させていただきました。 keitahirai.netカスタムフィールドが無限に増えてもプラグインなしで検索対象にするhttps://keitahirai.net/archives/896下記メリットがある。 WordPressのデフォルト検索フォームを加工する必要なし 作成済み、またはこれから作成する全てのカスタムフィールドが対象 Advanced Custom Fields […]