创建订单时将 WooCommerce 订单状态从处理中设置为待处理
Set WooCommerce order status when order is created from processing to pending
创建 woocommerce 订单时,订单状态为 "processing"。我需要将默认订单状态更改为 "pending"。
我怎样才能做到这一点?
默认订单状态由支付方式或支付网关设置。
您可以尝试使用此自定义挂钩函数,但它不会工作 (因为此挂钩在支付方式和支付网关之前触发):
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' );
}
显然每种支付方式(和支付网关)都在设置订单状态(取决于支付网关的交易响应)……
For Cash on delivery payment method, this can be tweaked using a dedicated filter hook, see:
现在您可以 更新 订单状态 使用 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 文件或任何插件文件。
经过测试并有效
Note: The hook woocommerce_thankyou
is fired each time the order received page is loaded and need to be used with care for that reason...
Now the function above will update the order status only the first time. If customer reload the page, the condition in the IF
statement will not match anymore and nothing else will happen.
相关主题:
// 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;
}
如今,如果您使用的支付网关使用 WC_Order->payment_complete()
正确设置订单状态,您可以使用 woocommerce_payment_complete_order_status
过滤器。
这比使用 woocommerce_thankyou
挂钩要好,因为我们是立即设置订单状态,而不是在已经设置之后应用它。
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
作为备用.
创建 woocommerce 订单时,订单状态为 "processing"。我需要将默认订单状态更改为 "pending"。
我怎样才能做到这一点?
默认订单状态由支付方式或支付网关设置。
您可以尝试使用此自定义挂钩函数,但它不会工作 (因为此挂钩在支付方式和支付网关之前触发):
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' );
}
显然每种支付方式(和支付网关)都在设置订单状态(取决于支付网关的交易响应)……
For Cash on delivery payment method, this can be tweaked using a dedicated filter hook, see:
现在您可以 更新 订单状态 使用 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 文件或任何插件文件。
经过测试并有效
Note: The hook
woocommerce_thankyou
is fired each time the order received page is loaded and need to be used with care for that reason...
Now the function above will update the order status only the first time. If customer reload the page, the condition in theIF
statement will not match anymore and nothing else will happen.
相关主题:
// 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;
}
如今,如果您使用的支付网关使用 WC_Order->payment_complete()
正确设置订单状态,您可以使用 woocommerce_payment_complete_order_status
过滤器。
这比使用 woocommerce_thankyou
挂钩要好,因为我们是立即设置订单状态,而不是在已经设置之后应用它。
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
作为备用.