Store loop into array

I am using folowing code to store posts ids into array:

<?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;
?>

However it doesnt work because if I put print_r($id) after endif it only prints id of last post. Where am I making mistake?

Read More

Thanks in forward

Related posts

2 comments

  1. Try to replace

    $id[$counter] = get_the_id();
    

    with

    array_push( $id, get_the_ID() );
    

    to collect the post id’s into the $id array.

    Update:

    If you also use $ids instead of $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;
    
  2. While @birgire’s answer solves the problem, it does not explain it. $id[$counter] = get_the_id(); should work but in this case triggers a Warning that you cannot use a scalar value as an array. Why?

    the_post runs setup_postdata, which sets $id to the post ID, overwriting your $id and turning it into an integer. You can see that by adding var_dump after the_post(), like this:

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

    Beyond that, your code is overly complex. You don’t need the counter (and if you did you already have $products->current_post) and you don’t need any particular function to push items onto the array. All you really need to do is use a variable that WordPress isn’t already using, which is what makes birgire’s solution work.

    $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;
    

Comments are closed.