在从处理到待处理创建订单时设置WooCommerce订单状态

时间:2017-08-31 15:47:36

标签: php wordpress woocommerce checkout orders

创建woocommerce订单时,订单的状态为"处理"。我需要将默认订单状态更改为" pending"。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:11)

默认订单状态由付款方式或付款网关设置。

您可以尝试使用此自定义附加功能,但不起作用 (因为此挂钩在付款方式和付款网关之前被触发)

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' );
}

显然,每种付款方式(和付款网关)都在设置订单状态(取决于付款网关的交易响应)......

  

对于货到付款方式,可以使用专用过滤器挂钩进行调整,请参阅:
  Change Cash on delivery default order status to "On Hold" instead of "Processing" in 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: Auto complete paid Orders (depending on Payment methods)

答案 1 :(得分:0)

这种情况可以防止在初次更改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' );
    }
}

答案 2 :(得分:-3)

// 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;
}