Вопрос или проблема
Я добавил кнопку удаления для товаров на странице оформления заказа.
Код –
function add_delete( $product_title, $cart_item, $cart_item_key ) {
if ( is_checkout() ) {
/* Получить корзину пользователя */
$cart = WC()->cart->get_cart();
foreach ( $cart as $cart_key => $cart_value ){
if ( $cart_key == $cart_item_key ){
$product_id = $cart_item['product_id'];
$_product = $cart_item['data'] ;
/*Добавить значок удаления */
$return_value = sprintf(
'<a href="https://wordpress.stackexchange.com/questions/320237/%s" class="remove" title="https://wordpress.stackexchange.com/questions/320237/%s" data-product_id="https://wordpress.stackexchange.com/questions/320237/%s" data-product_sku="https://wordpress.stackexchange.com/questions/320237/%s" data-cart_item_key="https://wordpress.stackexchange.com/questions/320237/%s">×</a>',
esc_url( WC()->cart->get_remove_url( $cart_key ) ),
__( 'Удалить этот товар', 'woocommerce' ),
esc_attr( $product_id ),
esc_attr( $_product->get_sku() ),
esc_attr( $cart_item_key )
);
/* Добавить имя продукта */
$return_value .= ' <span class = "product_name" >' . $product_title . '</span>' ;
return $return_value;
}
}
}else{
$_product = $cart_item['data'] ;
$product_permalink = $_product->is_visible() ? $_product->get_permalink( $cart_item ) : '';
if ( ! $product_permalink ) {
$return_value = $_product->get_title() . ' ';
} else {
$return_value = sprintf( '<a href="https://wordpress.stackexchange.com/questions/320237/%s">%s</a>', esc_url( $product_permalink ), $_product->get_title());
}
return $return_value;
}
}
add_filter ('woocommerce_cart_item_name', 'add_delete' , 10, 3 );
Это работает хорошо.
Но для удаления товара обновляется вся страница, в отличие от страницы корзины.
Страница корзины использует ajax для удаления товара. И я пытаюсь сделать то же самое здесь. Но проблема в том, что я не знаю много об Ajax.
Вот что я попробовал.
JavaScript
jQuery(document).ready(function($){
$(document).on('click', 'tr.cart_item a.remove', function (e)
{
e.preventDefault();
var product_id = $(this).attr("data-product_id"),
cart_item_key = $(this).attr("data-cart_item_key"),
product_container = $(this).parents('.shop_table');
// Добавить загрузчик
product_container.block({
message: null,
overlayCSS: {
cursor: 'none'
}
});
$.ajax({
type: 'POST',
dataType: 'json',
url: wc_checkout_params.ajax_url,
data: {
action: "product_remove",
product_id: product_id,
cart_item_key: cart_item_key
},
success: function(response) {
if ( ! response || response.error )
return;
var fragments = response.fragments;
// Заменить фрагменты
if ( fragments ) {
$.each( fragments, function( key, value ) {
$( key ).replaceWith( value );
});
}
}
});
});
});
И PHP
function warp_ajax_product_remove()
{
// Получить фрагмент отзыва о заказе
ob_start();
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item)
{
if($cart_item['product_id'] == $_POST['product_id'] && $cart_item_key == $_POST['cart_item_key'] )
{
WC()->cart->remove_cart_item($cart_item_key);
}
}
WC()->cart->calculate_totals();
WC()->cart->maybe_set_cart_cookies();
woocommerce_order_review();
$woocommerce_order_review = ob_get_clean();
}
add_action( 'wp_ajax_product_remove', 'warp_ajax_product_remove' );
add_action( 'wp_ajax_nopriv_product_remove', 'warp_ajax_product_remove' );
Он удаляет товар, но страница оформления заказа не обновляется.
Можете ли вы помочь? Спасибо
Используйте jQuery('body').trigger('update_checkout');
в вашем javascript, например, при успешном ответе ajax, это обновит страницу оформления заказа с помощью ajax.
$.ajax({
type: 'POST',
dataType: 'json',
url: wc_checkout_params.ajax_url,
data: {
action: "product_remove",
product_id: product_id,
cart_item_key: cart_item_key
},
success: function(response) {
if ( ! response || response.error )
return;
var fragments = response.fragments;
// Заменить фрагменты
if ( fragments ) {
$.each( fragments, function( key, value ) {
$( key ).replaceWith( value );
});
}
jQuery('body').trigger('update_checkout');
}
});
Я думаю, что в вашем js есть ошибка в закрывающих фигурных скобках, есть лишняя } и поэтому он не работает, должно быть
});
}
});
});
});
Хотя это протестировано и работает
jQuery( function($){
if (typeof woocommerce_params === 'undefined')
return false;
console.log('определено');
$(document).on('click', 'tr.cart_item a.remove', function (e){
e.preventDefault();
var product_id = $(this).attr("data-product_id"),
cart_item_key = $(this).attr("data-cart_item_key"),
product_container = $(this).parents('.shop_table');
// Добавить загрузчик
product_container.block({
message: null,
overlayCSS: {
cursor: 'none'
}
});
$.ajax({
type: 'POST',
dataType: 'json',
url: wc_checkout_params.ajax_url,
data: {
action: "product_remove",
product_id: product_id,
cart_item_key: cart_item_key
},
success: function (result) {
$('body').trigger('update_checkout');
console.log(result);
}
});
});
});
Ответ или решение
Удаление товара со страницы оформления заказа WooCommerce с помощью Ajax
Введение
В данной статье мы рассмотрим, как использовать Ajax для удаления продуктов со страницы оформления заказа в WooCommerce. Это позволит избежать обновления всей страницы, что улучшит пользовательский опыт. Мы предоставим полное решение, включая необходимый JavaScript и PHP код.
Проблема
Вы уже внедрили кнопку удаления товара на странице оформления заказа, однако, текущая реализация обновляет всю страницу при удалении. В отличие от страницы корзины, которая использует Ajax для удаления товаров, ваша задача заключается в том, чтобы аналогично реализовать это и на странице оформления заказа.
Решение
Для решения этой проблемы необходимо задействовать Ajax, чтобы асинхронно удалять товары и затем обновлять видимость информации на странице оформления заказа. Давайте рассмотрим реализуемое решение.
Шаг 1: Добавление JavaScript кода
Начнем с написания JavaScript кода, который будет перехватывать событие клика на кнопке удаления и отправлять Ajax запрос:
jQuery(document).ready(function($) {
$(document).on('click', 'tr.cart_item a.remove', function (e) {
e.preventDefault();
var product_id = $(this).attr("data-product_id"),
cart_item_key = $(this).attr("data-cart_item_key"),
product_container = $(this).parents('.shop_table');
// Отображение загрузки
product_container.block({
message: null,
overlayCSS: {
cursor: 'none'
}
});
$.ajax({
type: 'POST',
dataType: 'json',
url: wc_checkout_params.ajax_url,
data: {
action: "product_remove",
product_id: product_id,
cart_item_key: cart_item_key
},
success: function(response) {
if (!response || response.error) {
return;
}
// Обновление информации о заказе
$('body').trigger('update_checkout');
}
});
});
});
Шаг 2: Добавление PHP кода для обработки Ajax запроса
Теперь добавим PHP код, который будет обрабатывать Ajax запрос и удалять продукт из корзины:
function warp_ajax_product_remove() {
// Проверка наличия необходимых данных
if (!isset($_POST['product_id']) || !isset($_POST['cart_item_key'])) {
wp_send_json_error('Invalid request');
return;
}
// Удаление товара из корзины
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
if ($cart_item['product_id'] == $_POST['product_id'] && $cart_item_key == $_POST['cart_item_key']) {
WC()->cart->remove_cart_item($cart_item_key);
}
}
WC()->cart->calculate_totals();
WC()->cart->maybe_set_cart_cookies();
// Обновление фрагментов страницы оформления заказа
ob_start();
woocommerce_order_review();
$woocommerce_order_review = ob_get_clean();
// Отправка результата
wp_send_json(array(
'fragments' => array(
'.woocommerce-checkout' => $woocommerce_order_review,
),
'cart_count' => WC()->cart->get_cart_contents_count(),
));
}
add_action('wp_ajax_product_remove', 'warp_ajax_product_remove');
add_action('wp_ajax_nopriv_product_remove', 'warp_ajax_product_remove');
Объяснение кода
-
JavaScript код:
- JavaScript код перехватывает клик по ссылке удаления. Затем отправляется Ajax POST запрос с идентификатором продукта и ключом элемента корзины.
- На успешный ответ от сервера вызывается событие
update_checkout
, которое обновляет вывод информации на странице оформления заказа.
-
PHP код:
- PHP функция обрабатывает запрос. Она проверяет наличие идентификатора продукта и ключа элемента корзины.
- Успешное удаление товара обновляет данные корзины, а затем возвращает обновленный HTML код для раздела оформления заказа.
Заключение
Реализация удаления продукций со страницы оформления заказа с помощью Ajax позволит улучшить взаимодействие пользователей с вашим интернет-магазином. Убедитесь, что ваша тема поддерживает необходимые хуки WooCommerce, а также протестируйте данную функциональность на различных устройствах.
Обратите внимание, что это решение повышает удобство использования и уменьшает время загрузки страницы, что является важным аспектом в поддержании лояльности клиентов к вашему интернет-магазину.