【问题标题】:Custom Woocommerce product variations attributes自定义 Woocommerce 产品变体属性
【发布时间】:2019-10-29 15:00:27
【问题描述】:

我看到过类似的问题,并尝试了所有解决方案,但似乎没有一个适合我的项目。

我的所有产品都有额外的规格,当客户在产品页面上选择不同的变体时需要更改。我需要将规格显示在产品属性表中 到目前为止,我已经尝试了几种不同的方法,但到目前为止我的代码看起来像这样。我可以从编辑产品页面获取要保存的额外数据,但我不知道如何让它显示在产品页面上。

函数.php

// Add custom fields to product variation settings
add_action( 'woocommerce_product_after_variable_attributes','add_variation_options_other_dimensions', 10, 3 );
function add_variation_options_other_dimensions( $loop, $variation_data, $variation ){


    woocommerce_wp_text_input( array(
        'id' => 'diameter[' . $loop . ']',
        'class' => 'short',
        'label'       => __( 'Diameter', 'woocommerce' ),
        'desc_tip'    => 'true',
        'description' => __( 'Diameter description help.', 'woocommerce' ),
        'value'       => get_post_meta( $variation->ID, 'diameter', true )
    ) );

    woocommerce_wp_text_input( array(
        'id' => 'thickness[' . $loop . ']',
        'class' => 'short',
        'label'       => __( 'Thickness', 'woocommerce' ),
        'desc_tip'    => 'true',
        'description' => __( 'Thickness description help.', 'woocommerce' ),
        'value'       => get_post_meta( $variation->ID, 'thickness', true )
    ) );

}


// Save product variation custom fields values
add_action( 'woocommerce_save_product_variation','save_variation_options_other_dimensions', 10 ,2 );
function save_variation_options_other_dimensions( $variation_id, $i ) {

    $diameter = $_POST["diameter"][$i];
    if ( isset( $diameter ) )
        update_post_meta( $variation_id, 'diameter', esc_attr( $diameter ) );

    $thickness = $_POST["thickness"][$i];
    if ( isset( $thickness ) )
        update_post_meta( $variation_id, 'thickness', esc_attr( $thickness ) );

}

我尝试在“product-attributes.php”和“additional-information.php”中显示值,因为我希望新值与原始属性一起显示。

我的产品属性-php

<?php echo get_post_meta( $product->get_id(), 'diameter', true ); ?>
<?php echo get_post_meta( $product->get_id(), 'thickness', true ); ?>

是否有在产品属性表中显示这些值,或者在产品页面的附加信息选项卡中显示这些值?

如果我的问题很愚蠢,请提前抱歉,这是我第一次发帖。我就是无法让它工作

