Aliqua
Aliqua

Reputation: 748

Correct Way to Output ACF Generated Values Using WP_Query() and Foreach()

I have setup fields and sub-fields using Advanced Custom Fields (ACF). The structure is similar to:

Field: Pet Details
- Sub-Field: Pet Name (text)
- Sub-Field: Pet Birthday (date picker)
- Sub-Field: Pet Gender (taxonomy, select)
- Additional... 

I have been able to use these within my custom post type (/cpt_slug/post_title) using the get_field(), get_sub_field() functions, however I have not been able to usilise the default ACF functions ( get_field(), get_sub_field(), etc ) in conjunction with additional pages where this information is being displayed - in this case, domain.com/account (woocommerce my account page) which is fine as I'm happy to use WP_Query.

While I have a working code below, it requires me to setup $variable = get_post_meta( $pet->ID, field_sub_field, true ) for each acf sub_field. Given the array structure,

The best result I could come up with was echo $details['pet_details_pet_name'][0] which outputs 'Cooper' (correct), but with my limited knowledge of arrays, is there any chance that the '0' will ever become a '1' and not allow this to work? I don't believe that the cpt/acf will ever put a second value in the array but I would like to hear your thoughts.

Code

global $current_user;

$query = new WP_Query ( array ( 
    'post_type' => 'audp_pets', 
    'author' => $current_user->ID, 
    'order' => 'ASC' 
    ) );

$pets = $query->posts;

if ( $pets ) {

    foreach ( $pets as $pet ) {

        var_dump ( $pet );

        ?><hr><?php

        echo "\$pet->post_title = " . $pet->post_title . '<br />';

        ?><hr><?php

        $details = get_post_meta( $pet->ID );

        $pet_name = get_post_meta( $pet->ID, 'pet_details_pet_name', true );
        echo "\$pet_name = " . $pet_name . '<br />';

        ?><hr><?php

        var_dump ( $details );


    }

wp_reset_postdata();

}

Outputs (Source)

object(WP_Post)#13185 (24) {
  ["ID"]=>
  int(952)
  ["post_author"]=>
  string(1) "1"
  ["post_date"]=>
  string(19) "2020-01-16 16:24:17"
  ["post_date_gmt"]=>
  string(19) "2020-01-16 05:24:17"
  ["post_content"]=>
  string(0) ""
  ["post_title"]=>
  string(6) "AA0AA0"
  ["post_excerpt"]=>
  string(0) ""
  ... (additional fields)
}

(N.B -- $pet->post_title = AA0AA0)

array(56) {
  ["_edit_last"]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  ["_edit_lock"]=>
  array(1) {
    [0]=>
    string(12) "1579152259:1"
  }
  ["pet_details_pet_name"]=>
  array(1) {
    [0]=>
    string(6) "Cooper"
  }
  ["_pet_details_pet_name"]=>
  array(1) {
    [0]=>
    string(19) "field_5e1189ab705b2"
  }
  ["pet_details_pet_birthday"]=>
  array(1) {
    [0]=>
    string(8) "20130313"
  }
  ... (additional fields)
}

(N.B. $pet_name = Cooper)

Thank-you in advance.

Upvotes: 1

Views: 1517

Answers (1)

Stender
Stender

Reputation: 2492

Basically, You can do it like this :

global $current_user;

$args = array ( 
'post_type' => 'audar_pets', 
'author' => $current_user->ID, 
'order' => 'ASC' 
);

$query = new WP_Query( $args );

//Here we set the loop up so we can use it all in the normal way.. 
if($query->have_posts()){
    while ($query->have_posts()) {
        $query->the_post();
        echo get_the_title();
        //Get you fields
        var_dump(get_field('pet_details'));

        if( have_rows('pet_details') ):

            // loop through the rows of data
            while ( have_rows('pet_details') ) : the_row();

                // display a sub field value
                the_sub_field('pet_name');

            endwhile;

        else :

        // no rows found

    endif;
    } 
wp_reset_postdata();
}

But this is guessing that you are using a repeater and it is indeed a sub field, and not just another field..

You can also use the have_rows etc by adding the post id at the end, like you can with any ACF function.

You can get any field, from any page, post, attachment etc you want, by adding the id $value = get_field( "text_field", 123 );

Upvotes: 1

Related Questions