質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

1回答

2188閲覧

WP投稿一覧に特定のカスタムフィールドに値のあるカスタム投稿を混ぜて表示できるか?

marlboro_tata

総合スコア525

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2019/05/08 02:11

前提・実現したいこと

Wordpressのサイトでトップページに「投稿の一覧(ページング付き)」を表示しています。
(設定>表示設定>ホームページの表示 に 「最新の投稿」 を選んでいる状態です)

投稿とは別に、カスタム投稿タイプ 'books' を作っています。

トップページに、投稿の一覧と、カスタム投稿 'books' の記事を混ぜて表示したいです。
ただし、カスタム投稿 'books' の記事は、カスタムフィールドで「トップページに表示するかどうか(keyは'is_show')」のチェックボックスがあり、これが true になっている記事のみ、表示したいです。

現状は、functions.php に pre_get_posts で、下記のような諸条件を書いています。

該当のソースコード

PHP

1 2//functions.php 3function pre_get_posts_custom( $query ) { 4 if( is_admin() || ! $query->is_main_query() ){ 5 return; 6 } 7 8 if( $query->is_home() ){ 9 $query->set( 'post_type', array( 'books','post' ) ); 10 $meta_query = array( 11 array( 12 'key' => 'is_show', 13 'value' => true, 14 'compare' => '=' 15 ) 16 ); 17 $query->set( 'meta_query', $meta_query ); 18 } 19 20} 21add_action( 'pre_get_posts', 'pre_get_posts_custom' ); 22

PHP

1 2//home.php 3//ループ部分のみ抜粋、twentynineteenのデフォルトほぼそのままです 4 5if ( have_posts() ) { 6 while ( have_posts() ) { 7 the_post(); 8 get_template_part( 'template-parts/content/content' ); 9 } 10 twentynineteen_the_posts_navigation(); 11} 12 13

発生している問題

上記コードを書いた結果、トップページには、カスタム投稿'books'で、カスタムフィールドの key:'is_show' がtrueになっている記事しか表示されません。
これはエラーではなく、仕様だと認識しています。
投稿には、カスタムフィールド'is_show'は存在しておらず、該当する記事がないため、この結果にならざるを得ません。

この場合、投稿(post)にも同じようにカスタムフィールドを設定し、true値を設定すれば表示されるのはわかっているのですが、可能ならそれをしないで実現したいです。

知りたいこと

おそらく、pre_get_posts では無理筋なのは薄ぼんやり予感していますが、確信が持てません。望みなしであればそのようにご指摘が欲しいです。
また、この方法ならできそう、というものがあれば、具体的なコードなどは求めませんので、概念レベルで示唆をいただけましたら大変ありがたく思います。
どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

上記コードを書いた結果、トップページには、カスタム投稿'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 を使うことになりますが、下記のような方法で対処することは可能です。

or

投稿2019/05/08 06:37

編集2019/05/08 06:38
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marlboro_tata

2019/05/08 08:16

丁寧な回答をありがとうございます。pre_get_posts ではやはりダメなのですね・・・。 参考に上げてくださったものを確認してみます。まずは御礼まで。
marlboro_tata

2019/05/10 05:47

せっかくお教えいただきましたが、私には高度なテクニックだったようで、現時点では内容が理解できませんでした。もしいつか読み解けたら改めてコードに起こしたいと思います。 今のところ、質問でも書いていた通り「投稿(post)にも同じようにカスタムフィールドを設定し、true値を設定」することで対応しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問