【问题讨论】:

    标签: php wordpress woocommerce


    【解决方案1】:

    我不认为数据正是您请求的位置,但这里有一个通用指南,用于在选择变体时添加/显示自定义变体数据。为了未来的兼容性,我也转而使用 Woo 的 CRUD。

    /**
     * Add custom fields to product variation settings
     *
     * @param string $loop
     * @param array $variation_data
     * @param WP_Post $variation
     * @return array
     */
    function add_variation_options_other_dimensions( $loop, $variation_data, $variation ){
    
        $variation_obj = wc_get_product( $variation->ID );
    
        woocommerce_wp_text_input( array(
            'id' => 'diameter[' . $loop . ']',
            'class' => 'short',
            'label'       => __( 'Diameter', 'woocommerce' ),
            'desc_tip'    => 'true',
            'description' => __( 'Diameter description help.', 'woocommerce' ),
            'value'       => $variation_obj->get_meta( 'diameter', true ),
        ) );
    
        woocommerce_wp_text_input( array(
            'id' => 'thickness[' . $loop . ']',
            'class' => 'short',
            'label'       => __( 'Thickness', 'woocommerce' ),
            'desc_tip'    => 'true',
            'description' => __( 'Thickness description help.', 'woocommerce' ),
            'value'       => $variation_obj->get_meta( 'thickness', true ),
        ) );
    
    }
    add_action( 'woocommerce_product_after_variable_attributes','add_variation_options_other_dimensions', 10, 3 );
    
    
    /**
     * Save product variation custom fields values
     *
     * @param int $variation_id
     * @param int $i
     */
    function save_variation_options_other_dimensions( $variation_id, $i ) {
    
        $variation_obj = wc_get_product( $variation_id );
    
        if ( isset( $_POST["diameter"][$i] ) ) {
            $variation_obj->update_meta_data( 'diameter', wc_clean( $_POST["diameter"][$i] ) );
        }
    
        if ( isset( $_POST["thickness"][$i] ) ) {
            $variation_obj->update_meta_data( 'thickness', wc_clean( $_POST["thickness"][$i] ) );
        }
    
        $variation_obj->save();
    
    }
    add_action( 'woocommerce_save_product_variation','save_variation_options_other_dimensions', 10 ,2 );
    
    /**
     * Add data to json encoded variation form.
     *
     * @param  array $data - this is the variation's json data
     * @param  object $product
     * @param  object $variation
     * @return array
     */
    function kia_available_variation( $data, $product, $variation ){
        $kia_data['diameter']  = $variation->get_meta( 'diameter', true );
        $kia_data['thickness'] = $variation->get_meta( 'thickness', true );
    
        return array_merge( $data, $kia_data );
    
    }
    add_filter( 'woocommerce_available_variation', 'kia_available_variation', 10, 3 );
    
    
    /**
     * Add scripts to variable products.
     */
    function kia_on_found_template_for_variable_add_to_cart() {
        add_action( 'wp_print_footer_scripts', 'kia_variable_footer_scripts', 99 );
    }
    add_action( 'woocommerce_variable_add_to_cart', 'kia_on_found_template_for_variable_add_to_cart', 30 );
    
    
    function kia_variable_footer_scripts() { ?>
    
        <script type="text/template" id="tmpl-variation-template-extra-data">
            <tr class="woocommerce-product-attributes-item woocommerce-product-attributes-item--attribute_diameter extra-data">
                <th class="woocommerce-product-attributes-item__label"><?php esc_html_e( 'Diameter', 'my-text-domain' );?></th>
                <td class="woocommerce-product-attributes-item__value">{{{ data.variation.diameter }}}</td>
            </tr>
            <tr class="woocommerce-product-attributes-item woocommerce-product-attributes-item--attribute_thickness extra-data">
                <th class="woocommerce-product-attributes-item__label"><?php esc_html_e( 'Thickness', 'my-text-domain' );?></th>
                <td class="woocommerce-product-attributes-item__value">{{{ data.variation.thickness }}}</td>
            </tr>
        </script>
    
    
        <script type="text/javascript">
            jQuery( document ).ready(function($) {
                $('form.cart')
                    .on('found_variation', function( event, variation ) {
    
                        template     = wp.template( 'variation-template-extra-data' );
    
                        $template_html = template( {
                            variation: variation
                        } );
    
                        // Remove any existing rows.
                        $('#tab-additional_information').find('.woocommerce-product-attributes tr.extra-data').remove();
                        // Add new rows.
                        $('#tab-additional_information').find('.woocommerce-product-attributes tbody').append( $template_html );
    
                    })
                    .on( 'reset_data', function( event, variation ) {
                        $('#tab-additional_information').find('.woocommerce-product-attributes tr.extra-data').remove();
                    });
            });
        </script>
    <?php
    
    }
    

    【讨论】:

    • 非常感谢你提供了这么棒的代码,它真的帮了很多忙。但是有没有办法将这些信息与来自“additional-information.php”文件的“附加信息选项卡”信息一起显示?让我的新值与标准 woocommerce 变体选项中的标准宽度、高度和长度一起更改,我真的很棒。再次提前感谢,如果我的问题很愚蠢,对不起。并感谢您指出我的 CRUD 方向
    • 如果您不知道答案,问题并不愚蠢。这很复杂,写一个基本的例子更容易。我做了一些调整(主要是对 javascript 和 javascript 模板),它们现在应该会显示在附加信息表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2016-11-24
    • 1970-01-01
    • 2019-01-23
    • 2018-09-08
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多