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