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

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

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

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

PHP

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

Q&A

1回答

2364閲覧

サブループの条件が、メインループの「pre_get_posts」で使えない

makirons

総合スコア20

WordPress

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

PHP

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

0グッド

1クリップ

投稿2018/12/13 00:35

編集2019/01/13 11:50

サブループからメインループに変更するにあたって、meta_queryの条件が効かない状況です。

サブループでは次のように記事取得条件を書いておりきちんと機能しますが、同様の条件が後述のメインクエリ版で機能しません。//公開条件の部分です。

ちなみに//公開条件は、「meta_queryによってユーザーIDが1の人に対して記事を公開するか否かを判別したい」という意図で書いたものです。
###サブループ版
こちらは機能します。

php

1function get_the_query() { 2 $paged = get_query_var('paged') ? get_query_var('paged') : 1; 3 $args = array( 4 // 基本条件 5 'paged' => $paged, 6 'posts_per_page' => 10, 7 'post_type' => 'mypost', 8 // 公開条件 9 'meta_query' => array( 10 array( 11 'key' => 'targetIds', 12 'value' => 1, 13 'compare' => 'LIKE', 14 'type'=>'NUMERIC' 15 ), 16 array( 17 'key' => 'targetIds', 18 'value' => '', 19 'compare' => '=', 20 ), 21 'relation'=>'OR' 22 ), 23 ); 24 $the_query = new WP_Query( $args ); 25 return $the_query; 26}

###メインループ版
こちらが問題のソースコードになります。上と同じはずの// 公開条件が機能せず、原因と解決策についてご意見を頂ければ幸いです。どうぞ宜しくお願い致します。

php

1function myPreGetPosts( $query ) { 2 $paged = get_query_var('paged') ? get_query_var('paged') : 1; 3 // 管理画面 4 if ( is_admin() || ! $query->is_main_query() ){ 5 return; 6 } 7 // フロントページ 8 if ( $query->is_home() ) { 9 // 基本条件 10 $query->set('paged', $paged); 11 $query->set('posts_per_page', 10); 12 $query->set('post_type', 'mypost'); 13 // 公開条件 14 $query -> set( 15 'meta_query' => array( 16 array( 17 'key' => 'targetIds', 18 'value' => 1, 19 'compare' => 'LIKE', 20 'type'=>'NUMERIC' 21 ), 22 array( 23 'key' => 'targetIds', 24 'value' => '', 25 'compare' => '=', 26 ), 27 'relation'=>'OR' 28 ) 29 ); 30 } 31} 32add_action('pre_get_posts','myPreGetPosts'); 33

###メインループ版2
kei344様から頂戴したアドバイスを元にして、上のメインループ版を、次のメインループ版2に改良しました。(後述するエラーが出ます。)

php

1 2function myPreGetPosts( $query ) { 3 $paged = get_query_var('paged') ? get_query_var('paged') : 1; 4 // 管理画面 5 if ( is_admin() || ! $query->is_main_query() ){ 6 return; 7 } 8 // フロントページ 9 if ( $query->is_home() ) { 10 // 基本条件 11 $query->set('paged', $paged); 12 $query->set('posts_per_page', 10); 13 $query->set('post_type', 'mypost'); 14 // 公開条件 15 $query -> set( 16 array( 'meta_query' => array( 17 array( 18 'key' => 'targetIds', 19 'value' => 1, 20 'compare' => 'LIKE', 21 'type'=>'NUMERIC' 22 ), 23 array( 24 'key' => 'targetIds', 25 'value' => '', 26 //'compare' => '=', // どちらにしても同じエラー 27 'compare' => 'NOT EXISTS', // どちらにしても同じエラー 28 ), 29 'relation'=>'OR' 30 ) ) 31 ); 32 } 33} 34add_action('pre_get_posts','myPreGetPosts'); 35

上のメインループ版2によって次のエラーが出ます。
on line 231というのは、array( 'meta_query' => array(の行です。)

Warning: Missing argument 2 for WP_Query::set(), called in /export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-content/themes/pingraphy-child/functions.php on line 231 and defined in /export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-includes/class-wp-query.php on line 1604 Warning: Illegal offset type in /export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-includes/class-wp-query.php on line 1605 Notice: Undefined variable: value in /export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-includes/class-wp-query.php on line 1605

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/01/15 06:01

こちらの質問は解決したのでしょうか? 解決したのであれば、ベストアンサーを決めてクローズしてはいかがでしょうか。
guest

回答1

0

こうでは?

PHP

1 $query -> set( 2 array( 'meta_query' => array( 3 array( 4 'key' => 'targetIds', 5 'value' => 1, 6 'compare' => 'LIKE', 7 'type'=>'NUMERIC' 8 ), 9 array( 10 'key' => 'targetIds', 11 'value' => '', 12 'compare' => '=', 13 ), 14 'relation'=>'OR' 15 ) ) 16 );

投稿2018/12/13 02:54

kei344

総合スコア69407

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

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

makirons

2018/12/13 13:51 編集

できました。ありがとうございます。どうしてメインの方ではarrayが一つ多くしなければならないのですか??
kei344

2018/12/13 13:54

サブループ版の「// 基本条件」の前に「array(」があるでしょ。それが「メインループ版」で抜けていただけで、「多くする」ではありませんよ。
makirons

2019/01/12 18:39 編集

こんばんは。すみません、やはりできていませんでした。 array( 'meta_query' => array( の行(231行目)について、下記エラーと出ます。 Warning: Missing argument 2 for WP_Query::set(), called in /export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-content/themes/pingraphy-child/functions.php on line 231 and defined in /export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-includes/class-wp-query.php on line 1604 Warning: Illegal offset type in /export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-includes/class-wp-query.php on line 1605 Notice: Undefined variable: value in /export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-includes/class-wp-query.php on line 1605 何かピンと来ることなどございませんでしょうか? 同じ条件を書いたサブループではエラーが出ないのに、、まったく理解できません。
kei344

2019/01/12 18:05

前の時にエラーにならなかったのであれば、別の問題では。 エラー文だけ見せられてもどういうコードを書いているかがわかりません。コードを質問文に「追記」してください。(決して元のコードを消さないでください)
makirons

2019/01/12 19:35 編集

失礼致しました。「メインループ版2」として追記しました。ご査収頂ければ幸いです。 ちなみに前の時はエラーを表示しない設定だったために気づきませんでした。
kei344

2019/01/13 02:49

すみません、元々私が提示したコードが間違っています。配列の並びは「メインループ版」で問題ありませんでした。 メインループは他のpre_get_postsの影響やページデフォルトの指定などが入っている場合があり、それが影響している可能性があります。
kei344

2019/01/13 02:55

ページのテンプレートで$wp_query->query_varsと$the_query->query_varsの内容を出力して確認してみてください。
makirons

2019/01/13 03:36

>ページのテンプレートで$wp_query->query_varsと$the_query->query_varsの内容を出力して確認してみてください。 と仰いますと、 ver_dump($wp_query->query_vars)と ver_dump($the_query->query_vars)で メインループとサブループの内容を比べてみるということでしょうか? 夕方頃になると思いますが帰ったらすぐ試してみます。すみません。
kei344

2019/01/13 04:21

> コード間違ってますか? $query -> set() はキーと値(配列)を渡すもので、提示のサイトは $query -> set() を使用していないので。
makirons

2019/01/13 11:33

お世話になっております。まず「メインループ版」では次のエラーになり、画面には何も表示されなくなりました。 Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW), expecting ',' or ')' in /export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-content/themes/pingraphy-child/functions.php on line 252 on line 252 は 'meta_query' => array( の行です。
makirons

2019/01/13 11:49

次にご回答頂いた「メインループ版2」と「サブループ版」を、フロントページ(index.php)でvar_dumpした結果がこちらです。(あれ?サブループ版にはmeta_queryが入ってませんね…なんででしょうか…) ■「メインループ版2」を var_dump($wp_query->query_vars)した結果 array(65) { ["paged"]=> int(1) ["posts_per_page"]=> int(7) ["post_type"]=> string(5) "mypost" ["meta_query"]=> array(3) { [0]=> array(4) { ["key"]=> string(23) "targetIds" ["value"]=> int(1) ["compare"]=> string(4) "LIKE" ["type"]=> string(7) "NUMERIC" } [1]=> array(3) { ["key"]=> string(23) "targetIds" ["value"]=> string(0) "" ["compare"]=> string(10) "NOT EXISTS" } ["relation"]=> string(2) "OR" } ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["static"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["category_name"]=> string(0) "" ["tag"]=> string(0) "" ["cat"]=> string(0) "" ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" } ■「サブループ版」を var_dump($the_query->query_vars)した結果 array(64) { ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["static"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["category_name"]=> string(0) "" ["tag"]=> string(0) "" ["cat"]=> string(0) "" ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(1) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["posts_per_page"]=> int(7) ["post_type"]=> string(5) "mypost" ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" }
kei344

2019/01/13 13:52

こちらで提示しておいて申し訳ないのですが「メインループ版2」は正しくないので比較する意味はありません。(エラーが出なくなったわけではないでしょう) その上で、結果が逆ではないかと思います。
makirons

2019/01/13 13:55

いえ、「メインループ版」は「2019/01/13 20:33」のエラーだけが出て、他は真っ白です。「メインループ版2」ならエラーは出るけど記事一覧も出ます。間違いございません。
kei344

2019/01/13 14:03

$query -> set( 'meta_query', array( /*略*/ そのエラーはここの部分だと思います。(「=>」でなく「,」カンマ)
makirons

2019/01/13 15:40

失礼致しました。カンマで無事エラーは消えました。どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問