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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

WordPress

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

2回答

405閲覧

WordPressのループでJSONを使うとき、配列の階層があわない

hana_hana

総合スコア27

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

WordPress

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2019/06/02 17:58

編集2019/06/03 02:57

###実現したいこと
WordPressのwhileでJSONを返しています。

今回はこのwhileの中のコードを別のテンプレートに移したいと考えております。

しかしそのとき、返される配列の階層が合わなくなってしまうことについて質問させて頂きました。

宜しくお願い致します。

###該当のソースコード

AJAXで下記を読みます。おなじみの記事のループですが、結果を配列のJSONで受け取ります。

そしてこの記事データの階層は**「one、two、の次」という3つ目に入る**ことになっています。

今回はこの階層を変化させることなく、whileの中のコードを別のテンプレートに移すということを実現したいと考えております。

↓loop-post.php

PHP

1<?php 2if ( $the_query->have_posts() ) : 3 $return_array = []; 4 while ( $the_query->have_posts() ) : $the_query->the_post(); 5 6 // このwhileの中を別のテンプレートに移したい 7 $id = get_the_ID(); 8 $return_array['one']['two'][] = [ 9 'id' => $id, 10 ); 11 12 endwhile; 13 wp_reset_postdata(); 14endif; 15 16return json_encode($return_array);

※追記:one、twoは実際には変数で、oneには投稿タイプ、twoには日付が入ります。その結果は「実際のJSON」として後述させて頂きました。
###ためしたこと
まず別のテンプレート(post.php)にこのように移しました。

↓post.php

PHP

1 $post_array = []; 2 $post_array['one']['two'][] = [ 3 'id' => $id, 4 ); 5 return $post_array;

次が問題です。上の$post_arrayをwhileの中でまとめようとしてみたのですが、下記のようにまとめると、記事データの配列の階層が「one、two、の次」という3つ目ではなく、4つ目に入ることになってしまいます。

↓loop-post.php

PHP

1<?php 2if ( $the_query->have_posts() ) : 3 $return_array = []; 4 while ( $the_query->have_posts() ) : $the_query->the_post(); 5 6 $id = get_the_ID(); 7 $post_array = include locate_template( 'template-parts/post.php' ); 8 $return_array[] = $post_array; 9 10 endwhile; 11 wp_reset_postdata(); 12endif; 13 14return json_encode($return_array);

###質問内容
そこでお聞きしたいのが、「ためしたこと」にあるようにpost.phpとloop-post.phpとテンプレートを分けた状態にしつつ、最終的にjson_encodeの対象の配列は「該当のソースコード」のものと同じ配列を返すような方法です。

「ためしたこと」では4つ目に入ることになてしまっている記事データの配列を、「該当のソースコード」と同じ3つ目にしたいということです。

ご協力いただけましたら幸いです。
宜しくお願い致します。

###実際のJSON
配列がどのようにズレのるかについて補足させて頂きます。

「該当のソースコード」では次のJSONになります。これが目的の形です。

JSON

1{ 2 "product": { 3 "2019/06": [ 4 { 5 "id": 1, 6 }, 7 { 8 "id": 2, 9 }, 10 ], 11 "2019/05": [ 12 { 13 "id": 3, 14 }, 15 { 16 "id": 4, 17 } 18 ], 19 }, 20 "service": { 21 "2019/05": [ 22 { 23 "id": 5, 24 }, 25 ] 26 } 27}

一方「ためしたこと」では次のJSONになります。ループで作られた配列を使って再帰的に追加してしまうようで、上のものが次のようになります。

JSON

1[ 2 { 3 "product": { 4 "2019/06": [ 5 { 6 "id": 1, 7 } 8 ] 9 } 10 }, 11 { 12 "product": { 13 "2019/06": [ 14 { 15 "id": 1, 16 }, 17 { 18 "id": 2, 19 } 20 ] 21 } 22 } 23 { 24 "product": { 25 "2019/06": [ 26 { 27 "id": 1, 28 }, 29 { 30 "id": 2, 31 }, 32 ], 33 "2019/05": [ 34 { 35 "id": 3, 36 } 37 ] 38 } 39 }, 40 { 41 "product": { 42 "2019/06": [ 43 { 44 "id": 1, 45 }, 46 { 47 "id": 2, 48 }, 49 ], 50 "2019/05": [ 51 { 52 "id": 3, 53 }, 54 { 55 "id": 4, 56 } 57 ] 58 } 59 }, 60 { 61 "product": { 62 "2019/06": [ 63 { 64 "id": 1, 65 }, 66 { 67 "id": 2, 68 }, 69 ], 70 "2019/05": [ 71 { 72 "id": 3, 73 }, 74 { 75 "id": 4, 76 } 77 ], 78 }, 79 "service": { 80 "2019/05": [ 81 { 82 "id": 5, 83 } 84 ] 85 } 86 } 87]

