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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

530閲覧

WordpressのWP_Queryで、「投稿者」OR「カスタムフィールドの値」で指定する

benijake

総合スコア15

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/04/08 22:08

WordpressのWP_Queryに関する質問をさせてください。

この条件いずれかに合致する記事を拾いたいです。

条件その1
投稿者が自分であること。

条件その2
カスタムフィールド「permitted_id」の値に自分のIDが含まれていること。

WP_Queryの書き方をいくつか見たのですが、上のいずれかをORとする書き方が見つからず、やむを得ず質問させて頂いた状況です。

具体的なコードで言えば下記のようになるかと思いますが、「条件その1」と「条件その2」をORでつなぐ方法がわかりません。

php

1$args = array( 2 'paged' => $paged, 3 'post_type' => 'type1', 4 'posts_per_page' => 20, 5 6 // 条件その1 7 'meta_key' => 'permitted_id', 8 'meta_value' => get_current_user_id(), 9 10 // 条件その2 11 'author' => get_current_user_id(), 12 13); 14 15$the_query = new WP_Query($args); 16if ($the_query->have_posts()) : 17 while ($the_query->have_posts()) : $the_query->the_post(); 18 the_title(); 19 endwhile; 20endif;

なお、「permitted_id」にはユーザーIDがカンマ区切りで1つ以上入っています。

わかる人がいたら教えてください。宜しくお願い致します!

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

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

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

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

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

guest

回答3

0

ベストアンサー

通常meta_query同士はorにできるけど、meta_queryとそれ以外はorにできないです
wpdbでSQLを自前で書くかposts_where_requestでSQLを改変するとかすればできないことはないけど
まあ「条件1に合致する群に、条件1に合致せず条件2に合致する群を結合」
みたいな感じに2回に分ける方が簡単です


丸ごとコードはアレなんで部品だけ

使うのは
get_posts
setup_postdata
array_merge
あたり

あと
wp_reset_postdata

それ以外の素材は質問文のコードの中にあるかと思います

投稿2019/04/09 10:51

編集2019/04/09 15:03
KazuhiroHatano

総合スコア7804

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

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

benijake

2019/04/09 13:58

>meta_queryとそれ以外はorにできない それは厄介ですね。となると思ったのは、カスタムフィールドに「author」を自前で作って、「permitted_id」とORで探す、などはいかがでしょうか? >条件1に合致する群に、条件1に合致せず条件2に合致する群を結合 これ、コードまるごと教えていただけませんでしょうか?自分でこれは100%できないです。もしお時間ございましたらどうかお助けください。
benijake

2019/04/10 00:16 編集

部品でもうれしいです。挑戦してみます。 ただ疑問に思うのがページ指定の方法です。つまりそれぞれのループで'posts_per_page'が'10'だった場合、記事の残り件数によっては別々の件数となり、ページ番号も別々になるために、ページ指定がうまくいかないと思うのですが。そのあたりの方法はいかがですか? ひょっとしてページネーションは自前で作らないといけないでしょうか? それぞれのループで全件取得し、その2つをarray_mergeして配列を作り、その配列の中から実際に表示する範囲を指定して表示するという方法ですか? たとえば、自前で作ったページネーションの番号を受け取り、それが2だった場合、11件目から20件目を表示する。のように?
KazuhiroHatano

2019/04/10 01:16

ページネーションをつけたいとか、メインクエリでやりたい場合はposts_where_requestでSQLを上書きかな 一応get_postsで取得して結合したpostsのIDだけとってposts__inで使うのが簡単だけど、3回もDBにクエリ投げることになるのはちょっと冗長すぎるかもしれないです あまりパフォーマンスとか気にする必要がないならget_posts してIDだけとってWP_queryにposts__inで
benijake

2019/04/10 02:47 編集

SQL上書きとか難易度高すぎですw 2019/04/09 22:58 に書いた方法はどうですか?authorを自前でカスタムフィールに入れて、その「カスタムフィールドのauthor」と「permitted_id」でならmeta_query同士をorできると思うのですが、いかがですか? これも冗長というか、検索のためだけに同じ値(投稿者ID)が別の場所に入るというのは良くない処理でしょうか?
KazuhiroHatano

2019/04/10 03:43

編集者をカスタムフィールドに持たせてしまうというのも ありかとは思います 常にauthorとカスタムフィールドが連動するように っていうのが課題になるかと思いますが
benijake

2019/04/10 04:24

ということは、投稿者と編集者がずっと変わらなければ大丈夫そうですね。今回はその方法にしたいと思います。何度もご返信ありがとうございました。
guest

0

要件がイマイチ不明ですが、

Search & Filterプラグインのドキュメント をみたら operators に OR 条件を指定できるので、ページ構成や検索内容によっては、このプラグインで対応できるかもしれません。

投稿2019/04/10 01:18

CHERRY

総合スコア25171

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

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

benijake

2019/04/10 02:49

便利そうなプラグインですね!ありがとうございます。ところでご不明な点といいますと、どちらの表現でしたでしょうか?
CHERRY

2019/04/10 04:04

indexページ、アーカイブページ、固定ページ、投稿ページ等、どこに記載するのか不明だったので、ページによっては、使いにくいかなと感じたので。
benijake

2019/04/10 04:23

まったく考えておりませんでしたwありがとうございます。いろいろ試してみます。
guest

0

orで考えるから分からないのでは???
A or B で検索したいのですよね?
逆を言えばAが見つからないならBを探すとも解釈できますよね?

WPしばらく触ってないので、!$the_queryとか細かいところは忘れましたが、やりたいことはこういうことだと思いますがどうですか?(もっとましな方法あるかも)

$args = array( 'paged' => $paged, 'post_type' => 'type1', 'posts_per_page' => 20, // 条件その1 'meta_key' => 'permitted_id', 'meta_value' => get_current_user_id(), ); $the_query = new WP_Query($args); if (!$the_query) { $args = array( 'paged' => $paged, 'post_type' => 'type1', 'posts_per_page' => 20, // 条件その2 'author' => get_current_user_id(), ); $the_query = new WP_Query($args); } if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post(); the_title(); endwhile; endif;

投稿2019/04/09 07:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KazuhiroHatano

2019/04/09 10:38

>Aが見つからないならBを探す いや、これは正しくない、処理を分割するなら 「条件Aに合致する群に、条件Bに合致する群も加える」 さらに重複がないようにするなら 「条件Aに合致し条件Bに合致しない群に、条件Bに合致する群も加える」 みたいな処理にするとかする
KazuhiroHatano

2019/04/09 10:41

そうなればそもそも不要な部分にはなるけど if(!$the_query) は if(!$the_query->have_posts())
benijake

2019/04/09 14:00

なるほどこちらですとKazuhiroHatano様の仰るように重複が起こってしてしまいますね。でもヒントをありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問