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

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

ただいまの
回答率

88.77%

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 339

hana_hana

score 16

実現したいこと

WordPressのwhileでJSONを返しています。

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

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

宜しくお願い致します。

該当のソースコード

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

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

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

↓loop-post.php 

<?php
if ( $the_query->have_posts() ) :
    $return_array = [];
    while ( $the_query->have_posts() ) : $the_query->the_post();

        // このwhileの中を別のテンプレートに移したい
        $id = get_the_ID();        
        $return_array['one']['two'][] = [
            'id'      => $id,
        );

    endwhile;
    wp_reset_postdata();
endif;

return json_encode($return_array);

※追記:one、twoは実際には変数で、oneには投稿タイプ、twoには日付が入ります。その結果は「実際のJSON」として後述させて頂きました。

ためしたこと

まず別のテンプレート(post.php)にこのように移しました。

↓post.php 

        $post_array = [];
        $post_array['one']['two'][] = [
            'id'      => $id,
        );
        return $post_array;


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

↓loop-post.php 

<?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' ); 
        $return_array[] = $post_array;        

    endwhile;
    wp_reset_postdata();
endif;

return json_encode($return_array);

質問内容

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

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

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

実際のJSON

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

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

{
  "product": {
    "2019/06": [
      {
        "id": 1,
      },
      {
        "id": 2,
      },
    ],
    "2019/05": [
      {
        "id": 3,
      },
      {
        "id": 4,
      }
    ],
  },
  "service": {
    "2019/05": [
      {
        "id": 5,
      },
    ]
  }
}


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

[
  {
    "product": {
      "2019/06": [
        {
          "id": 1,
        }
      ]
    }
  },
  {
    "product": {
      "2019/06": [
        {
          "id": 1,
        },
        {
          "id": 2,
        }
      ]
    }
  }
  {
    "product": {
      "2019/06": [
        {
          "id": 1,
        },
        {
          "id": 2,
        },
      ],
      "2019/05": [
        {
          "id": 3,
        }
      ]
    }
  },
  {
    "product": {
      "2019/06": [
        {
          "id": 1,
        },
        {
          "id": 2,
        },
      ],
      "2019/05": [
        {
          "id": 3,
        },
        {
          "id": 4,
        }
      ]
    }
  },
  {
    "product": {
      "2019/06": [
        {
          "id": 1,
        },
        {
          "id": 2,
        },
      ],
      "2019/05": [
        {
          "id": 3,
        },
        {
          "id": 4,
        }
      ],
    },
    "service": {
      "2019/05": [
        {
          "id": 5,
        }
      ]
    }
  }
]

ご返信いただいたコードの場合

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

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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/03 10:53

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

    キャンセル

  • 2019/06/03 11:11 編集

    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);
    ```

    で、希望のデータを取得できないですか?

    キャンセル

  • 2019/06/03 11:59 編集

    縦に長くみにくいJSONを提示してしまい申し訳ございません。ご覧いただきまして誠にありがとうございます。

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

    キャンセル

0

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

//post.php 
$post_array['one']['two'][] = [
    'id'      => $id,
);
<?php
if ( $the_query->have_posts() ) :
    $post_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 );

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る