Php 在自定义产品选项卡中使用高级自定义字段重复器字段
我正在使用高级自定义字段的转发器作为我的附加自定义电子商务选项卡的内容。中继器位于组字段内 我设法显示转发器字段之外的自定义字段 下面是我在Php 在自定义产品选项卡中使用高级自定义字段重复器字段,php,wordpress,woocommerce,repeater,advanced-custom-fields,Php,Wordpress,Woocommerce,Repeater,Advanced Custom Fields,我正在使用高级自定义字段的转发器作为我的附加自定义电子商务选项卡的内容。中继器位于组字段内 我设法显示转发器字段之外的自定义字段 下面是我在函数中使用的代码。php: add_filter( 'woocommerce_product_tabs', 'dl_custom_product_designer_tab' ); function dl_custom_product_designer_tab( $tabs ) { // ensure ACF is available if (
函数中使用的代码。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>';
}
}
add_filter('woocommerce_product_tabs'、'dl_custom_product_designer_tab');
功能dl_自定义_产品_设计器_选项卡($tabs){
//确保ACF可用
如果(!function_存在('have_rows'))
返回;
if(get_字段('designer')){
$tabs[]=数组(
“标题”=>“设计师”,
“优先级”=>50,
“回调”=>“自定义设计器选项卡”
);
}
返回$tabs;
}
函数dl_自定义_设计器_选项卡(){
$designer=get_字段(“designer”);
回显“”.$designer['designer_image']。”;
回显“”.$designer['designer_name']。”;
回显“”.$designer['designer\u short\u description']。”;
//循环遍历数据行
$aclements=get_字段('designer_aclements');
如果有($成就){
//循环遍历数据行
回声“”;
foreach($成就作为$成就){
//显示子字段值
回音“- ”.$Achatization['Achatization]”。
;
}
回声“
”;
}
}
现在问题是我的repeater字段中的字段:repeater子字段没有显示任何内容
我做错了什么?如何获得中继器子字段的输出
编辑: 更新(新的功能替代方案): 显然,这不适用于“product”post类型…**这看起来像是这个插件中的一个bug(我已经能够测试相同的情况并重现这个问题) 应该向作者报告,以支持treads…我是站在我这边做的
临时解决方案(只要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;
}
/**
*自定义函数:获取ACF中继器子字段的数组。
*
*@param string$master_字段
*@param string$repeater\u字段
*@param数组$sub_字段
*@输出格式的html
*/
功能中继器子字段($group\u name,$repeater,$subfield){
全球$post$product;
$repeater\u meta\u key=$group\u name.“'.$repeater;
$rows=get\u post\u meta($post->ID,$repeater\u meta\u key,true);
对于($i=0;$i<$rows;$i++){
$subfield\u meta\u key=$repeater\u meta\u key.“'.$i.'.$subfield;
$output[]=get_post_meta($post->ID,$subfield_meta_key,true);
}
if(count($rows)>0)返回$output;
否则返回;
}
那么您的测试代码和功能代码应该是:
// 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;
}
//添加自定义产品选项卡
添加过滤器(“woocommerce\u product\u tab”、“dl\u custom\u product\u designer\u tab”);
功能dl_自定义_产品_设计器_选项卡($tabs){
//确保ACF可用
如果(!function_存在('have_rows'))
返回;
if(get_字段('designer')){
$tabs[]=数组(
“标题”=>“设计师”,
“优先级”=>50,
“回调”=>“自定义设计器选项卡”
);
}
返回$tabs;
}
//自定义产品选项卡内容
函数dl_自定义_设计器_选项卡(){
全球$post$product;
$group_name='designer';
$designer=get\u字段($group\u name);
回显“”.$designer['designer_image']。”;
回显“”.$designer['designer_name']。”;
回显“”.$designer['designer\u short\u description']。”;
$designer_acgressions=中继器_子字段($group_name,'designer_acgressions','acgression');
//检查repeater字段是否有数据行
如果(计数($designer_成就)>0):
回声“”;
//循环遍历数据行
foreach($designer_成就为$Achization){
//显示子字段值
回音“- ”.$Achatization.
”;
}
回声“”;
其他:
//“未找到行”可选消息
回显“无数据…”;
endif;
}
代码位于活动子主题(或主题)的function.php文件或任何插件文件中
测试和工程
原始答案: 使用Pro plugin获取Repeater子字段数据时,您需要使用、函数和方法,并通过以下方式:
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;
}
function dl\u custom\u designer\u tab(){
全球$员额;
$designer=get_字段(“designer”);
回显“”.$designer['designer_image']。”;
回显“”.$designer['designer_name']。”;
回显“”.$designer['designer\u short\u description']。”;
//检查repeater字段是否有数据行
如果(有行(“设计师成就”):
回声“”;
//循环遍历数据行
while(have_row('designer_productions')):the_row();
//显示子字段值
回显“- ”。获取子字段(“成就”)。
;
结束时;
回声“”;
其他:
//“未找到行”可选消息
echo“在中继器中找不到行…”;
endif;
}
更新(新的功能替代方案):
显然,这不适用于“product”post类型…**这看起来像是这个插件中的一个bug(我已经能够测试相同的情况并重现这个问题)
应该向作者报告,以支持treads…我是站在我这边做的
临时解决方案(只要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;
}
/**
*自定义函数:获取ACF中继器子字段的数组。
*
*@param s