WordPressでは、カスタムフィールドを使って投稿に独自の情報(価格・会社名・商品コードなど)を追加できますが、その値が空の投稿を一覧に表示させたくないというニーズはよくあります。
たとえば、価格情報が未入力の商品や、会社名が未設定の投稿などは、表示対象から除外してユーザーに未完成の投稿を見せないようにしたい場合です。
この記事では、指定したカスタムフィールドが空の投稿を一覧表示から除外する方法を紹介します。functions.php にコードを追加するだけで簡単に実装できます。
実装方法 pre_get_posts フィルターを使う
以下のコードを functions.php に追加してください。
例:price というカスタムフィールドが空の投稿を非表示にする
function exclude_empty_custom_field_posts($query) {
if (!is_admin() && $query->is_main_query() && (is_home() || is_archive() || is_search())) {
$meta_query = array(
array(
'key' => 'price', // カスタムフィールド名
'value' => '',
'compare' => '!=',
),
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'exclude_empty_custom_field_posts');
コードの解説
- !is_admin():管理画面では処理を適用しない
- $query->is_main_query():メインクエリ(一覧表示の本体)にのみ適用
- is_home() || is_archive() || is_search():トップページ・アーカイブ・検索結果に限定(必要に応じて調整可)
- ‘compare’ => ‘!=’ と ‘value’ => ”:空でない値を持つ投稿だけを対象とする
カスタム投稿タイプにも適用したい場合
たとえば product というカスタム投稿タイプに限定したい場合は、is_post_type_archive(‘product’) を追加します。
if (!is_admin() && $query->is_main_query() && is_post_type_archive('product')) {
// カスタム投稿タイプ product 用の処理
}
複数フィールドで判定したい場合
meta_query を配列で拡張すれば、複数のカスタムフィールドを条件に含めることも可能です。
$meta_query = array(
'relation' => 'AND',
array(
'key' => 'price',
'value' => '',
'compare' => '!=',
),
array(
'key' => 'company_name',
'value' => '',
'compare' => '!=',
),
);
注意点
- フィールドに 空白やスペースが入っていても「空ではない」と判断される可能性があるため、入力ルールは明確にしましょう。
- ACFなどのプラグインを使っている場合でも、get_post_meta() ベースで保存されていればこの方法で動作します。
- 投稿の保存処理時に空チェックを加えて公開を制限する方法もありますが、今回は表示面に絞った制御です。
よくある質問(FAQ)
Q. カスタムフィールドの値が特定の状態の記事を一覧から除外するには?
A. pre_get_postsフックでmeta_queryを使い、除外条件を設定します。例えばhide_post=’1’のメタを持つ記事を除外するにはcompare=’!=’またはNOT EXISTSを組み合わせます。
Q. 管理画面の記事一覧でも除外したい場合はどうすればいいですか?
A. pre_get_postsのis_admin()条件も追加して管理画面のメインクエリも修正します。ただし一部の管理者には見えるようにしたい場合はcurrent_user_can()でロールチェックを追加します。
Q. 非表示フラグをカスタムフィールドで管理するより良い方法はありますか?
A. WordPressのpost_statusを利用する方法があります。register_post_status()でカスタムステータスを追加し、’hidden’等のステータスで管理する方が標準的なWordPressの仕組みに沿っています。
まとめ
特定のカスタムフィールドが空の投稿を一覧に非表示にすることで、未完成の記事や不完全なデータをユーザーに見せず、サイトの品質を保つことができます。pre_get_posts フィルターを活用すれば、柔軟に表示制御が可能です。

