Как обновить количество товара в заказе WooCommerce

Мне нужно сделать заказ обновить метаданные элемента заказа в 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 в бэкэнде.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
6 555
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это может вам помочь (мы подключаемся к уведомлению о завершении платежа от платежной системы). Если вы хотите обновить _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 );
    }
}

Пожалуйста, попробуйте, если это то, что вы ищете.

Это не работает, потому что у меня нет идентификатора заказа после этого - у меня есть информация о количестве только во время процесса оформления заказа, поэтому мне нужно как-то изменить его во время этого процесса.

digitalsuite.net 10.04.2019 15:32

У вас это потом. Каждый заказ проходит через статус платежа завершен, и в тот момент, когда вы знаете идентификатор заказа. Или вы хотите изменить количество при оплате, чтобы покупатель получил больше товаров, чем он видит в корзине (возможно, с более высокой ценой)?

Mr. Jo 10.04.2019 15:35

Нет, это просто для бэкэнда, чтобы мы видели правильное количество товара в бэкенде.

digitalsuite.net 10.04.2019 16:14
Ответ принят как подходящий

Чтобы обновить количество товара в заказе, вы можете использовать WC_Order_Item_Productset_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 (еще не сохраненный в базе данных)

Связанный:

Спасибо, я не совсем понимаю все переменные в функции cahnge_order_line_item_quantity, где я должен их объявлять или они уже объявлены при создании заказа?

digitalsuite.net 10.04.2019 16:32

Аргументы функции (следующие за переменными) как $item, $cart_item_key, $cart_item и $order определены и могут использоваться.

LoicTheAztec 10.04.2019 16:37

Хорошо, я только что проверил это, это работает. Есть ли у вас какие-либо ссылки или документация, где я могу прочитать об этих переменных? Я хочу проверить, совпадает ли product_id с тем, который прокручивается в функции? I $item ссылается на SKU, ProductID или что-то еще?

digitalsuite.net 10.04.2019 16:41

@erik7 Я добавил несколько ссылок и пояснений.

LoicTheAztec 10.04.2019 16:50

Спасибо, я проверяю

digitalsuite.net 10.04.2019 16:52

Другие вопросы по теме