Объединение заказов и объединение повторяющихся позиций в Woocommerce ⇐ Php
Объединение заказов и объединение повторяющихся позиций в Woocommerce
Я пишу код для Woocommerce, который будет автоматически объединять все заказы, поступающие от одного и того же клиента, пока мы не изменим статус. Единственная проблема, с которой я столкнулся, заключается в том, что позиции дублируются, когда клиент размещает второй заказ, содержащий одну из тех же позиций, что и в предыдущем заказе. Это усложняет сбор заказов для наших сотрудников.
Я включил раздел, который проверяет, существует ли товар в предыдущем заказе, а затем обновляет количество этого товара вместо добавления новой строки. Эта часть кода вызывает ошибку при оформлении заказа: «Ошибка обработки оформления заказа. Повторите попытку позже». Без этой части кода все работает как положено.
// Добавляем пользовательскую функцию для проверки и объединения ордеров функция join_orders_on_status_change($order_id) { // Получаем текущий ордер $current_order = wc_get_order($order_id); // Проверяем, находится ли статус заказа на удержании if ($current_order->get_status() === 'on-hold') { // Получаем идентификатор пользователя текущего заказа $user_id = $current_order->get_user_id(); // Получение всех заказов одного и того же пользователя со статусом «в ожидании» $args = массив( 'post_type' => 'shop_order', 'post_status' => 'туалет в режиме ожидания', 'posts_per_page' => -1, 'meta_query' => массив( множество( 'ключ' => '_customer_user', 'значение' => $user_id, ), ), ); $orders = get_posts($args); // Находим более старый заказ с добавленными элементами для объединения $older_order = ноль; foreach ($orders как $order_post) { $order_to_combine = wc_get_order($order_post->ID); // Проверяем, не тот ли это заказ и не объединен ли он еще if ($order_to_combine && $order_to_combine->get_id() !== $order_id && $order_to_combine->get_status() !== 'комбинированный') { // Проверяем, совпадают ли адреса доставки (если они присутствуют в обоих заказах) $current_shipping_address = $current_order->get_address('доставка'); $combine_shipping_address = $order_to_combine->get_address('доставка'); if (!empty($current_shipping_address) && !empty($combine_shipping_address) && $current_shipping_address !== $combine_shipping_address) { продолжать; // Пропустить объединение, если адреса доставки не совпадают } // Проверяем, совпадают ли даты доставки (если они присутствуют в обоих заказах) $current_delivery_date = $current_order->get_meta('_orddd_timestamp', true); $combine_delivery_date = $order_to_combine->get_meta('_orddd_timestamp', true); if (!empty($current_delivery_date) && !empty($combine_delivery_date) && $current_delivery_date !== $combine_delivery_date) { продолжать; // Пропустить объединение, если даты доставки не совпадают } // Устанавливаем старый порядок с добавленными элементами для объединения с $older_order = $order_to_combine; перерыв; // Остановимся после обнаружения первого подходящего ордера } } // Если найден более старый заказ с добавленными позициями, объединяем заказы если ($older_order) { // Проверяем, не переходит ли старый заказ из состояния «получено» в состояние «обработка» if ($older_order->get_status() === 'on-hold' && $current_order->get_status() === 'обработка') { возвращаться; } // Объединяем заказы, копируя элементы $combined_items_list = массив(); foreach ($current_order->get_items() как $item) { $product_id = $item->get_product_id(); $quantity = $item->get_quantity(); // Проверяем, существует ли товар в объединенном заказе $existing_item = $older_order->get_item($product_id); если ($existing_item) { // Если товар существует, обновляем количество $existing_quantity = $existing_item->get_quantity(); $older_order->set_quantity($existing_item, $existing_quantity + $quantity); } еще { // Если товара не существует, добавляем его в объединенный заказ $older_order->add_product(wc_get_product($product_id), $quantity); } $combined_items_list[] = $item->get_name() . ' Икс' . $количество; // Восстанавливаем запасы для каждого товара wc_update_product_stock($product_id, $quantity, 'увеличение'); } // Копируем заметки клиента с четким разграничением $custom_order_number = $current_order->get_order_number(); $customer_note = $current_order->get_customer_note(); если (!empty($customer_note)) { $existing_notes = $older_order->get_customer_note(); $combined_notes = $existing_notes. "\n--- Примечание из заказа №" . $ custom_order_number . " ---\n" . $customer_note; $older_order->set_customer_note($combined_notes); } // Переводим текущий заказ с добавленными товарами в статус «объединенный» $current_order->update_status('комбинированный', __('Объединенные заказы', 'astra')); // Добавляем заметку в журнал заказов $combined_items_log = implode(', ', $combined_items_list); $note_combined = sprintf(__('Заказ объединен с заказом №%s. Добавлены товары: %s', 'astra'), $custom_order_number, $combined_items_log); $older_order->add_order_note($note_combined); // Запись в журнале для нового заказа $note_newer = sprintf(__('Товары добавлены в заказ #%s во время объединения.', 'astra'), $older_order->get_order_number()); $current_order->add_order_note($note_newer); $older_order->calculate_totals(); // Сохраняем изменения в ордерах $older_order->save(); $current_order->save(); // Запускаем хук действия обновления заказа после сохранения old_order wc_reduce_stock_levels($older_order->get_id()); } } } // Перехватываем изменение статуса заказа add_action('woocommerce_order_status_changed', 'combine_orders_on_status_change', 10, 3);
Я пишу код для Woocommerce, который будет автоматически объединять все заказы, поступающие от одного и того же клиента, пока мы не изменим статус. Единственная проблема, с которой я столкнулся, заключается в том, что позиции дублируются, когда клиент размещает второй заказ, содержащий одну из тех же позиций, что и в предыдущем заказе. Это усложняет сбор заказов для наших сотрудников.
Я включил раздел, который проверяет, существует ли товар в предыдущем заказе, а затем обновляет количество этого товара вместо добавления новой строки. Эта часть кода вызывает ошибку при оформлении заказа: «Ошибка обработки оформления заказа. Повторите попытку позже». Без этой части кода все работает как положено.
// Добавляем пользовательскую функцию для проверки и объединения ордеров функция join_orders_on_status_change($order_id) { // Получаем текущий ордер $current_order = wc_get_order($order_id); // Проверяем, находится ли статус заказа на удержании if ($current_order->get_status() === 'on-hold') { // Получаем идентификатор пользователя текущего заказа $user_id = $current_order->get_user_id(); // Получение всех заказов одного и того же пользователя со статусом «в ожидании» $args = массив( 'post_type' => 'shop_order', 'post_status' => 'туалет в режиме ожидания', 'posts_per_page' => -1, 'meta_query' => массив( множество( 'ключ' => '_customer_user', 'значение' => $user_id, ), ), ); $orders = get_posts($args); // Находим более старый заказ с добавленными элементами для объединения $older_order = ноль; foreach ($orders как $order_post) { $order_to_combine = wc_get_order($order_post->ID); // Проверяем, не тот ли это заказ и не объединен ли он еще if ($order_to_combine && $order_to_combine->get_id() !== $order_id && $order_to_combine->get_status() !== 'комбинированный') { // Проверяем, совпадают ли адреса доставки (если они присутствуют в обоих заказах) $current_shipping_address = $current_order->get_address('доставка'); $combine_shipping_address = $order_to_combine->get_address('доставка'); if (!empty($current_shipping_address) && !empty($combine_shipping_address) && $current_shipping_address !== $combine_shipping_address) { продолжать; // Пропустить объединение, если адреса доставки не совпадают } // Проверяем, совпадают ли даты доставки (если они присутствуют в обоих заказах) $current_delivery_date = $current_order->get_meta('_orddd_timestamp', true); $combine_delivery_date = $order_to_combine->get_meta('_orddd_timestamp', true); if (!empty($current_delivery_date) && !empty($combine_delivery_date) && $current_delivery_date !== $combine_delivery_date) { продолжать; // Пропустить объединение, если даты доставки не совпадают } // Устанавливаем старый порядок с добавленными элементами для объединения с $older_order = $order_to_combine; перерыв; // Остановимся после обнаружения первого подходящего ордера } } // Если найден более старый заказ с добавленными позициями, объединяем заказы если ($older_order) { // Проверяем, не переходит ли старый заказ из состояния «получено» в состояние «обработка» if ($older_order->get_status() === 'on-hold' && $current_order->get_status() === 'обработка') { возвращаться; } // Объединяем заказы, копируя элементы $combined_items_list = массив(); foreach ($current_order->get_items() как $item) { $product_id = $item->get_product_id(); $quantity = $item->get_quantity(); // Проверяем, существует ли товар в объединенном заказе $existing_item = $older_order->get_item($product_id); если ($existing_item) { // Если товар существует, обновляем количество $existing_quantity = $existing_item->get_quantity(); $older_order->set_quantity($existing_item, $existing_quantity + $quantity); } еще { // Если товара не существует, добавляем его в объединенный заказ $older_order->add_product(wc_get_product($product_id), $quantity); } $combined_items_list[] = $item->get_name() . ' Икс' . $количество; // Восстанавливаем запасы для каждого товара wc_update_product_stock($product_id, $quantity, 'увеличение'); } // Копируем заметки клиента с четким разграничением $custom_order_number = $current_order->get_order_number(); $customer_note = $current_order->get_customer_note(); если (!empty($customer_note)) { $existing_notes = $older_order->get_customer_note(); $combined_notes = $existing_notes. "\n--- Примечание из заказа №" . $ custom_order_number . " ---\n" . $customer_note; $older_order->set_customer_note($combined_notes); } // Переводим текущий заказ с добавленными товарами в статус «объединенный» $current_order->update_status('комбинированный', __('Объединенные заказы', 'astra')); // Добавляем заметку в журнал заказов $combined_items_log = implode(', ', $combined_items_list); $note_combined = sprintf(__('Заказ объединен с заказом №%s. Добавлены товары: %s', 'astra'), $custom_order_number, $combined_items_log); $older_order->add_order_note($note_combined); // Запись в журнале для нового заказа $note_newer = sprintf(__('Товары добавлены в заказ #%s во время объединения.', 'astra'), $older_order->get_order_number()); $current_order->add_order_note($note_newer); $older_order->calculate_totals(); // Сохраняем изменения в ордерах $older_order->save(); $current_order->save(); // Запускаем хук действия обновления заказа после сохранения old_order wc_reduce_stock_levels($older_order->get_id()); } } } // Перехватываем изменение статуса заказа add_action('woocommerce_order_status_changed', 'combine_orders_on_status_change', 10, 3);
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Добавить количество заказов клиентов в список заказов администратора WooCommerce (HPOS)
Anonymous » » в форуме Php - 0 Ответы
- 43 Просмотры
-
Последнее сообщение Anonymous
-