ワードプレスの管理画面の検索フォームでカスタムフィールドも検索に含める方法を解説いたします。

ワードプレスの管理画面の検索を拡張

ワードプレスの管理画面の検索は、タイトルとコンテンツのみを対象としカスタムフィールドは検索されません。
大量の投稿があり、カスタムフィールドの値からも管理画面で検索したい場合は、テーマのFunctions.phpなどにコーディングを行う必要があります。

手順1 データベースのテーブルにカスタムフィールド(メタフィールド)を結合する

まず、下記のようなコードで検索時にカスタムフィールドの値を考慮するためにテーブルを結合します。

function joinmetaFunc( $ketugou_meta_table ) {
    global $wpdb;
    if ( is_search() && is_admin() ) {    
        $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
    return $join;
}
add_filter('posts_join', 'joinmetaFunc' );

このコードはワードプレスが投稿を引き出す際にデータベースのテーブルの結合処理に割り込んで任意のテーブルを結合する処理になります。
is_search() && is_admin() で管理画面のときのみかつ検索のときのみという条件を付与しています。

手順2 カスタムフィールドも検索する

function addwhereFunc( $where, $wp_query ) {
    global $wpdb;

    if ( is_search() && is_admin() ) {
        $where .= " OR (".$wpdb->postmeta.".meta_value LIKE '%".$wp_query->get('s')."%') ";
    }
    return $where;
}
add_filter( 'posts_where', 'addwhereFunc', 10, 2 );

このコードでは、はワードプレスが投稿を引き出す際にwhere節を追加します。meta_value LIKEで検索クエリ$wp_query->get(‘s’)を検索するようにWhereを追加します。

手順3 重複を削除する

最後の上記結合テーブルで投稿が重複検索されてしまうのをDISTINCTを追加します

function deleteduplicatesFunc( $where ) {
    global $wpdb;

    if ( is_search() && is_admin() ) {
        return "DISTINCT";
    }
    return $where;
}
add_filter( 'posts_distinct', 'deleteduplicatesFunc' );

参考になりましたら幸いです。

WordPress ワードプレスの様々な検索機能の強化・カスタマイズのご依頼・ご相談はWPドクターまでお気軽にお送りください