php - 在订单页面/结帐/电子邮件中显示自定义字段数据
问题描述
我有以下自定义字段
显然我有一种感觉,它没有保存到数据库中,它如何为自定义字段完成整个流程
问题是它没有显示我在产品中添加的自定义字段,谢谢
我试图找到各种解决方案,但到目前为止,我还没有得到关于我目前提出的这个问题的一些信息
add_action( 'woocommerce_before_add_to_cart_button', 'fabric_length_product_field' );
function fabric_length_product_field() {
global $product;
if( $product->is_type('variable') ) return; // Not variable products
$domain = 'woocommerce';
$text = array(
__('cards', $domain),
__('card', $domain),
__('Total', $domain),
get_woocommerce_currency_symbol(),
);
// Select Options array
$options = array(
"" => __('Select package'),
"12.00" => "1000 {$text[0]} - {$text[3]}0.012/{$text[1]} - {$text[2]} {$text[3]}12.00",
"15.00" => "2000 {$text[0]} - {$text[3]}0.008/{$text[1]} - {$text[2]} {$text[3]}15.00",
"20.00" => "3000 {$text[0]} - {$text[3]}0.007/{$text[1]} - {$text[2]} {$text[3]}20.00",
"25.00" => "4000 {$text[0]} - {$text[3]}0.006/{$text[1]} - {$text[2]} {$text[3]}25.00",
);
// Select field
woocommerce_form_field('cards_pack', array(
'type' => 'select',
'class' => array('my-field-class form-row-wide'),
'label' => __('Cards Pack selection', $domain),
'required' => true,
'options' => $options,
),'');
// Data to be transmitted to jQuery
$base_price = (float) wc_get_price_to_display( $product );
$prices = array(
'' => wc_price($base_price),
'12.00' => wc_price($base_price + 12),
'15.00' => wc_price($base_price + 15),
'20.00' => wc_price($base_price + 20),
'25.00' => wc_price($base_price + 25),
)
// jQuery code
?>
<script>
jQuery(function($){
var a = <?php echo json_encode($prices); ?>,
b = 'p.price',
c = 'select[name="cards_pack"]';
$(c).on( 'change', function(){
$.each( a, function( key, value ){
if( $(c).val() == key )
$(b).html(value);
});
});
});
</script>
<?php
}
// Add selected pack data as custom data to cart items
add_filter( 'woocommerce_add_cart_item_data', 'add_pack_data_to_cart_item_data', 20, 2 );
function add_pack_data_to_cart_item_data( $cart_item_data, $product_id ){
if( ! isset($_POST['cards_pack']) )
return $cart_item_data;
$pack_price = (float) sanitize_text_field( $_POST['cards_pack'] );
if( empty($pack_price) )
return $cart_item_data;
if($pack_price == 12.00) $cards = 1000;
elseif($pack_price == 15.00) $cards = 2000;
elseif($pack_price == 20.00) $cards = 3000;
elseif($pack_price == 25.00) $cards = 4000;
$product = wc_get_product($product_id); // The WC_Product Object
$base_price = (float) $product->get_price();
// New price calculation
$new_price = $base_price + $pack_price;
// Prepare and save the data array
$cart_item_data['pack_data'] = array(
'cards' => (int) $cards,
'pack' => (int) $pack_price,
'new_price' => (float) $new_price,
);
$cart_item_data['unique_key'] = md5( microtime() . rand() ); // Make each item unique
return $cart_item_data;
}
// Set conditionally a custom item price
add_action('woocommerce_before_calculate_totals', 'set_cutom_cart_item_price', 20, 1);
function set_cutom_cart_item_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
foreach ( $cart->get_cart() as $cart_item ) {
if ( isset( $cart_item['pack_data']['new_price'] ) )
$cart_item['data']->set_price( $cart_item['pack_data']['new_price'] );
}
}
// Display custom data in checkout page
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 10, 2 );
function display_custom_cart_item_data( $cart_data, $cart_item ) {
$domain = 'woocommerce';
if ( isset( $cart_item['pack_data']['new_price'] ) ){
$cart_data[] = array('name' => __( 'Cards pack', $domain ),
'value' => $cart_item['pack_data']['cards'] );
}
return $cart_data;
}
解决方案
推荐阅读
- google-cloud-platform - GCP:设置从 Spanner 到 Big Query 的定期数据管道的最佳选择是什么
- r - 如何编写在数值(在 R 中)中包含前导零的 substr 版本?
- reactjs - 为什么在回调中调用时我的状态总是默认值?
- reactjs - 我无法在我的反应应用程序的生产版本中访问路线
- javascript - 单击下拉项目时不要关闭下拉菜单
- sqlite - 在 SQLite 浏览器中查看数据库数据时要定位哪个文件
- elastic-stack - 仅仪表板模式用户的内部服务器错误
- node.js - 通过 nodejs 套接字发送和接收十六进制代码
- python - 如何从while循环中获取所有价值而不仅仅是第一次迭代?
- vert.x - 如何异步编写一个 http REST 服务