Как программно разделить заказ WooCommerce? - PullRequest
1 голос
/ 10 ноября 2019

Я продаю пакеты онлайн в моем магазине. Когда клиент заказывает 2 пакета (1 пакет состоит из 4 продуктов), я хочу создать 2 заказа с 1 пакетом вместо 1 заказа с 2 пакетами.

Пример: у меня есть пакет (ID: 212), который может содержать до 4 связанных продуктов (все ID: 730). Проблема сейчас: когда я пытаюсь разделить заказ, только продукт с идентификатором 212 помещается в новый заказ. 4 товара, которые принадлежат к ID 212, остаются в том же порядке.

После скриншота, который делает иерархию более ясной:

enter image description here

Что происходит, когда я пробую решение из @Shir Gans:

enter image description here

Пакет размещен в новом заказе, но продукты, которые также должны быть в новом заказе, все еще находятся в старом заказе.

Какой самый простой способ сделать это, и какой хук я должен использовать?

1 Ответ

1 голос
/ 10 ноября 2019

Вы можете подключиться к woocommerce_payment_complete, который принимает $order_id, затем вы можете пройтись по пунктам и решить, создавать ли еще один заказ. Затем вы можете разделить элементы в новый порядок. Вот (непроверенный) пример:

define('PACKAGE_PRODUCT_ID', 1010);

    add_action('woocommerce_payment_complete', 'order_splitter', 100, 1);
    function order_splitter($order_id){
        $completed_order = new WC_Order($order_id);
        $item_splitted = false;

        $address = array(
            'first_name' => $completed_order->get_billing_first_name(),
            'last_name'  => $completed_order->get_billing_last_name(),
            'company'    => '',
            'email'      => $completed_order->get_billing_email(),
            'phone'      => $completed_order->get_billing_phone(),
            'address_1'  => $completed_order->get_billing_address_1(),
            'address_2'  => $completed_order->get_billing_address_2(),
            'city'       => $completed_order->get_billing_city(),
            'state'      => $completed_order->get_billing_state(),
            'postcode'   => $completed_order->get_billing_postcode(),
            'country'    => $completed_order->get_billing_country()
        );

        foreach($completed_order->get_items() as $item){

                if (!$item_splitted && $item->get_product_id() === PACKAGE_PRODUCT_ID) {

                    //create new order
                    $new_order_args = array(
                        'customer_id' => $completed_order->get_customer_id(),
                        'status' => 'wc-pending',
                    );
                    $new_order = wc_create_order($new_order_args);
                    $product_to_add = wc_get_product(PACKAGE_PRODUCT_ID);
                    $new_order->add_product($product_to_add, 1, array());
                    $new_order->set_address($address, 'billing');
                    $new_order->set_address($address, 'shipping');
                    $new_order->update_status('wc-processing');
                    $new_order->add_order_note('This order created automatically');
                    $new_order->save();
                    $completed_order->remove_item($item->get_id());
                    $item_splitted = true;
                } else  if ($item_splitted && $item['product_id'] === PACKAGE_PRODUCT_ID){
                    # This will ensure every 2 products are splitted (skipping the 2nd one)
                    $item_splitted = false;
                    continue;
                }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...