Php 自定义商业产品变体属性

Php 自定义商业产品变体属性,php,wordpress,woocommerce,Php,Wordpress,Woocommerce,我看到过类似的问题,也尝试过所有的解决方案,但没有一个适合我的项目 我的所有产品都有额外的规格,当客户在产品页面上选择不同的变体时,这些规格需要更改。我需要在产品属性表中显示规格 到目前为止,我已经尝试了几种不同的方法,但我的代码到目前为止是这样的。我可以从“编辑产品”页面获取要保存的额外数据,但我不知道如何将其显示在产品页面上 Functions.php // Add custom fields to product variation settings add_action( 'woocom

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

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

Functions.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 echo get_post_meta( $product->get_id(), 'diameter', true ); ?>
<?php echo get_post_meta( $product->get_id(), 'thickness', true ); ?>


是否仍要在产品属性表中或在产品页面的“附加信息”选项卡中显示这些值


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

我认为数据并不是您所要求的,但这里有一个在选择变量时添加/显示自定义变量数据的一般指南。为了将来的兼容性,我也改用吴的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

}
/**
*将自定义字段添加到产品变体设置
*
*@param string$loop
*@param数组$variation\u数据
*@param WP_Post$variation
*@return数组
*/
函数添加变量选项其他维度($loop,$VARIANCE,$data,$VARIANCE){
$variation\u obj=wc\u get\u产品($variation->ID);
woocommerce_wp_text_输入(数组(
'id'=>'直径['.$loop.']',
“类”=>“短”,
'label'=>uuuu('Diameter','woocommerce'),
'desc_tip'=>'true',
'description'=>\('Diameter description help.','woocommerce'),
“值”=>$variation\u obj->get\u meta('diameter',true),
) );
woocommerce_wp_text_输入(数组(
“id'=>“厚度['.$loop.']”,
“类”=>“短”,
'label'=>uuu('Thickness','woocommerce'),
'desc_tip'=>'true',
'description'=>\('Thickness description help.','woocommerce'),
“值”=>$variation\u obj->get\u meta('thickness',true),
) );
}
添加操作('woocommerce\u product\u after\u variable\u attributes','add\u variation\u options\u other\u dimensions',10,3);
/**
*保存产品变量自定义字段值
*
*@param int$variation\u id
*@param int$i
*/
函数保存变量选项其他维度($variation\u id,$i){
$variation\u obj=wc\u get\u产品($variation\u id);
如果(isset($_POST[“直径”][$i])){
$variation_obj->update_meta_data('diameter',wc_clean($_POST[“diameter”][$i]);
}
如果(isset($_POST[“厚度”][$i])){
$variation_obj->update_meta_data('thickness',wc_clean($_POST[“thickness”][$i]);
}
$variation_obj->save();
}
添加操作('woocommerce\u save\u product\u variation'、'save\u variation\u options\u other\u dimensions',10,2);
/**
*将数据添加到json编码的变体表单中。
*
*@param array$data-这是变体的json数据
*@param object$product
*@param object$variation
*@return数组
*/
功能起亚可用变化($data、$product、$VARIANCE){
$kia_数据['diameter']=$variation->get_meta('diameter',true);
$kia_数据['thickness']=$variation->get_meta('thickness',true);
返回数组\u merge($data,$kia\u data);
}
添加过滤器('woocommerce\u available\u variation'、'kia\u available\u variation',10,3);
/**
*向可变产品添加脚本。
*/
函数kia\u on\u找到了\u变量的模板\u添加到\u购物车(){
添加操作(“wp打印页脚脚本”,“kia变量页脚脚本”,99);
}
添加操作('woocommerce\u variable\u add\u to\u cart'、'kia\u on\u found\u模板\u for\u variable\u add\u to\u cart',30);
函数kia_变量_页脚_脚本(){?>
{{{data.variation.diameter}}}
{{{data.variation.thickness}}}
jQuery(文档).ready(函数($){
$('form.cart')
.on('found_variation',函数(事件、变量){
模板=wp.template(‘变体模板额外数据’);
$template_html=模板({
变异:变异
} );
//删除所有现有行。
$(“#选项卡-附加信息”).find(“.woocommerce产品属性tr.extra-data”).remove();
//添加新行。
$(“#选项卡-附加信息”).find(“.woocommerce产品属性tbody”).append($template\u html);
})
.on('reset_data',功能(事件、变化){
$(“#选项卡-附加信息”).find(“.woocommerce产品属性tr.extra-data”).remove();
});
});

非常感谢您编写了这么棒的代码,它确实帮助了很多。但是有没有一种方法可以将这些信息与来自“Additional information.php”的“Additional information tab”信息一起显示呢文件?如果我的新值与标准woocommerce变体选项中的标准宽度、高度和长度一起更改,我会非常高兴。再次提前感谢,如果我的问题是愚蠢的,我也很抱歉。谢谢你向我指出CRUD方向。如果你不知道答案,问题不是愚蠢的。这很复杂,很简单我已经做了一些调整(主要是对javascript和javascript模板),它们现在应该显示在附加信息表中。