Php 在WooCommerce中以编程方式应用或删除优惠券后更新总计
我已经创建了一个复选框(看起来不再像复选框),用于在更改时应用/删除coupong。这很有效。但是应用程序上的总数没有更新,页面必须刷新。我用其他函数中的一些剪切和粘贴构建了这个函数,它曾经是一个无线电场,可能不是最佳实践。coupong广告优惠500瑞典克朗 但在应用coupong后,如何重新计算总数 正如您最后看到的,我尝试了WC()->cart->calculate_totals() 这是站点和签出: 这是我的代码:Php 在WooCommerce中以编程方式应用或删除优惠券后更新总计,php,ajax,wordpress,woocommerce,coupon,Php,Ajax,Wordpress,Woocommerce,Coupon,我已经创建了一个复选框(看起来不再像复选框),用于在更改时应用/删除coupong。这很有效。但是应用程序上的总数没有更新,页面必须刷新。我用其他函数中的一些剪切和粘贴构建了这个函数,它曾经是一个无线电场,可能不是最佳实践。coupong广告优惠500瑞典克朗 但在应用coupong后,如何重新计算总数 正如您最后看到的,我尝试了WC()->cart->calculate_totals() 这是站点和签出: 这是我的代码: // Add a custom checkout field
// Add a custom checkout field
add_action( 'woocommerce_review_order_after_shipping', 'checkout_shipping_form_delivery_addition_nifny', 20 );
function checkout_shipping_form_delivery_addition_nifny(){
$domain = 'wocommerce';
if ( WC()->session->get( 'chosen_shipping_methods' )[0] == 'local_pickup:3' ) :
echo '<tr class="delivery-radio"><th>' . __('Gift Card', $domain) . '</th><td>';
$chosen = WC()->session->get('chosen_delivery');
$chosen = empty($chosen) ? WC()->checkout->get_value('delivery') : $chosen;
$chosen = empty($chosen) ? 0 : $chosen;
if( $chosen == 1){ $chosen = true; } else { $chosen = false; }
// Add a custom checkbox field
woocommerce_form_field( 'radio_delivery', array(
'type' => 'checkbox',
'label' => '<label for="radio_delivery" class="checkbox-label"><span class="presentkortbesk">I have a gift card</span><span class="priset">-500kr</span></label>',
'class' => array( 'form-row-wide' ),
'required' => false,
//'default' => false,
), $chosen );
echo '</td></tr>';
endif;
}
// jQuery - Ajax script
add_action( 'wp_footer', 'checkout_delivery_script_nifny' );
function checkout_delivery_script_nifny() {
// Only checkout page
if ( ! is_checkout() ) return;
?>
<script type="text/javascript">
jQuery( function($){
if (typeof wc_checkout_params === 'undefined')
return false;
$('form.checkout').on('change', 'input[name=radio_delivery]', function(e){
e.preventDefault();
var d = $(this).prop('checked') === true ? 1 : 0;
//var d = $(this).val();
//alert('value: '+d);
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'delivery',
'delivery': d,
},
success: function (result) {
$('body').trigger('update_checkout');
//console.log(result); // just for testing | TO BE REMOVED
},
error: function(error){
//console.log(error); // just for testing | TO BE REMOVED
}
});
});
});
</script>
<?php
}
// Get Ajax request and saving to WC session
add_action( 'wp_ajax_delivery', 'wc_get_delivery_ajax_data_nifny' );
add_action( 'wp_ajax_nopriv_delivery', 'wc_get_delivery_ajax_data_nifny' );
function wc_get_delivery_ajax_data_nifny() {
if ( isset($_POST['delivery']) ){
WC()->session->set('chosen_delivery', sanitize_key( $_POST['delivery'] ) );
echo json_encode( $delivery ); // Return the value to jQuery
}
die();
}
// Add a custom dynamic delivery fee
add_action( 'woocommerce_cart_calculate_fees', 'add_packaging_fee_nifny', 20, 1 );
function add_packaging_fee_nifny( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Only for targeted shipping method
if ( WC()->session->get( 'chosen_shipping_methods' )[0] != 'local_pickup:3' )
return;
if( WC()->session->get( 'chosen_delivery' ) == 1 ){
if (!in_array('nynashamn2020', WC()->cart->get_applied_coupons())) {
WC()->cart->apply_coupon('card2020');
//WC()->cart->calculate_totals();
}
} else {
if (in_array('nynashamn2020', WC()->cart->get_applied_coupons())) {
WC()->cart->remove_coupon('card2020');
}
}
}
//添加自定义签出字段
添加操作('woocommerce\u review\u order\u after\u shipping','Check\u shipping\u form\u delivery\u addition\u Nify',20);
功能检查\装运\表格\交付\添加\ nifny(){
$domain='wocommerce';
如果(WC()->session->get('selected\u shipping\u methods')[0]=='local\u pickup:3'):
回音“”。u uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
$selected=WC()->session->get('selected_delivery');
$selected=空($selected)?WC()->checkout->get_value('delivery'):$selected;
$selected=空($selected)?0:$selected;
如果($selected==1){$selected=true;}否则{$selected=false;}
//添加自定义复选框字段
woocommerce\u表单\u字段('无线电传送',数组(
'键入'=>'复选框',
“标签”=>“我有一张礼品卡-500kr”,
'class'=>数组('form row wide'),
“必需”=>false,
//'default'=>false,
),$已选择);
回声';
endif;
}
//jQuery-Ajax脚本
添加操作('wp\u footer'、'checkout\u delivery\u script\u nifny');
函数签出\u传递\u脚本\u nifny(){
//仅签出页面
如果(!is_checkout())返回;
?>
jQuery(函数($){
if(wc\u checkout\u参数的类型==“未定义”)
返回false;
$('form.checkout')。关于('change','input[name=radio_delivery]',函数(e){
e、 预防默认值();
var d=$(this.prop('checked')==true?1:0;
//var d=$(this.val();
//警报('值:'+d);
$.ajax({
键入:“POST”,
url:wc_checkout_params.ajax_url,
数据:{
“操作”:“交付”,
“交付”:d,
},
成功:功能(结果){
$('body')。触发器('update_checkout');
//console.log(result);//仅用于测试|要删除
},
错误:函数(错误){
//console.log(错误);//仅用于测试|要删除
}
});
});
});
您应该在计算总费用之前,替换仅针对具有类似费用的woocommerce\u cart\u calculate\u费用
hook,如下所示:
// Add a custom dynamic delivery fee
add_action( 'woocommerce_before_calculate_totals', 'add_packaging_fee_nifny' );
function add_packaging_fee_nifny( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Only for targeted shipping method
if ( WC()->session->get( 'chosen_shipping_methods' )[0] != 'local_pickup:3' )
return;
if( WC()->session->get( 'chosen_delivery' ) == 1 ){
if (!in_array('nynashamn2020', WC()->cart->get_applied_coupons())) {
WC()->cart->apply_coupon('card2020');
//WC()->cart->calculate_totals();
}
} else {
if (in_array('nynashamn2020', WC()->cart->get_applied_coupons())) {
WC()->cart->remove_coupon('card2020');
}
}
}
代码进入活动子主题(或活动主题)的functions.php文件。它应该更好地工作。首先,你应该始终提供你选择的原始代码的链接,以制作你自己的代码…现在你应该替换woocommerce\u cart\u calculate\u fees
hook,它仅用于类似woocommerce\u before\u calculate\u totals
的费用。还有为什么有两个优惠券代码:de>nynashamn2020
和card2020
?为什么要检查nynashamn2020
优惠券代码来添加或删除card2020
优惠券代码?事实上,在计算总数之前切换到woocommerce成功了!谢谢!