在WooCommerce自定义产品选项卡中使用高级自定义字段Repeater字段

时间:2017-11-18 10:04:25

标签: php wordpress woocommerce repeater advanced-custom-fields

我正在为我的其他自定义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>';
        }
}

现在问题是我的转发器字段内的字段:转发器子字段没有显示任何内容。

我做错了什么?如何获得转发器子字段的输出?

修改:A screenshot of the ACF settings repeater field

1 个答案:

答案 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;
}