Кастомный код для экспорта заказов WooCommerce отдельно с использованием WP All IMPORT

Вопрос или проблема

Я использую плагин экспорта “WP ALl IMPORT” для экспорта заказов WooCommerce.

ЦЕЛЬ:
Каждый заказ должен отправляться отдельно в виде XML файла через FTP.

ТЕКУЩЕЕ СОСТОЯНИЕ:
Чтобы отфильтровать именно нужные заказы с соответствующими продуктами, я использую
настраиваемый код в секциях плагина:

XML РЕДАКТОР

<?xml version="1.0" encoding="UTF-8"?>
<order>
    <!-- НАЧАЛО ЦИКЛА -->
        <commission>{Bestell ID}</commission>
        <production>1</production>

        <receiver>
            <line1>{Shipping First Name} {Shipping Last Name}</line1>
            <line2>{Shipping Company}</line2>
            <street>{Shipping Address 1}</street>
            <streetnumber>{Shipping Address 2}</streetnumber>
            <country_code>{Shipping Country}</country_code>
            <zip>{Shipping Postcode}</zip>
            <city>{Shipping City}</city>
            <email>{Customer Account Email Address}</email>

        </receiver> 

        <items> 
            [my_get_order_items({Bestell ID})]
        </items>
    <!-- КОНЕЦ ЦИКЛА -->
</order>

ФУНКЦИЯ PHP РЕДАКТОР

<?php

function my_get_order_items( $order_id ) {
    $order = wc_get_order( absint($order_id) ); // Получаем объект WC_Order

    if ( ! is_a($order, 'WC_Order') ) {
        return false; // Выход, если это не заказ
    }
    $order_details = ""; // Инициализируем переменную как строку для хранения деталей заказа

    // Цикл по элементам заказа
    foreach ( $order->get_items() as $item ) {
        if ( ! ( strpos($item->get_name(), 'KERAMIKTASSE') !== false
        || strpos($item->get_name(), 'BAUMWOLLTASCHE') !== false
        || strpos($item->get_name(), 'SWEATSHIRT') !== false
        || strpos($item->get_name(), 'HOODIE') !== false
        || strpos($item->get_name(), 'T-SHIRT') !== false ) ) { 
            continue; 
        }
        $product    = $item->get_product(); // Получаем объект продукта
        $product_id = $item->get_product_id(); // Получаем идентификатор продукта

        $order_details .= "**LT**item**GT**";
        $order_details .= "**LT**ID**GT**" . $product->get_sku() . "**LT**/ID**GT**";
        $order_details .= "**LT**produktname**GT**" . $item->get_name() . "**LT**/produktname**GT**";
        $order_details .= "**LT**amount**GT**" . $item->get_quantity() . "**LT**/amount**GT**";
        $order_details .= "**LT**upload**GT**" . maybe_serialize( get_field( 'upload', $product_id ) ) . "**LT**/upload**GT**";
        $order_details .= "**LT**size**GT**" . maybe_serialize( get_field( 'size', $product_id ) ) . "**LT**/size**GT**";
        $order_details .= "**LT**groesse**GT**" . $product->get_attribute('pa_groesse')  . "**LT**/groesse**GT**";
        $order_details .= "**LT**material**GT**" . maybe_serialize( get_field( 'material', $product_id ) ) . "**LT**/material**GT**";
        $order_details .= "**LT**print**GT**" . maybe_serialize( get_field( 'print', $product_id ) ) . "**LT**/print**GT**";
        $order_details .= "**LT**variante**GT**" . maybe_serialize( get_field( 'variante', $product_id ) ) . "**LT**/variante**GT**";
        $order_details .= "**LT**category**GT**" . maybe_serialize( get_field( 'category', $product_id ) ) . "**LT**/category**GT**";

        //добавляем опции к выводу
        $order_details .= "**LT**Options**GT**";

        if(get_field( 'groupid_115', $product_id )) {             
             $order_details .= "**LT**Option**GT****LT**ID**GT**" . maybe_serialize( get_field( 'groupid_115', $product_id ) ) . "**LT**/ID**GT****LT**Value**GT**" . maybe_serialize( get_field( 'value_115', $product_id ) ) . "**LT**/Value**GT****LT**/Option**GT**"; 
        }

        if(get_field( 'groupid_117', $product_id )) {             
             $order_details .= "**LT**Option**GT****LT**ID**GT**" . maybe_serialize( get_field( 'groupid_117', $product_id ) ) . "**LT**/ID**GT****LT**Value**GT**" . maybe_serialize( get_field( 'value_117', $product_id ) ) . "**LT**/Value**GT****LT**/Option**GT**"; 
        }

        if(get_field( 'groupid_118', $product_id )) {             
             $order_details .= "**LT**Option**GT****LT**ID**GT**" . maybe_serialize( get_field( 'groupid_118', $product_id ) ) . "**LT**/ID**GT****LT**Value**GT**" . maybe_serialize( get_field( 'value_118', $product_id ) ) . "**LT**/Value**GT****LT**/Option**GT**"; 
        }
    } 
    return $order_details;
}
?>

