Автоматически изменять статус заказа

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

Мне нужно автоматическое изменение статуса заказа. Я пробую это с помощью следующего кода, но статус всегда меняется на “vorbestellung”. Пожалуйста, помогите мне исправить мой код.

/**
 * Изменение статуса заказа
 */
function action_woocommerce_thankyou( $order_id ) {
   // if ( ! $order_id ) return;

    // Получить объект заказа
    $order = wc_get_order( $order_id );

    // Конкретные категории: имя термина/term_id/slug. Можно добавить несколько через запятую, например 240=Langwieder,30855=BIO OÖ,31008 = vorbestellungen,
    // 31070 = VB, 31071=Schusterbauer Rind,31083=Gröberhof Lamm, 31084 = Gröb Manga, 31085 =Gröb Truth, 31127 = Südfrüchte

      $categories = array(30735,30855,31008,31071,31083,31084,31085,31127);

    // Флаг
    $found = false;

    // Перебор элементов заказа
    foreach ( $order->get_items() as $item ) {
        // ID продукта
        $product_id = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();

        // Есть ли термин (категория продукта)
        if ( has_term( $categories, 'product_cat', $product_id ) ) {
            $found = true;
            break;
        }
    }

    // Истина
    if ( $found ) {
        // Статус Vorbestellung
        $order->update_status( 'vorbestellung' );
    }else{
        $order->update_status( 'bestellung-neu' );

    }
}
add_action( 'woocommerce_thankyou', 'action_woocommerce_thankyou', 10, 1 );

Спасибо
Зигфрид

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

Автоматическая смена статуса заказа в WooCommerce

Здравствуйте, Siegfried!

Рад помочь вам с проблемой автоматической смены статуса заказа в WooCommerce. Давайте разберем ваш код и выясним, почему статус всегда устанавливается как "vorbestellung".

Анализ кода

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

  1. Получение заказа:

    $order = wc_get_order( $order_id );

    Здесь вы правильно получаете объект заказа по его ID.

  2. Проверка категорий:
    Вы создали массив с ID категорий, которые имеют значение 30735, 30855, 31008, 31071, 31083, 31084, 31085, 31127. Затем вы итерируете через элементы заказа, чтобы проверить, принадлежит ли товар к одной из этих категорий.

  3. Условия обновления статуса:
    Если хотя бы один товар в заказе принадлежит к указанной категории, вы устанавливаете статус vorbestellung, в противном случае — bestellung-neu.

Возможные проблемы и решения

  1. Проблемы с идентификаторами категорий:
    Убедитесь, что все переданные ID категорий правильные и соответствуют категориям ваших товаров. Вы можете проверить это в админке WooCommerce, перейдя в раздел "Товары" -> "Категории".

  2. Статусы заказа:
    Параметры, которые вы передаете в метод update_status, должны соответствовать статусам, определенным в WooCommerce. Проверьте, что статус vorbestellung существует и зарегистрирован.

  3. Правильное использование функции has_term():
    В вашем коде вы используете функцию has_term() для проверки категорий. Убедитесь, что она возвращает ожидаемые результаты. Возможно, стоит добавить отладочный вывод, чтобы увидеть, какие товары соответствуют категориям:

    if ( has_term( $categories, 'product_cat', $product_id ) ) {
       $found = true;
       error_log("Товар ID $product_id принадлежит категории");
       break;
    }
  4. Использование правильного метода:
    Ваш код корректно использует метод update_status, но если он не работает, это может быть связано с кэшированием или другими сторонними плагинами, которые могут вмешиваться в процесс обновления статусов.

Предложенное исправление

Вот исправленный код с учётом вышеуказанных замечаний:

/**
 * Change Order Status
 */
function action_woocommerce_thankyou( $order_id ) {
    if ( ! $order_id ) return;

    // Get order object
    $order = wc_get_order( $order_id );

    // Specific categories
    $categories = array(30735, 30855, 31008, 31071, 31083, 31084, 31085, 31127);

    $found = false;

    // Loop through order items
    foreach ( $order->get_items() as $item ) {
        // Get product ID
        $product_id = $item->get_variation_id() > 0 ? $item->get_variation_id() : $item->get_product_id();

        // Check if product has a term (category)
        if ( has_term( $categories, 'product_cat', $product_id ) ) {
            $found = true;
            break;
        }
    }

    // Update order status
    if ( $found ) {
        $order->update_status( 'vorbestellung' );
    } else {
        $order->update_status( 'bestellung-neu' );
    }
}
add_action( 'woocommerce_thankyou', 'action_woocommerce_thankyou', 10, 1 );

Заключение

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

Если у вас возникнут дополнительные вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться!

С уважением,
[Ваше Имя]

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

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