web-dev-qa-db-ja.com

ループを配列に格納

次のコードを使用して、投稿IDを配列に格納します。

<?php
    $args = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'ignore_sticky_posts'   => 1,
        'posts_per_page' => 5,
        'orderby' => 'date',
        'order' => 'desc');
$id = array();
$counter = 1;       
$products = new WP_Query( $args );
if ( $products->have_posts() ) : while ( $products->have_posts() ) : $products->the_post();
    $id[$counter] = get_the_id();
    //custom_shop_array_create($product, $counter);
    $counter++;
endwhile;
endif;
?>

ただし、endifの後にprint_r($id)を付けると、最後の投稿のIDしか表示されないため、うまくいきません。どこで間違えていますか?

今後ともどうぞ

2
horin

交換してみてください

$id[$counter] = get_the_id();

array_Push( $id, get_the_ID() );

投稿IDを$id配列に収集します。

更新:

$idsの代わりに$idも使用する場合:

    $args = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'ignore_sticky_posts'   => 1,
        'posts_per_page' => 5,
        'orderby' => 'date',
        'order' => 'desc');
$ids = array();
$products = new WP_Query( $args );
if ( $products->have_posts() ) : 
    while ( $products->have_posts() ) : $products->the_post();
       array_Push( $ids, get_the_ID() );
    endwhile;
endif;
4
birgire

@ birgireの答えが問題を解決する間、それはそれを説明しません。 $id[$counter] = get_the_id();は動作するはずですが、この場合、スカラー値を配列として使用することはできませんWarningをトリガーします。どうして?

the_postsetup_postdata を実行します。これは、$idを投稿IDに設定し、$idを上書きして整数に変換します。次のように、the_post()の後にvar_dumpを追加するとわかります。

$products->the_post();
var_dump($id);

それ以上に、あなたのコードは非常に複雑です。あなたはカウンターを必要としません(そしてあなたが既に$products->current_postを持っているなら)そしてあなたはアイテムを配列にプッシュするための特別な関数を必要としません。あなたが本当にする必要があるのはWordPressがまだ使用していない変数を使用することです、それはbirgireの解決を働かせるものです。

$args = array(
  'post_type' => 'post',
  'post_status' => 'publish',
  'ignore_sticky_posts'   => 1,
  'posts_per_page' => 5,
  'orderby' => 'date',
  'order' => 'desc'
);

$ids = array();  
$products = new WP_Query( $args );
if ( $products->have_posts() ) : 
  while ( $products->have_posts() ) : 
    $products->the_post();
    $ids[] = $post->ID;
    //custom_shop_array_create($product, $counter);
  endwhile;
endif;
1
s_ha_dum