Вопрос или проблема
Мне нужно автоматическое изменение статуса заказа. Я пробую это с помощью следующего кода, но статус всегда меняется на “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
, который срабатывает после завершения процесса оформления заказа. Давайте разберем его по частям.
-
Получение заказа:
$order = wc_get_order( $order_id );
Здесь вы правильно получаете объект заказа по его ID.
-
Проверка категорий:
Вы создали массив с ID категорий, которые имеют значение30735, 30855, 31008, 31071, 31083, 31084, 31085, 31127
. Затем вы итерируете через элементы заказа, чтобы проверить, принадлежит ли товар к одной из этих категорий. -
Условия обновления статуса:
Если хотя бы один товар в заказе принадлежит к указанной категории, вы устанавливаете статусvorbestellung
, в противном случае —bestellung-neu
.
Возможные проблемы и решения
-
Проблемы с идентификаторами категорий:
Убедитесь, что все переданные ID категорий правильные и соответствуют категориям ваших товаров. Вы можете проверить это в админке WooCommerce, перейдя в раздел "Товары" -> "Категории". -
Статусы заказа:
Параметры, которые вы передаете в методupdate_status
, должны соответствовать статусам, определенным в WooCommerce. Проверьте, что статусvorbestellung
существует и зарегистрирован. -
Правильное использование функции
has_term()
:
В вашем коде вы используете функциюhas_term()
для проверки категорий. Убедитесь, что она возвращает ожидаемые результаты. Возможно, стоит добавить отладочный вывод, чтобы увидеть, какие товары соответствуют категориям:if ( has_term( $categories, 'product_cat', $product_id ) ) { $found = true; error_log("Товар ID $product_id принадлежит категории"); break; }
-
Использование правильного метода:
Ваш код корректно использует метод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 и конфликтующие плагины, которые могут влиять на процесс обмена статусами заказа.
Если у вас возникнут дополнительные вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться!
С уважением,
[Ваше Имя]