wordpress 如何更新购物车项目的数量和价格基于自定义选择字段结帐在woocommerce

anauzrmj  于 2023-01-12  发布在  WordPress
关注(0)|答案(2)|浏览(220)

我正在尝试更新购物车项目数量及其价格的基础上自定义选择字段结帐。如果有人选择“单人”选项从下拉菜单中,那么数量将是1,如果有人选择“双人”从下拉菜单中,那么购物车数量将更新为2,价格也将更新。
用户只能添加一个产品到购物车,这里是参考链接,从那里我得到了一些帮助.
https://www.webroomtech.com/woocommerce-checkout-change-quantity-and-delete-products/

我使用wordpress AJAX 调用来实现这一点。
functions.php中我有以下代码

function customjs_script_add_quanity_js() {
wp_enqueue_script( 'checkout_script', get_stylesheet_directory_uri() . '/assets/js/add_quantity.js', array('jquery') );
wp_localize_script( 'checkout_script', 'add_quantity', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}
add_action( 'wp_enqueue_scripts', 'customjs_script_add_quanity_js' );

function custom_addqty_load_ajax() {
if ( !is_user_logged_in() ){
add_action( 'wp_ajax_nopriv_update_order_review', 'anp_update_order_review' );
} else{
add_action( 'wp_ajax_update_order_review', 'anp_update_order_review' );
}
}
add_action( 'init', 'custom_addqty_load_ajax' );

function anp_update_order_review() {
$numberof_people = intval($_POST['number_of_people']);
$values = array();
parse_str($_POST['post_data'], $values);

$cart = $values['cart']; //This have no values in it, 

foreach ( $cart as $cart_key => $cart_value ){
WC()->cart->set_quantity( $cart_key, $numberof_people);
WC()->cart->calculate_totals();
woocommerce_cart_totals();
}
wp_die();
}

In my **add_quantity.js** file

jQuery(function() {
jQuery( "form.checkout" ).on( "change", ".woocommerce-additional-fields select#______NumberOfTravelers______", function( ) {

//console.log('on chage called');
var number_of_people = jQuery(this).val();

var data = {
action: 'update_order_review',
security: wc_checkout_params.update_order_review_nonce,
number_of_people: number_of_people,
post_data: jQuery( 'form.checkout' ).serialize()
};

jQuery.post( add_quantity.ajax_url, data, function( response )
{
jQuery( 'body' ).trigger( 'update_checkout' );
console.log('success');
});

});

});

我在 AJAX 函数中的$cart变量显示为空,并且购物车没有在选择字段更改时更新。任何帮助都将不胜感激。谢谢
我已经更新了我的代码function.phpadd_quantity.js

function customjs_script_add_quanity_js() {
    wp_enqueue_script( 'checkout_script', get_stylesheet_directory_uri() . '/assets/js/add_quantity.js', array('jquery') );
    wp_localize_script( 'checkout_script', 'add_quantity', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}
add_action( 'wp_enqueue_scripts', 'customjs_script_add_quanity_js' );

function anp_update_order_review() {
    $numberof_people = intval($_POST['number_of_people']);

    $cart = WC()->cart->get_cart(); 

    foreach ( $cart as $cart_item_key => $item ){
    WC()->cart->set_quantity( $cart_item_key, $numberof_people);
    WC()->cart->calculate_totals();
    woocommerce_cart_totals(); //checkout order total not calculating correctly and cart items quantity and price not changing
    }
    wp_die();
}
add_action( 'wp_ajax_nopriv_update_order_review', 'anp_update_order_review' );
add_action( 'wp_ajax_update_order_review', 'anp_update_order_review' );

更新的add_quantity.js文件

jQuery(function() {
 jQuery( "form.checkout" ).on( "change", ".woocommerce-additional-fields select#________NumberOfTravelers________", function( ) {

    var number_of_people = jQuery(this).val();
    //console.log('nop: ' + number_of_people);

  var data = {
    action: 'update_order_review',
    number_of_people: number_of_people,
    security: wc_checkout_params.update_order_review_nonce
  };

  jQuery.post( add_quantity.ajax_url, data, function( response )
  {
    jQuery( 'body' ).trigger( 'update_checkout' );
    console.log('success');
  });

});

});

现在,这开始工作,但它计算错误的价格结帐订单表底部和购物车项目的数量和价格不更新下拉选择。

b4qexyjb

b4qexyjb1#

我认为你不需要序列化 checkout 表单数据。只是在你 AJAX 函数使用以下代码:

$cart = WC()->cart;
0yycz8jy

0yycz8jy2#

对于你的 AJAX 函数,你不需要检查用户是否已经登录。2默认情况下,WordPress会检查钩子是在管理端还是前端。3另外,你可以从函数内部调用钩子。

function anp_update_order_review() {
    $numberof_people = intval($_POST['number_of_people']);
    $values = array();
    parse_str($_POST['post_data'], $values);

    $cart = $values['cart']; //This have no values in it, 

    foreach ( $cart as $cart_key => $cart_value ){
        WC()->cart->set_quantity( $cart_key, $numberof_people);
        WC()->cart->calculate_totals();
        woocommerce_cart_totals();
    }
    wp_die();
}
add_action( 'wp_ajax_nopriv_update_order_review', 'anp_update_order_review' );
add_action( 'wp_ajax_update_order_review', 'anp_update_order_review' );

相关问题