woocommerce 自定义结帐字段以增加订购 ajax 的费用
Posted
技术标签:
【中文标题】woocommerce 自定义结帐字段以增加订购 ajax 的费用【英文标题】:woocommerce custom checkout field to add fee to order ajax 【发布时间】:2015-11-14 03:26:18 【问题描述】:我正在尝试在结帐时将自定义费用添加到订单总额中。 我在 woocommerce 中添加了一个复选框
add_action( 'woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout' );
function add_box_option_to_checkout( $checkout )
echo '<div id="message_fields">';
woocommerce_form_field( 'add_gift_box', array(
'type' => 'checkbox',
'class' => array('add_gift_box form-row-wide'),
'label' => __('Ilość pudełek ozdobnych - 25 PLN/szt'),
'placeholder' => __(''),
), $checkout->get_value( 'add_gift_box' ));
包含一个应该处理事件的自定义 js 文件
jQuery( document ).ready(function( $ )
$('#add_gift_box').click(function()
var data =
action: 'woocommerce_add_gift_box',
state: '200',
;
jQuery.ajax(
type: 'POST',
url: wc_checkout_params.ajax_url,
data: data,
success: function (code)
console.log(code);
jQuery('body').trigger('update_checkout');
,
dataType: 'html'
);
);
);
还有一个php手续费处理函数
function woo_add_cart_fee( $data )
if ( is_admin() && ! defined( 'DOING_AJAX' ) || ! $_POST ) return;
$extracost = 0;
if (isset($_POST['state']))
$extracost = intval($_POST['state']);
WC()->cart->add_fee( 'Ozdobne pudełka:', $extracost );
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
add_action('wp_ajax_woocommerce_add_gift_box', 'woo_add_cart_fee', 10);
add_action('wp_ajax_nopriv_woocommerce_add_gift_box', 'woo_add_cart_fee', 10);
由于某些原因,$_POST['state'] 的值没有被添加,当我给出一个硬编码的值时,该函数可以工作,我尝试了很多选项,但无法让它工作。
我看过类似的帖子,但都没有答案。
【问题讨论】:
你有想过这个吗? 还没有 - 找到答案后我会发布更新,现在我使用结帐插件来实现这一点 【参考方案1】:post数据由'post_data'中的AJAX函数发送,序列化。所以要获取你的复选框的值,你只需要parse_str()
这个!
parse_str( $_POST['post_data'], $post_data );
那么您可以从$post_data['add_gift_box']
获取您的“add_gift_box”选项。请注意,订单完成后,此“post_data”元素不再可用,所有内容都在$_POST
中。
完整示例,基于您的代码:
1) 将复选框添加到结帐
add_action( 'woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout' );
function add_box_option_to_checkout( $checkout )
echo '<div id="message_fields">';
woocommerce_form_field( 'add_gift_box', array(
'type' => 'checkbox',
'class' => array('add_gift_box form-row-wide'),
'label' => __('Ilość pudełek ozdobnych - 25 PLN/szt'),
'placeholder' => __(''),
), $checkout->get_value( 'add_gift_box' ));
echo '</div>';
2) 单击复选框时更新购物车的脚本(无需额外的 AJAX 请求!)
add_action( 'wp_footer', 'woocommerce_add_gift_box' );
function woocommerce_add_gift_box()
if (is_checkout())
?>
<script type="text/javascript">
jQuery( document ).ready(function( $ )
$('#add_gift_box').click(function()
jQuery('body').trigger('update_checkout');
);
);
</script>
<?php
3) 添加费用的操作
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart )
if ( ! $_POST || ( is_admin() && ! is_ajax() ) )
return;
if ( isset( $_POST['post_data'] ) )
parse_str( $_POST['post_data'], $post_data );
else
$post_data = $_POST; // fallback for final checkout (non-ajax)
if (isset($post_data['add_gift_box']))
$extracost = 25; // not sure why you used intval($_POST['state']) ?
WC()->cart->add_fee( 'Ozdobne pudełka:', $extracost );
【讨论】:
谢谢。我会检查一下。 这很棒!但出于好奇,jquery trigger('update_checkout') 是如何触发函数 woo_add_cart_fee 的? update_checkout 会将所有结帐表单数据发送到 WooCommerce 并更新总数。此更新期间触发的操作之一(服务器端)是woocommerce_cart_calculate_fees
,因此它正在执行woo_add_cart_fee()
完美运行。如何将其应用到添加到购物车部分而不是结帐页面的下方?
完美。我花了两个小时试图让这样的东西起作用。我不知道 update_checkout【参考方案2】:
这太棒了!非常感谢。我已经对其进行了一些更改以添加百分比。我知道这不是一个更好的答案,但我没有声誉来推动你的答案。对于像我一样被卡住的人..
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' ); function woo_add_cart_fee( $cart )
global $woocommerce;
if ( ! $_POST || ( is_admin() && ! is_ajax() ) )
return;
if ( isset( $_POST['post_data'] ) )
parse_str( $_POST['post_data'], $post_data );
else
$post_data = $_POST; // fallback for final checkout (non-ajax)
if (isset($post_data['add_gift_box']))
$percentage = 0.01;
$surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage;
$woocommerce->cart->add_fee( 'Surcharge', $surcharge, true, '' );
【讨论】:
以上是关于woocommerce 自定义结帐字段以增加订购 ajax 的费用的主要内容,如果未能解决你的问题,请参考以下文章
根据 WooCommerce 中的自定义结帐单选按钮和文本字段设置动态费用
php [使用操作和过滤器自定义结帐字段]保存WooCommerce自定义结帐字段
php [使用操作和过滤器自定义结帐字段]验证WooCommerce自定义结帐字段