使用 WP_Query() 和 Foreach() 输出 ACF 生成值的正确方法

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

我使用高级自定义字段 (ACF) 设置字段和子字段。结构类似于:

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

我已经能够使用 get_field()get_sub_field() 函数在我的自定义 post 类型 (/cpt_slug/post_title) 中使用这些,但是我无法将默认的 ACF 函数(get_field()get_sub_field() 等)与显示此信息的其他页面结合使用 - 在这种情况下,domain.com/account(woocommerce 我的帐户页面)很好因为我很乐意使用 WP_Query.

虽然下面有一个工作代码,但它需要我为每个 acf sub_field 设置 $variable = get_post_meta( $pet->ID, field_sub_field, true )。给定数组结构,

我能想到的最好结果是 echo $details['pet_details_pet_name'][0],它输出 'Cooper'(正确),但由于我对数组的了解有限,'0' 是否有可能成为一个'1'并且不允许这个工作?我不相信 cpt/acf 会在数组中放入第二个值,但我想听听您的想法。

代码

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

}

输出(来源)

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)

提前致谢。

基本上,您可以这样做:

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();
}

但这是在猜测您使用的是转发器,它确实是一个子字段,而不仅仅是另一个字段..

您还可以通过在末尾添加 post id 来使用 have_rows 等,就像使用任何 ACF 函数一样。

您可以通过添加 ID $value = get_field( "text_field", 123 );

从任何页面、post、附件等获取任何字段