php - 刷新页面后 Ajax 不适用于第一次 wordpress/woocommerce
问题描述
我在 function.php 文件中有一些代码。我有 ajax 函数,我在会话中设置变量,并在 function.php 的某个钩子中使用它。
阿贾克斯:
<script type="text/javascript">
jQuery( function($){
$('form.checkout').on('change', 'input[name=radio_choice]', function(e){
e.preventDefault();
var p = $(this).val();
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'woo_get_ajax_data',
'radio': p,
},
success: function (result) {
$('body').trigger('update_checkout');
}
});
});
});
</script>
PHP:(这个函数是从我设置会话变量的ajax调用的)
add_action('wp_ajax_woo_get_ajax_data','bbloomer_checkout_radio_choice_set_session' );
add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'bbloomer_checkout_radio_choice_set_session' );
function bbloomer_checkout_radio_choice_set_session() {
if ( isset($_POST['radio']) ){
$radio = sanitize_key( $_POST['radio'] );
WC()->session->set('radio_chosen', $radio );
echo json_encode( $radio );
}
die();
}
下面的函数我用来检查会话变量是否存在,这取决于我有一些逻辑。
add_action( 'woocommerce_cart_calculate_fees', 'bbloomer_checkout_radio_choice_fee', 20, 1 );
function bbloomer_checkout_radio_choice_fee($cart) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
global $wpdb;
global $post;
global $DOPBSP;
global $DOPBSPWooCommerce;
global $woocommerce;
if ( is_page( 'cart' ) || is_cart()) {
$radio = WC()->session->__unset( 'radio_chosen' );
if($radio == '')
{
WC()->customer->set_is_vat_exempt( false );
}
}else{
$radio = WC()->session->get( 'radio_chosen' );
}
//echo $radio; die;
if ($radio == "option_1") {
$percentage = 40;
} elseif ($radio == "option_2") {
$percentage = 0;
}
if ( $woocommerce->cart->get_cart_contents_count() == 1) {
// 40 %
$discount = 0;
foreach ($woocommerce->cart->get_cart() as $cart_item ) {
$reservations_data = $wpdb->get_results($wpdb->prepare('SELECT * FROM '.$DOPBSPWooCommerce->tables->woocommerce.' WHERE token="%s" AND product_id=%d ORDER BY id',$cart_item['dopbsp_token'], $cart_item['product_id']));
$main_data = $reservations_data[0]->data;
$reservation = json_decode($main_data);
$checkdate = $reservation->check_in;
$checkoutdate = $reservation->check_out;
$product_prices_excl_tax[] = wc_get_price_excluding_tax( $cart_item['data'] );
if($checkdate != '' && $checkoutdate != ''){
if($checkdate == $checkoutdate){
//$cart_item['data']->set_tax_class( 'Zero rate' );
if($percentage == 0){
if($radio != ''){
WC()->customer->set_is_vat_exempt( true );
}
}else{
//echo "Fsf";die;
if($radio != ''){
WC()->customer->set_is_vat_exempt( false );
}
}
}
else{
$product = wc_get_product( $cart_item['product_id'] );
$price = $product->get_price();
$timeDiff = abs(strtotime($checkoutdate) - strtotime($checkdate));
$numberDays = $timeDiff/86400;
$numberDays1 = intval($numberDays);
$main_discount = $price * $percentage / 100;
$discount = $main_discount * $numberDays1;
$woocommerce->cart->add_fee( "Rabais (".$percentage."%)", -$discount );
if($percentage == 0){
if($radio != ''){
WC()->customer->set_is_vat_exempt( true );
}
}else{
if($radio != ''){
WC()->customer->set_is_vat_exempt( false );
}
}
}
}
}
}
//wp_die();
}
现在真正的问题是,在刷新页面时,我检查我得到会话变量,但它没有显示效果,而且在刷新页面 Ajax 后第一次也不起作用。
任何帮助都会很棒。
解决方案
推荐阅读
- plsql - PL SQL 嵌套子查询
- sql - 比较 postgres 数据库中的两列
- android - 屏幕锁定时如何显示来电屏幕?
- java - Java DecimalFormat(和 taglib fmt:formatNumber)将 0.00 格式化为 --0.00
- python - 在python中创建对象矩阵
- reactjs - 使用 API Gateway 和 Lambda 函数的 S3 分段上传
- sql - SQL 序列从个位数跳到 1000 再到 2000。如何让它回到原来的序列?
- excel - 是否可以允许在受保护的工作表中折叠/展开?
- mysql - 根据同一记录的其他字段中的值更新记录的字段
- ansible - Ansible:将字典转换为名称=值字符串