自定义Woocommerce产品变体属性

时间:2019-10-29 15:00:27

标签: php wordpress woocommerce

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

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

Functions.php

getDataFromFirestore

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

我的产品属性php

insert()

在产品页面的“附加信息”标签中,是否仍要在产品属性表中或紧随其后显示这些值?

对不起,如果我的问题很愚蠢,这是我第一次发布。我就是无法正常工作

1 个答案:

答案 0 :(得分:0)

我认为数据并不是您要求的确切位置,但是这里是用于在选择变体时添加/显示自定义变体数据的一般指南。我还转换为使用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

}