質問: array( array( 'key' => 'is_show', 'value' => true, 'compare' => '=' ) ); $query->set( 'meta_query', $meta_query ); } } add_action( 'pre_get_posts', 'pre_get_posts_custom' ); ``` ``` //home.php //ループ部分のみ抜粋、twentynineteenのデフォルトほぼそのままです if ( have_posts() ) { while ( have_posts() ) { the_post(); get_template_part( 'template-parts/content/content' ); } twentynineteen_the_posts_navigation(); } ``` ### 発生している問題 上記コードを書いた結果、トップページには、カスタム投稿'books'で、カスタムフィールドの key:'is_show' がtrueになっている記事**しか**表示されません。 これはエラーではなく、仕様だと認識しています。 投稿には、カスタムフィールド'is_show'は存在しておらず、該当する記事がないため、この結果にならざるを得ません。 この場合、投稿(post)にも同じようにカスタムフィールドを設定し、true値を設定すれば表示されるのはわかっているのですが、可能ならそれをしないで実現したいです。 ### 知りたいこと おそらく、pre_get_posts では無理筋なのは薄ぼんやり予感していますが、確信が持てません。望みなしであればそのようにご指摘が欲しいです。 また、この方法ならできそう、というものがあれば、具体的なコードなどは求めませんので、概念レベルで示唆をいただけましたら大変ありがたく思います。 どうぞよろしくお願いいたします。
回答: > > 上記コードを書いた結果、トップページには、カスタム投稿'books'で、カスタムフィールドの key:'is_show' がtrueになっている記事しか表示されません。 > > > WP_Query(pre_get_posts) や get_posts の場合、複数の検索条件は、基本的に `AND` で接続されるので、 `( 'post_type' = 'books' and 'is_show' = true ) or ( post_type = 'post' )` のような組み合わせ検索はできません。 > > また、この方法ならできそう、というものがあれば、具体的なコードなどは求めませんので、概念レベルで示唆をいただけましたら大変ありがたく思います。 > > > 代替案としては、SQL を使うことになりますが、下記のような方法で対処することは可能です。 * WP_Query フィルターフック ( posts_join, posts_where, posts_request 等 ) を用いて、WP_Query で実行される SQL を書き換える。 ( カスタムクエリ 参照 ) or * wpdb_Class を使用して、SQL で検索。 ( Displaying Posts Using a Custom Select Query 参照)