Вместо использования init
, вы должны попытаться использовать одну из следующих функций, которая автоматически завершит обработку заказов , общая сумма которых меньше $ 50 (например) :
1) Использование woocommerce_order_status_processing
action hook (лучший выбор) :
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' );
}
}
Код входит в функцию.php файл вашей активной дочерней темы (active theme).Протестировано и работает.
2) Использование woocommerce_thankyou
action hook (хорошая альтернатива, если ваши заказы всегда находятся в состоянии обработки) :
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 вашей активной дочерней темы (active theme).Проверено и работает.
3) Массовое обновление заказов на обработку на основе общей суммы (2 варианта) :
A) Самый легкий и эффективный способс прямым запросом SQL с использованием init
hook (лучший способ) :
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
hook ( Очень тяжелый , но более совместимый с будущей структурой базы данныхизменения в 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: автоматическое заполнение оплаченных заказов (в зависимости от способов оплаты)