我正在为我的其他自定义WooCommerce标签的内容使用高级自定义字段的Repeater。转发器位于组字段内。
我设法显示转发器字段之外的自定义字段。
以下是我在functions.php
中使用的代码:
add_filter( 'woocommerce_product_tabs', 'dl_custom_product_designer_tab' );
function dl_custom_product_designer_tab( $tabs ) {
// ensure ACF is available
if ( !function_exists( 'have_rows' ) )
return;
if ( get_field('designer') ) {
$tabs[] = array(
'title' => 'DESIGNER',
'priority' => 50,
'callback' => 'dl_custom_designer_tab'
);
}
return $tabs;
}
function dl_custom_designer_tab() {
$designer = get_field('designer');
echo '<p>'.$designer['designer_image'].'</p>';
echo '<p>'.$designer['designer_name'].'</p>';
echo '<p>'.$designer['designer_short_description'].'</p>';
// loop through the rows of data
$achievements = get_field('designer_achievements');
if( $achievements ) {
// loop through the rows of data
echo '<ul>';
foreach($achievements as $achievement){
// display a sub field value
echo '<li>'.$achievement['achievement'].'</li>';
}
echo '</ul>';
}
}
现在问题是我的转发器字段内的字段:转发器子字段没有显示任何内容。
我做错了什么?如何获得转发器子字段的输出?
答案 0 :(得分:0)
更新 (新的功能替代方案):
显然,这不适用于&#34;产品&#34;帖子类型... **这看起来像这个插件中的一个错误(我已经能够测试相同的情况并重现问题)。
应该向作者提供报告支持 ......我已经在我这边做了。
临时解决方案(只要ACF团队无法解决此错误)
这是ACF中继器专用功能的自定义功能替换:
/**
* Custom function: Get an array of ACF repeater sub-field.
*
* @param string $master_field (the
* @param string $repeater_field
* @param array $sub_fields
* @output formatted html
*/
function repeater_subfield( $group_name, $repeater, $subfield ){
global $post, $product;
$repeater_meta_key = $group_name.'_'.$repeater;
$rows = get_post_meta( $post->ID, $repeater_meta_key, true );
for($i = 0; $i < $rows; $i++){
$subfield_meta_key = $repeater_meta_key.'_'.$i.'_'.$subfield;
$output[] = get_post_meta( $post->ID, $subfield_meta_key, true );
}
if( count($rows) > 0 ) return $output;
else return;
}
然后您的测试和功能代码应为:
// Add a custom product tab
add_filter( 'woocommerce_product_tabs', 'dl_custom_product_designer_tab' );
function dl_custom_product_designer_tab( $tabs ) {
// ensure ACF is available
if ( !function_exists( 'have_rows' ) )
return;
if ( get_field('designer') ) {
$tabs[] = array(
'title' => 'DESIGNER',
'priority' => 50,
'callback' => 'dl_custom_designer_tab'
);
}
return $tabs;
}
// The custom product tab content
function dl_custom_designer_tab() {
global $post, $product;
$group_name = 'designer';
$designer = get_field( $group_name );
echo '<p>'.$designer['designer_image'].'</p>';
echo '<p>'.$designer['designer_name'].'</p>';
echo '<p>'.$designer['designer_short_description'].'</p>';
$designer_achievements = repeater_subfield( $group_name, 'designer_achievements', 'achievement' );
// check if the repeater field has rows of data
if( count($designer_achievements) > 0 ):
echo '<ul>';
// loop through the rows of data
foreach( $designer_achievements as $achievement ){
// display a sub field value
echo '<li>'.$achievement.'</li>';
}
echo '<ul>';
else:
// "no rows found" optional message
echo '<p><em>No data…</em></p>';
endif;
}
代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。
经过测试和工作......
原始回答:
使用Advanced Custom Field Pro插件获取 Repeater 子字段数据,您需要使用the documented way,函数和方法have_rows()和{{3}这样:
function dl_custom_designer_tab() {
global $post;
$designer = get_field('designer');
echo '<p>'.$designer['designer_image'].'</p>';
echo '<p>'.$designer['designer_name'].'</p>';
echo '<p>'.$designer['designer_short_description'].'</p>';
// check if the repeater field has rows of data
if( have_rows('designer_achievements') ):
echo '<ul>';
// loop through the rows of data
while ( have_rows('designer_achievements') ) : the_row();
// display a sub field value
echo '<li>' . get_sub_field('achievement') . '</li>';
endwhile;
echo '<ul>';
else:
// "no rows found" optional message
echo '<p><em>No row founds in repeater…</em></p>';
endif;
}