使用 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、附件等获取任何字段
我使用高级自定义字段 (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 );