РАСПИСАНИЕ:
Функция “Ручное расписание” плагина экспортирует релевантные заказы через FTP в заданный временной интервал с использованием cronjobs.

ПРОБЛЕМА, КОТОРУЮ НУЖНО РЕШИТЬ:
К сожалению, каждый заказ не экспортируется отдельно в виде XML файла, а все заказы в заданном временном интервале экспортируются вместе в один XML ФАЙЛ.

ВОПРОС:
Можно ли это решить? Есть ли способ модифицировать мои существующие настраиваемые коды так, чтобы каждый заказ мог экспортироваться отдельно?
У вас есть идеи по коду?

Скриншот:

Сгенерированный xml

В вашем коде не хватает закрывающего тега для каждого заказа касательно деталей элементов и опций элементов в конце вашего кода.

Также вам следует сначала проверить, что вы получаете хотя бы действительную опцию.

Я также немного оптимизировал ваш код.

Попробуйте следующее:

<?php
function my_get_order_items( $order_id ) {
    $order = wc_get_order( absint($order_id) ); // Получаем объект WC_Order

    if ( ! is_a($order, 'WC_Order') ) {
        return false; // Выход, если это не заказ
    }
    $order_details = ""; // Инициализируем переменную

    // Цикл по элементам заказа
    foreach ( $order->get_items() as $item ) {
        if ( ! ( strpos($item->get_name(), 'KERAMIKTASSE') !== false
        || strpos($item->get_name(), 'BAUMWOLLTASCHE') !== false
        || strpos($item->get_name(), 'SWEATSHIRT') !== false
        || strpos($item->get_name(), 'HOODIE') !== false
        || strpos($item->get_name(), 'T-SHIRT') !== false ) ) { 
            continue; 
        }

        $product    = $item->get_product(); // Получаем объект продукта
        $product_id = $item->get_product_id(); // Получаем идентификатор продукта

        // Начало элемента
        $order_details .= "**LT**item**GT**"; 
        $order_details .= "**LT**ID**GT**" . $product->get_sku() . "**LT**/ID**GT**";
        $order_details .= "**LT**produktname**GT**" . $item->get_name() . "**LT**/produktname**GT**";
        $order_details .= "**LT**amount**GT**" . $item->get_quantity() . "**LT**/amount**GT**";
        $order_details .= "**LT**upload**GT**" . maybe_serialize( get_field( 'upload', $product_id ) ) . "**LT**/upload**GT**";
        $order_details .= "**LT**size**GT**" . maybe_serialize( get_field( 'size', $product_id ) ) . "**LT**/size**GT**";
        $order_details .= "**LT**groesse**GT**" . $product->get_attribute('pa_groesse')  . "**LT**/groesse**GT**";
        $order_details .= "**LT**material**GT**" . maybe_serialize( get_field( 'material', $product_id ) ) . "**LT**/material**GT**";
        $order_details .= "**LT**print**GT**" . maybe_serialize( get_field( 'print', $_product_id ) ) . "**LT**/print**GT**";
        $order_details .= "**LT**variante**GT**" . maybe_serialize( get_field( 'variante', $product_id ) ) . "**LT**/variante**GT**";
        $order_details .= "**LT**category**GT**" . maybe_serialize( get_field( 'category', $product_id ) ) . "**LT**/category**GT**";

        $order_details .= "**LT**category**GT**" . maybe_serialize( get_field( 'category', $product_id ) ) . "**LT**/category**GT**";

        // Получаем значения ваших опций сначала
        $groupid_115 = get_field( 'groupid_115', $product_id );
        $groupid_117 = get_field( 'groupid_115', $product_id );
        $groupid_118 = get_field( 'groupid_115', $product_id );

        // Начало опций
        if ( $groupid_115 || $groupid_117 || $groupid_118 ) {
            $order_details .= "**LT**Options**GT**";

            if ( $groupid_115 ) { 
                $groupid_115    =  maybe_serialize( $groupid_115 );           
                $order_details .= "**LT**Option**GT****LT**ID**GT**" . $groupid_115 . "**LT**/ID**GT****LT**Value**GT**" . $groupid_115 . "**LT**/Value**GT****LT**/Option**GT**"; 
            }

            if ( $groupid_117 ) {
                $groupid_117    =  maybe_serialize( $groupid_117 );          
                $order_details .= "**LT**Option**GT****LT**ID**GT**" . $groupid_117 . "**LT**/ID**GT****LT**Value**GT**" . $groupid_117 . "**LT**/Value**GT**" . "**LT**/Option**GT**";
            }

            if ( $groupid_118 ) { 
                $groupid_118    =  maybe_serialize( $groupid_118 );      
                $order_details .= "**LT**Option**GT****LT**ID**GT**" . $groupid_118 . "**LT**/ID**GT****LT**Value**GT**" . $groupid_118 . "**LT**/Value**GT**" . "**LT**/Option**GT**"; 
            }
            // Закрывающий тег для "Options" (Конец опций)
            $order_details .= "**LT/**Options**GT**"; 
        }
        // Закрывающий тег для "item" (Конец элемента)
        $order_details .= "**LT/**item**GT**"; 
    }

    return $order_details;
}
?>

