web-dev-qa-db-ja.com

WordPressのJSON出力

更新日:私は次のようにコードを変更しました

$cats = get_categories();
$output = array('categories' => array());

function collect_posts(){
    $args = array( 'numberposts=' => 9999, 'category' => $cat );
    $myposts = get_posts( $args );
    foreach( $myposts as $post ) {
        setup_postdata($post); 
        if (get_post_meta($post->ID, 'apls_video_youtube', true) != ''){
        $url = 'http://www.youtube.com/watch?v=';
        $url .= get_post_meta($post->ID, 'apls_video_youtube', true);
        } else {
            $url = get_post_meta($post->ID, 'apls_video_hosted', true);
        }
        $output['posts'][] = array(
            'name' => get_the_title($post->ID),
            'url' => $url,
        );
        return $output;
    }       
}

foreach ($cats as $cat) {

    $output['categories'][] = array(
        'cat_id' => $cat->term_id,
        'cat_name' => $cat->name,
        collect_posts()
    );
}

header("Content-type: application/json");
die(json_encode($output));

出力は以下のとおりです。

{
    "categories": [
        {
            "cat_id": "555",
            "cat_name": "Articles",
            "0": {
                "posts": [
                    {
                        "name": "title",
                        "url": "http://www.domain.com......."
                    }
                ]
            }
        },
        {
            "cat_id": "15",
            "cat_name": "Crank",
            "0": {
                "posts": [
                    {
                        "name": "title examlple",
                        "url": "http://www.domain.com/v......"
                    }
                ]
            }
        },
        {......

問題は、

1つの投稿のみが表示されています各カテゴリに同じ投稿が表示されていますA 0(zero)が追加されました

だから私は問題を解決するためにあなたの提案が必要です。

========================前の部分======================== ===

私はJSON出力を取得したい

 {
    "categories": [
        {
            "cat_id": "16",
            "cat_name": "Arm Lock",
            "posts": [
                {
                    "name": "Video1",
                    "url": "http://www.videourl1.com/"
                },
                {
                    "name": "Video2",
                    "url": "http://www.videourl2.com/"
                },
                {
                    "name": "Video2",
                    "url": "http://www.videourl3.com/"
                }
            ]
        },
        {
            "cat_id": "12",
            "cat_name": "Kick",
            "posts": [
                {
                    "name": "Video1",
                    "url": "http://www.videourl3.com/"
                },
                {
                    "name": "Video2",
                    "url": "http://www.videourl3.com/"
                },
                {
                    "name": "Video2",
                    "url": "http://www.videourl3.com/"
                }
            ]
        }
    ]
}

ようにコーディング

// get all the categories from the database
$cats = get_categories();

header('Content-type: application/json');
echo '{
   "categories": [';
foreach ($cats as $cat) {
// setup the cateogory ID
$cat_id= $cat->term_id;
query_posts("cat=$cat_id&posts_per_page=9999");
echo '
      {
    "cat_id": "'.$cat_id.'",';
echo '
    "cat_name": "'.$cat->name.'",';
echo '
    "posts": [';
if (have_posts()) : while (have_posts()) : the_post();
if (get_post_meta($post->ID, 'apls_video_youtube', true) != ''){
    $url = 'http://www.youtube.com/watch?v=';
    $url .= get_post_meta($post->ID, 'apls_video_youtube', true);
} else {
    $url = get_post_meta($post->ID, 'apls_video_hosted', true);
}

echo '  
      {';
echo '  
        "name": "'.get_the_title().'", ';
echo '  
        "url": "'.$url.'"';
echo '  
      },';
endwhile; endif; 
echo '
     ]';
echo '
   },';
}

echo '
  ]';
echo '
}';

これは私にとってはうまくいきましたが、すべてのループの最後の項目にある "、"の問題に直面していたので、JSON出力はパーサーにとって無効です。どうすれば修正できますか?

5
PHPLearner

あなたがPHP 5.2+を使っているのなら、あなたはPHP配列あるいはオブジェクトを作成して json_encode() を使うことが最善の策です。

更新しました:

$cats = get_categories();
$output = array('categories' => array());

foreach ($cats as $cat) {
    $cat_output = array(
        'cat_id' => $cat->term_id,
        'cat_name' => $cat->name,
        'posts' => array(),
    );

    // should be able to use -1 to get all posts, rather than 9999
    $args = array('numberposts=' => -1, 'category' => $cat->cat_ID);
    $myposts = get_posts($args);

    foreach( $myposts as $post ) {
        if ($youtube_id = get_post_meta($post->ID, 'apls_video_youtube', TRUE)) {
            $url = "http://www.youtube.com/watch?v={$youtube_id}";
        } else {
            $url = get_post_meta($post->ID, 'apls_video_hosted', TRUE);
        }

        $cat_output['posts'][] = array(
            'name' => get_the_title($post->ID),
            'url' => $url,
        );
    }

    $output['categories'][] = $cat_output;
}

header("Content-type: application/json");
die(json_encode($output));
8
totels