Установить статус заказа WooCommerce при создании заказа от обработки до ожидания

Когда заказ woocommerce создан, статус заказа - "обработка". Мне нужно изменить статус заказа по умолчанию на "в ожидании".

Как мне этого добиться?

5 ответов

Решение

Статус заказа по умолчанию устанавливается способом оплаты или шлюзом оплаты.

Вы можете попытаться использовать эту пользовательскую подключенную функцию, но она не будет работать (так как эта ловушка запускается до способов оплаты и платежных шлюзов):

add_action( 'woocommerce_checkout_order_processed', 'changing_order_status_before_payment', 10, 3 );
function changing_order_status_before_payment( $order_id, $posted_data, $order ){
    $order->update_status( 'pending' );
}

Очевидно, что каждый способ оплаты (и платежные шлюзы) устанавливает статус заказа (в зависимости от ответа транзакции для платежных шлюзов)…

Для способа оплаты наложенным платежом это может быть изменено с помощью специального фильтра, см.:
Измените статус заказа по умолчанию наложенным платежом на "В ожидании" вместо "Обработка" в Woocommerce

Теперь вместо этого вы можете обновить статус заказа, используяwoocommerce_thankyou крюк:

add_action( 'woocommerce_thankyou', 'woocommerce_thankyou_change_order_status', 10, 1 );
function woocommerce_thankyou_change_order_status( $order_id ){
    if( ! $order_id ) return;

    $order = wc_get_order( $order_id );

    if( $order->get_status() == 'processing' )
        $order->update_status( 'pending' );
}

Код помещается в файл function.php вашей активной дочерней темы (или темы) или также в любой файл плагина.

Проверено и работает

Примечание: крючок woocommerce_thankyou срабатывает каждый раз, когда загружается полученная страница заказа, и по этой причине ее необходимо использовать с осторожностью...
Теперь функция выше будет обновлять статус заказа только в первый раз. Если клиент перезагрузит страницу, условие в IF Заявление больше не будет соответствовать и больше ничего не произойдет.


Связанная тема: WooCommerce: автоматическое заполнение оплаченных заказов (в зависимости от способов оплаты)

В настоящее время, если платежный шлюз, который вы используете, правильно устанавливает статус заказа, используя WC_Order->payment_complete(), вы можете использовать woocommerce_payment_complete_order_statusфильтр.

Это лучше, чем использование хука, поскольку мы устанавливаем статус заказа сразу, а не применяем его после того, как он уже установлен.

      function h9dx3_override_order_status($status, $order_id, $order) {
  if ($status === 'processing') {
    $status = 'pending';
  }

  return $status;
}
add_filter('woocommerce_payment_complete_order_status', 'h9dx3_override_order_status', 10, 3);

Опять же, это будет работать только в том случае, если платежный шлюз использует правильный payment_completeметод оболочки, а не устанавливать статус напрямую с помощью set_status. Вы можете просто найти в коде шлюза 'payment_complete(' и 'set_status('), чтобы увидеть, что он делает.

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

Хук woocommerce_thankyou страдает от проблемы, что вы можете оплатить заказ, а затем закрыть браузер или перейти куда-то еще и, следовательно, никогда не нажимать «Вернуться к продавцу» (которое отображается после оплаты через PayPal), чтобы попасть на страницу благодарности. И тогда код никогда не будет выполнен.

Это условие, которое предотвращает непреднамеренное изменение статуса клиентом в случае обновления страницы через 3 минуты после первоначального изменения.

add_action( 'woocommerce_thankyou', 'woocommerce_thankyou_change_order_status', 10, 1 );
function woocommerce_thankyou_change_order_status( $order_id ){
    if( ! $order_id ) return;

    $order = wc_get_order( $order_id );

    $time_order     = strtotime($order->get_date_created());
    $time_current   = time();
    $time_interval  = $time_current - $time_order;

    //Case refresh page after 3 minutes at order, no changed status
    if( $order->get_status() == 'processing' && $time_interval < 180 ) {
        $order->update_status( 'pending' );
    }
}
// Rename order status 'Processing' to 'Order Completed' in admin main view - different hook, different value than the other places
add_filter( 'wc_order_statuses', 'wc_renaming_order_status' );
function wc_renaming_order_status( $order_statuses ) {
    foreach ( $order_statuses as $key => $status ) {
        if ( 'wc-processing' === $key ) 
            $order_statuses['wc-processing'] = _x( 'Order Completed', 'Order status', 'woocommerce' );
    }
    return $order_statuses;
}
Другие вопросы по тегам