Кнопка для удаления элемента из заказа в WooCommerce

63
7

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

Шаблон: woocommerce/order/order-details-item.php

Я нашел функцию, которая использует: wc_delete_order_item()

Он удаляет все элементы, если я добавляю их внутри цикла.

Однако как запустить функцию одним нажатием кнопки? Ive попробовал использовать ajax, но wc_delete_order_item() во внешнем файле обнаружил "Undefined function".

Пожалуйста помоги.

спросил(а) 2021-01-25T17:45:41+03:00 5 месяцев назад
1
Решение
89

Сначала (только для исправления) шаблон order-details-item.php используется в:

    Заказать полученную страницу (Thankyou) Страницы порядка просмотра аккаунта

Теперь для использования wc_delete_order_item() вам потребуется идентификатор элемента в качестве аргумента.

Вы можете использовать настраиваемую функцию, подключенную к woocommerce_order_item_meta_end чтобы отобразить функциональную кнопку для удаления элементов заказа вместо того, чтобы переопределять шаблон, но он удалит элемент заказа и его нужно будет обновить во второй раз.

Визуально вы получите следующее:

enter image description here

Вот этот частичный код:

add_action( 'woocommerce_order_item_meta_end', 'display_remove_order_item_button', 10, 3 );
function display_remove_order_item_button( $item_id, $item, $order ){
// Avoiding displaying buttons on email notification
if( ! ( is_wc_endpoint_url( 'view-order' ) || is_wc_endpoint_url( 'order-received' ) ) ) return;

if( isset($_POST["remove_item_$item_id"]) && $_POST["remove_item_$item_id"] == 'Remove this item' ){
wc_delete_order_item( $item_id );
}

echo '<form class="cart" method="post" enctype="multipart/form-data" style= "margin-top:12px;">
<input type="submit" class="button" name="remove_item_'.$item_id.'" value="Remove this item" />
</form>';
}

Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.

Он удалит элемент заказа.

Также вам необходимо использовать метод WC_Abstract_Order calculate_totals() для обновления/вычисления новых порядковых итогов:

$order->calculate_totals();

Но лучшим и полностью функциональным способом должно быть использование Ajax, что намного сложнее и реальное развитие.

Чтобы правильно использовать Ajax, вам нужно добавить скрытое поле с идентификатором Item, чтобы получить его с помощью ajax и передать его функции PHP (отсутствующий аргумент, чтобы wc_delete_order_item() работал нормально без каких-либо ошибок), а также Номер заказа…

Теперь, в следующий раз, если вы попробуете Ajax-способ, вы должны задать новый вопрос, добавив к нему свой собственный код, объяснив, что работает, а что нет...

ответил(а) 2021-01-25T17:45:41+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема