WooCommerce устанавливает количество корзин с помощью AJAX?

#javascript #php #ajax #wordpress #woocommerce

Вопрос:

Я уже несколько дней ломаю голову над этим вопросом, и мне нужны некоторые указания.

Я создаю пользовательскую тему полностью с нуля для сайта WooCommerce, и теперь я пытаюсь заставить функциональность корзины работать. Я застрял в попытке создать кнопки ( /-) для обновления количества товара в корзине.

Мне кажется, проблема в том, что WC() Я использую внутри functions.php это не тот же экземпляр, что и текущая интерфейсная сессия, или что-то в этом роде. По крайней мере, моя мысль на данный момент.

Если я правильно отладил WC()->cart->set_quantity($cart_item_key, 0) , то ошибка не возникает (при использовании числа 0), все остальные числа дают » 500 (Внутренняя ошибка сервера)». Но даже при 0 количество в корзине, тем не менее, никогда не меняется.

Я правильно поставил сценарии в очередь, поэтому вызов функции AJAX выполняется нормально при нажатии кнопки.

Вот мой HTML и PHP (упрощенный)

 <div class="cart-items">
    <?php foreach(WC()->cart->get_cart() as $cart_item_key => $cart_item) : ?>
    <div class="cart-item">
        <div class="quantity" id="cart-qty-<?php echo $cart_item_key ?>">
            <button class="minus" id="cart-subtract"
                onclick="updateCartQuantity('<?php echo $cart_item_key ?>', '<?php echo $cart_item['quantity'] ?>', -1)">-</button>
            <p><?php echo $cart_item['quantity'] ?></p>
            <button class="plus" id="cart-add"> </button>
        </div>
    </div>
    <? endforeach; ?>
</div>
 

Вот мой JS (внутри файла под названием shopping-ajax.js)

 function updateCartQuantity(cart_item_key, current_qty, value) {
  function qty_cart() {
    jQuery.ajax({
      type: "POST",
      url: my_ajax_object.ajax_url,
      data: {
        action: "update_cart",
        hash: cart_item_key,
        quantity: current_qty,
        value: value,
      },
      success: function (data) {
        console.log(data);
      },
      error: function (data) {
        console.log(data);
      },
    });
  }

  qty_cart();
}
 

Вот моя функция PHP (внутри functions.php)

 function updateCartQuantity(){
    $cart_item_key = $_REQUEST['cart_item_key'];
    $quantity = $_REQUEST['quantity'];
    $value = $_REQUEST['value'];
    
    WC()->cart->set_quantity($cart_item_key, $quantity   $value);

    echo $quantity   $value;
    wp_die();
}
add_action( 'wp_ajax_nopriv_update_cart', 'updateCartQuantity' );
add_action( 'wp_ajax_update_cart', 'updateCartQuantity' );
 

Огромное спасибо за любую помощь или указатель заранее!

Ответ №1:

Вы должны управлять количеством продукта в соответствии с полем ввода количества(изменить количество).

Мой JS:

расположение: каталог тем -> js ->> custom.js

 jQuery( function( $ ) {
    $( document ).on( 'change', 'input.qty', function() {
        var $thisbutton = $(this);
        var item_hash = $( this ).attr( 'name' ).replace(/cart[([w] )][qty]/g, "$1");
        var item_quantity = $( this ).val();
        var currentVal = parseFloat(item_quantity);
        $.ajax({
            type: 'POST',
            url: cart_qty_ajax.ajax_url,
            data: {
                action: 'my_cart_qty',
                hash: item_hash,
                quantity: currentVal
            },
            success: function(response) {
                jQuery(document.body).trigger('added_to_cart', [response.fragments, response.cart_hash, $thisbutton]);
                //jQuery(document.body).trigger('update_checkout');
            }
        });  
    });
});
 

fuctions.php —

Настройка Сценариев Ajax В Очереди:

 function enqueue_cart_qty_ajax() {

    wp_register_script( 'my_cart_qty-ajax-js', get_template_directory_uri() . '/js/custom.js', array( 'jquery' ), '', true );
    wp_localize_script( 'my_cart_qty-ajax-js', 'cart_qty_ajax', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
    wp_enqueue_script( 'my_cart_qty-ajax-js' );

}
add_action('wp_enqueue_scripts', 'enqueue_cart_qty_ajax');
 

Вызов Ajax —

 function ajax_my_cart_qty() {

    // Set item key as the hash found in input.qty's name
    $cart_item_key = $_POST['hash'];

    // Get the array of values owned by the product we're updating
    $threeball_product_values = WC()->cart->get_cart_item( $cart_item_key );

    // Get the quantity of the item in the cart
    $threeball_product_quantity = apply_filters( 'woocommerce_stock_amount_cart_item', apply_filters( 'woocommerce_stock_amount', preg_replace( "/[^0-9.]/", '', filter_var($_POST['quantity'], FILTER_SANITIZE_NUMBER_INT)) ), $cart_item_key );

    // Update cart validation
    $passed_validation  = apply_filters( 'woocommerce_update_cart_validation', true, $cart_item_key, $threeball_product_values, $threeball_product_quantity );

    // Update the quantity of the item in the cart
    if ( $passed_validation ) {
        WC()->cart->set_quantity( $cart_item_key, $threeball_product_quantity, true );
    }

    // Refresh the page
    echo do_shortcode( '[woocommerce_cart]' );

    die();

}

add_action('wp_ajax_my_cart_qty', 'ajax_my_cart_qty');
add_action('wp_ajax_nopriv_my_cart_qty', 'ajax_my_cart_qty');
 

Комментарии:

1. Спасибо за ваш ответ, но ваш код все еще не работает. Я все еще получаю » 500 (Внутренняя ошибка сервера)», и именно эта строка вызывает это: WC()->cart->set_quantity( $cart_item_key, $threeball_product_quantity, true ); .

2. Проверьте URL-адрес «cart_qty_ajax.ajax_url» правильно, потому что, когда я проверяю этот код на своем сайте WordPress, он работает на 100%. Я поделился этим кодом после тестирования на своем сайте WordPress.

3. Проверил, и это правильно, вызов AJAX выполняется. После копания, похоже, возникла проблема, когда он не может правильно доставить тележку, и WC()->cart->get_cart_item( $cart_item_key ) то и другое и WC()->cart->set_quantity( $cart_item_key, $threeball_product_quantity, true ); не работает. Я все понимаю правильно $cart_item_key , хотя и не понимаю, почему это так. Мне кажется, что WC() в этом и заключается проблема, но я не знаю почему… То function ajax_my_cart_qty() , что внутри functions.php файл

4. Если у wc есть проблемы на вашей стороне, не волнуйтесь, вы можете добавить глобальную $woocommerce; поверх функции функция ajax_my_cart_qty (), например, — функция ajax_my_cart_qty() { глобальная $woocommerce; } и заменить WC()->корзина->> на $woocommerce->>>корзина->>>> везде, где это: $woocommerce->>>>>корзина->>> > > > get_cart_item($cart_item_key);

5. Это самое странное, я пробовал gloabl $woocommerce , но с тем же результатом… Хм.