プラグインなし!Wordpress管理画面の投稿一覧からワード検索でカスタムフィールドを含める方法


どうも7noteです。プラグインなし。コピペのみでカスタムフィールドも含めた文字検索できます!

実践でとても助かったので忘れないように記事にまとめます。
ちょっとニッチな内容ですが、大量の記事を管理しているブログなどのWordpressでは重宝するかもしれません。

カスタムフィールドも検索範囲に含める方法

以下をfunctions.phpに追記するだけ。

functions.php
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');

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');

function cf_search_distinct($where) {
    global $wpdb;
    if (is_search()) {
        return "DISTINCT";
    }
    return $where;
}
add_filter('posts_distinct', 'cf_search_distinct');

解説

正直私もコピペで使っただけなので詳しい説明はできないのですが、元の参考にした記事をみたところ、

①データベースにあるpostsのテーブルとpostmetaのテーブルを外部結合
②検索クエリを変更し、カスタムフィールドを含める
③重複を防ぐ

という処理を行なっているようです。

デメリット・注意点

※get_template_part など、投稿内容以外のテキストも全て検索対象になる
※管理画面での記事一覧検索にも反映される

まとめ

大量の記事を見直したり、書き直したり、専用に作っていたカスタム投稿タイプの情報見直しを行なうのに
便利でした。
管理画面の検索だけではなく、サイト上の検索窓も同様の効果がつくので、全ての情報から検索が可能になります。

おそまつ!

~ Qiitaで毎日投稿中!! ~
【初心者向け】WEB制作のちょいテク詰め合わせ

参考:
https://keitahirai.net/archives/896
https://adambalee.com/search-wordpress-by-custom-fields-without-a-plugin/