###ご返信いただいたコードの場合
CHERRY様にご返信いただいたコードを試したところ、下記画像の左側(←)になる状態です。目的である「該当のソースコード」の結果は右側(→)です。

イメージ説明

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

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

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

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

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

guest

回答2

0

外部のファイルに書き出した部分だけ単純にincludeして良いのではないでしょうか。

php

1//post.php 2$post_array['one']['two'][] = [ 3 'id' => $id, 4);

php

1<?php 2if ( $the_query->have_posts() ) : 3 $post_array = []; 4 while ( $the_query->have_posts() ) : $the_query->the_post(); 5 $id = get_the_ID(); 6 $post_array = include locate_template( 'template-parts/post.php' ); 7 endwhile; 8 wp_reset_postdata(); 9endif; 10 11return json_encode($post_array );

投稿2019/06/10 09:40

hide0128

総合スコア245

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

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

0

最上位で1回層深くなっているということだと思いますが、説明だけでは判断がしにくいので、可能であれば、現在のコードと試したことのコードでの JSON の出力例を質問に添付していただけないでしょうか?


試したコードの loop-post.php の

$post_array = include locate_template( 'template-parts/post.php' );

で、$post_array の中は、

$post_array['one']['two']['0']['ID']

になっています。

これを

$return_array[] = $post_array;

としているので、 $return_array では、

$return_array['0']['one']['two']['0']['ID']

となります。


現行の loop-post.php と同等の動きをさせるということであれば...

post.php では

$post_array = [ 'id' => $id, ); return $post_array;

として、loop-post.php では、

$return_array['one']['two'][] = include locate_template( 'template-parts/post.php' );

とする必要があるのではないでしょうか?

投稿2019/06/02 23:38

CHERRY

総合スコア25171

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

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

hana_hana

2019/06/03 00:18

>最上位で1回層深くなっているということ 完全に仰る通りでした。ありがとうございます。 しかし以下、質問になく申し訳ないのですが、oneとtwoは実際には変数で、その変数はpost.phpの方で定義されるものにしたいと考えておりまして…、 なのでloop-post.phpで $return_array['one']['two'][] = include locate_template( 'template-parts/post.php' ); のようにするという方法ではなく、 なにか、配列を上手に調整する(??)ような方法など、ご存じありませんでしょうか。
CHERRY

2019/06/03 01:22

要件が不明なのでどのようにするのが最適かは判断しにくいです。 ループの処理でキーが絶対に重複しないのであれば、配列を array_merge() で1つにまとめることができるかもしれません。 ただし、同じキーが出てくると上書きされますので想定外の結果になる場合もあるかもしれません。 単にファイル分割して、 include しているのであれば、include されたファイルでも 親ファイル変数のスコープは、そのまま有効なので $return_array を直接編集するという方法もありそうです。( https://www.php.net/manual/ja/language.variables.scope.php 参照。)
hana_hana

2019/06/03 01:53

キーは投稿ごとに取得される「投稿タイプ」と「日付」なので、よく重複します。 たしかにそれらのキーをpost-loop.phpで取得しておき、post.phpに引き継げばできますが、なるべく多くをpost.phpにまとめたいと思ってまして…
CHERRY

2019/06/03 02:12 編集

JSONファイル拝見しました。 この様になるということは、単にファイル分割して include しているだけで、 post.php で、毎回初期化等の処理をしているわけではないのですね。 であれば、$post_array に毎回代入するので無駄が多いですが、現状の受け取り部分とjson_encodeを変更して、 ``` <?php if ( $the_query->have_posts() ) : $return_array = []; while ( $the_query->have_posts() ) : $the_query->the_post(); $id = get_the_ID(); $post_array = include locate_template( 'template-parts/post.php' ); endwhile; wp_reset_postdata(); endif; return json_encode($post_array); ``` で、希望のデータを取得できないですか?
hana_hana

2019/06/03 02:59 編集

縦に長くみにくいJSONを提示してしまい申し訳ございません。ご覧いただきまして誠にありがとうございます。 ご返信ありがとうございます。目的に近くなりました。 ご返信いただいたコードの結果と、目的の結果とを、質問に画像として添付させて頂きました。ひとりでは太刀打ちできず、心強く感じます。またお時間ございましたらご返信いただけましたら幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問