#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
, но с тем же результатом… Хм.