我正在尝试在结帐时在订单总额中添加自定义费用。 我在 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'] 的值,当我给出硬编码值时,该函数可以工作,我已经尝试了很多选项,但无法使其工作。
我看过类似的帖子,但没有一个给出答案。
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 );
}
}
这太棒了!!多谢。我对其进行了一些更改以添加百分比。我知道这不是一个更好的答案,但我没有声誉来推动你的答案。对于像我一样被困的人..
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, '' );
}
}
这里有一个选项,可以询问捐赠者是否愿意在订单中添加 3% 以支付信用卡处理费。我在一个网站上使用了它,访问者可以使用 woocommerce 进行捐款。我的答案只是之前答案的混合。
/**********************************************************************/
// add extra fee option at checkout
// https://stackoverflow.com/questions/32119053/woocommerce-custom-checkout-field-to-add-fee-to-order-ajax/37885246#37885246
add_action( 'woocommerce_after_checkout_billing_form', 'add_fee_option_to_checkout' );
function add_fee_option_to_checkout( $checkout ) {
echo '<div id="message_fields" class="bank-fees" span style="
border: 2px solid orange;
padding: 10px;
margin: 10px 0;
">
<h3>Pay Bank Fee?</h3>
<p>Thank you for your donation! The bank charges us a 3% processing fee. Please tick the box if you are willing to cover this fee, thank you. ';
woocommerce_form_field( 'add_fee_option', array(
'type' => 'checkbox',
'class' => array('add_fee_option form-row-wide'),
'label' => __('Pay bank transaction fees (3%)? '),
'placeholder' => __(''),
), $checkout->get_value( 'add_fee_option' ));
echo '</div>';
}
add_action( 'wp_footer', 'woocommerce_add_fee_option' );
function woocommerce_add_fee_option() {
if (is_checkout()) {
?>
<script type="text/javascript">
jQuery( document ).ready(function( $ ) {
$('#add_fee_option').click(function(){
jQuery('body').trigger('update_checkout');
});
});
</script>
<?php
}
}
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_fee_option'])) {
$percentage = 0.03;
$surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage;
$woocommerce->cart->add_fee( 'Bank Fee', $surcharge, true, '' );
}
}