Не протестировано, должно решить вашу проблему.

Ответ или решение

Экспорт Заказов WooCommerce по Отдельным XML Файлам с Использованием WP All Import

Экспортирование заказов WooCommerce в виде отдельных XML файлов через WP All Import представляет собой довольно распространённую задачу, однако, как вы заметили, по умолчанию все заказы экспортируются в один XML файл. В этой статье мы рассмотрим, как модифицировать существующий код, чтобы добиться требуемого результата.

Шаг 1: Адаптация XML Редактора

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

<?xml version="1.0" encoding="UTF-8"?>
<orders>
    <!-- BEGIN LOOP -->
        <order>
            <commission>{Bestell ID}</commission>
            <production>1</production>

            <receiver>
                <line1>{Shipping First Name} {Shipping Last Name}</line1>
                <line2>{Shipping Company}</line2>
                <street>{Shipping Address 1}</street>
                <streetnumber>{Shipping Address 2}</streetnumber>
                <country_code>{Shipping Country}</country_code>
                <zip>{Shipping Postcode}</zip>
                <city>{Shipping City}</city>
                <email>{Customer Account Email Address}</email>
            </receiver> 

            <items> 
                [my_get_order_items({Bestell ID})]
            </items>
        </order>
    <!-- END LOOP -->
</orders>

Обратите внимание, что общий тэг orders охватывает все заказы, а каждый заказ выводится в отдельном тэге <order>.

Шаг 2: Модификация PHP Функции

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

Обновленная версия функции будет выглядеть следующим образом:

<?php
function my_get_order_items( $order_id ) {
    $order = wc_get_order( absint($order_id) ); // Получаем объект WC_Order

    if ( ! is_a($order, 'WC_Order') ) {
        return false; // Если это не заказ, выходим
    }

    $order_details = ""; // Инициализируем переменную

    // Проходим по всем товарам заказа
    foreach ( $order->get_items() as $item ) {
        if ( ! ( strpos($item->get_name(), 'KERAMIKTASSE') !== false ||
                  strpos($item->get_name(), 'BAUMWOLLTASCHE') !== false ||
                  strpos($item->get_name(), 'SWEATSHIRT') !== false ||
                  strpos($item->get_name(), 'HOODIE') !== false ||
                  strpos($item->get_name(), 'T-SHIRT') !== false ) ) {
            continue; 
        }

        $product = $item->get_product(); // Получаем объект товара
        $product_id = $item->get_product_id(); // Получаем ID товара

        // Заполняем детали товара
        $order_details .= "<item>"; 
        $order_details .= "<ID>" . $product->get_sku() . "</ID>";
        $order_details .= "<produktname>" . $item->get_name() . "</produktname>";
        $order_details .= "<amount>" . $item->get_quantity() . "</amount>";
        // Здесь вы можете добавить другие поля, как в вашем примере
        $order_details .= "</item>"; // Закрываем тэг item
    }

    return $order_details;
}
?>

Шаг 3: Настройка Расписания Экспорта

Используя функцию «Ручное расписание» в WP All Import, вы можете настроить cron-задачу, которая будет запускать экспорт по расписанию. Здесь важным является то, чтобы вы установили соответствующие параметры в экране настройки экспорта, чтобы каждая итерация обрабатывала один заказ и экспортировала его как отдельный XML файл.

Вывод

Таким образом, вы можете адаптировать существующий код для экспорта заказов WooCommerce в отдельные XML файлы. Убедитесь, что ваши данные структурированы и корректно обрабатываются, чтобы избежать ошибок в процессе экспорта.

Если у вас возникнут дополнительные вопросы или необходима помощь с отладкой, не стесняйтесь обращаться к сообществу WP All Import или рецензентам на специализированных форумах.

Оцените материал
Добавить комментарий

Капча загружается...