在Woocommerce中,我试图根据订单的总金额自动完成处理订单。
目前,我有这段代码会自动完成所有处于处理状态的订单:
add_action( 'init', 'auto_update_orders_status_from_processing_to_completed' );
function auto_update_orders_status_from_processing_to_completed(){
// Get all current "processing" customer orders
$processing_orders = wc_get_orders( $args = array(
'numberposts' => -1,
'post_status' => 'wc-processing',
) );
if(!empty($processing_orders))
foreach($processing_orders as $order)
$order->update_status( 'completed' );
}
如何仅对于总金额少于$50
的订单使用此代码?
答案 0 :(得分:0)
您应该尝试使用以下功能之一,而不是使用init
挂钩,该功能将自动完成总金额少于$ 50的处理订单 (例如):
1)使用woocommerce_order_status_processing
动作挂钩(最佳选择):
add_action( 'woocommerce_order_status_processing', 'auto_complete_processing_orders_based_on_total', 20, 4 );
function auto_complete_processing_orders_based_on_total( $order_id, $order ){
// HERE define the max total order amount
$max_total_limit = 50;
if ( $order->get_total() < $max_total_limit ) {
$order->update_status( 'completed' );
}
}
代码进入您的活动子主题(活动主题)的function.php文件中。经过测试,可以正常工作。
2)使用woocommerce_thankyou
动作挂钩(如果您的订单始终处于处理状态,这是一个不错的选择):
add_action( 'woocommerce_thankyou', 'thankyou_auto_complete_processing_orders_based_on_total', 90, 1 );
function thankyou_auto_complete_processing_orders_based_on_total( $order_id ){
if( ! $order = wc_get_order( $order_id ) ){
return;
}
// HERE define the max total order amount
$max_total_limit = 50;
if( $order->has_status('processing') && $order->get_total() < $max_total_limit ){
$order->update_status( 'completed' );
}
}
代码进入您的活动子主题(活动主题)的function.php文件中。经过测试,可以正常工作。
A)使用init
钩子(最佳方法)
add_action( 'init', 'sql_auto_complete_processing_orders_based_on_total' );
function sql_auto_complete_processing_orders_based_on_total(){
// HERE define the max total order amount
$max_total_limit = 50;
global $wpdb;
// Very light bulk update direct SQL query
$orders_ids = $wpdb->query("
UPDATE {$wpdb->prefix}posts as a
JOIN {$wpdb->prefix}postmeta AS b ON a.ID = b.post_id
SET a.post_status = 'wc-completed'
WHERE a.post_status = 'wc-processing'
AND b.meta_key = '_order_total' AND b.meta_value < '$max_total_limit'
");
}
代码进入您的活动子主题(活动主题)的function.php文件中。经过测试,可以正常工作。
B)基于您的代码,使用init
钩(非常重,但与woocommerce中将来的数据库结构更改更兼容,如果可以的话)发生一天):
add_action( 'init', 'init_thankyou_auto_complete_processing_orders_based_on_total' );
function init_thankyou_auto_complete_processing_orders_based_on_total(){
// HERE define the max total order amount
$max_total_limit = 50;
// Get all processing orders
$orders = wc_get_orders( array( 'limit' => -1, 'status' => 'processing') );
if( sizeof($orders) > 0 ) {
// loop through processing orders
foreach( $orders as $order ) {
if( $order->get_total() < $max_total_limit ) {
$order->update_status( 'completed' );
}
}
}
}
代码进入您的活动子主题(活动主题)的function.php文件中。经过测试,可以正常工作。
相关:WooCommerce: Auto complete paid Orders (depending on Payment methods)