WordPress 管理画面の記事検索でカスタムフィールドを検索対象に含める方法
最終更新日 - 公開日 2025.06.25
by
WordPress で管理画面の記事検索でカスタムフィールドを検索対象に含める方法を紹介します。
記事内容がカスタムフィールドで構成されているサイトに便利なカスタマイズです。
管理画面の記事検索でカスタムフィールドを検索対象に含める方法
管理画面の記事検索でカスタムフィールドを検索対象に含める方法を紹介します。
次のコードを function.php に追加します。
/*【管理画面専用】投稿一覧でカスタムフィールドを検索対象に含める */
// JOIN に postmeta を追加
function admin_cf_search_join($join) {
global $wpdb;
if (is_admin() && isset($_GET['s']) && strpos($join, $wpdb->postmeta) === false) {
$join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
}
return $join;
}
add_filter('posts_join', 'admin_cf_search_join');
// WHERE に meta_value の検索条件とリビジョン除外、post_type制限を追加
function admin_cf_search_where($where) {
global $wpdb;
// 管理画面 & 検索時のみ適用
if (is_admin() && isset($_GET['s'])) {
$search = $_GET['s'];
$post_type = $_GET['post_type'] ?? 'post';
if (!empty($search)) {
$like = '%' . $wpdb->esc_like($search) . '%';
$where .= $wpdb->prepare(" OR $wpdb->postmeta.meta_value LIKE %s", $like);
}
// 指定の投稿タイプに限定(post_type が指定されていれば)
if (!empty($post_type)) {
$where .= $wpdb->prepare(" AND $wpdb->posts.post_type = %s", $post_type);
}
// リビジョンは除外
$where .= " AND $wpdb->posts.post_type != 'revision'";
}
return $where;
}
add_filter('posts_where', 'admin_cf_search_where');
// 重複投稿を防ぐために DISTINCT を追加
function admin_cf_search_distinct($distinct) {
if (is_admin() && isset($_GET['s'])) {
return "DISTINCT";
}
return $distinct;
}
add_filter('posts_distinct', 'admin_cf_search_distinct');
個々のリビジョンを独立した検索対象にすることもできますが、紹介しているコードではリビジョンを除外しています。
まとめ
WordPress 管理画面の記事検索でカスタムフィールドを検索対象に含める方法を紹介しました。