Мне нужно сделать заказ обновить метаданные элемента заказа в woocommerce на странице оформления заказа или пока woocommerce создает заказ. Я использую плагин визуальный конфигуратор продукта, и он не передает правильное количество некоторых элементов заказа в метаданные заказа woocommerce, особенно когда я использую несколько вариантов одного и того же продукта.
Есть ли крюк, который я могу использовать для обновления количества товара для определенного товара в заказе, и как я могу его использовать? Плагин возвращает мне массив со всей информацией о корзине, и я могу только проверить, появляется ли элемент заказа несколько раз - если да, мне нужно изменить количество этого элемента на это число в заказе/базе данных woocommerce.
Я думал добавить следующий хук в мой functions.php
add_action('woocommerce_checkout_create_order', 'change_qty', 1,1);
function change_qty($item_qty){
foreach($item_qty as $qty) {
$qty['product_id'] = $id;
$qty['qty'] = $new_qty
$order->update_meta_data('quantity', $new_qty, $id)
}
}
Принимая во внимание, что $item_qty представляет собой многомерный массив, содержащий item_ids и скорректированные количества.
Еще одна проблема, с которой я столкнулся, заключается в том, что я не знаю, когда мне нужно вызвать эту функцию, потому что я получаю массив из плагина на странице оформления заказа, но я думаю, что WooCommerce еще не создал заказ в этот момент?
Результатом должно быть скорректированное количество товаров в сводке заказа woocommerce в бэкэнде.
Это может вам помочь (мы подключаемся к уведомлению о завершении платежа от платежной системы). Если вы хотите обновить _qty
сразу после создания заказа, я могу изменить свою функцию. Но пока я бы обновил его только тогда, когда платеж прошел успешно.:
/**
* Update order item qty after payment successful
*/
add_filter( 'woocommerce_payment_complete_order_status', 'update_order_item_qty', 10, 2 );
function update_order_item_qty( $order_status, $order_id ) {
//Get the order and items
$order = new WC_Order( $order_id );
$items = $order->get_items();
//New qty
$new_qty = 0;
foreach ( $items as $item_id => $item_data ) {
update_meta_data( '_qty', $new_qty, $item_id );
}
}
Пожалуйста, попробуйте, если это то, что вы ищете.
У вас это потом. Каждый заказ проходит через статус платежа завершен, и в тот момент, когда вы знаете идентификатор заказа. Или вы хотите изменить количество при оплате, чтобы покупатель получил больше товаров, чем он видит в корзине (возможно, с более высокой ценой)?
Нет, это просто для бэкэнда, чтобы мы видели правильное количество товара в бэкенде.
Чтобы обновить количество товара в заказе, вы можете использовать WC_Order_Item_Product
set_quantity()
метод.
Правильный хук для обновления элементов заказа (элементов строки) — woocommerce_checkout_create_order_line_item
крючок действия, который срабатывает во время создания заказа, прежде чем данные будут сохранены в базе данных.
add_action('woocommerce_checkout_create_order_line_item', 'change_order_line_item_quantity', 10, 4 );
function change_order_line_item_quantity( $item, $cart_item_key, $cart_item, $order ) {
// Your code goes below
// Get order item quantity
$quantity = $item->get_quantity();
$new_qty = $quantity + 2;
// Update order item quantity
$item->set_quantity( $new_qty );
}
Аргументы функции (переменные) определены и могут использоваться:
$item
— это WC_Order_Item_Product
объект (еще не сохраненный в базе данных)$cart_item_key
— ключ соответствующего элемента корзины$cart_item
— это данные о соответствующем элементе корзины.$order
— это объект WC_Order (еще не сохраненный в базе данных)Связанный:
WC_Checkout
и woocommerce_checkout_create_order_line_item
хук действия, расположенный в методе create_order_line_items()
Спасибо, я не совсем понимаю все переменные в функции cahnge_order_line_item_quantity, где я должен их объявлять или они уже объявлены при создании заказа?
Аргументы функции (следующие за переменными) как $item
, $cart_item_key
, $cart_item
и $order
определены и могут использоваться.
Хорошо, я только что проверил это, это работает. Есть ли у вас какие-либо ссылки или документация, где я могу прочитать об этих переменных? Я хочу проверить, совпадает ли product_id с тем, который прокручивается в функции? I $item ссылается на SKU, ProductID или что-то еще?
@erik7 Я добавил несколько ссылок и пояснений.
Спасибо, я проверяю
Это не работает, потому что у меня нет идентификатора заказа после этого - у меня есть информация о количестве только во время процесса оформления заказа, поэтому мне нужно как-то изменить его во время этого процесса.