基于 如果 WooCommerce 中没有付款,X 天后自动取消订单 答案代码,我进行了一些更改,尝试在 x 分钟(或 x 小时)后自动完成已付款订单:
add_action( 'woocommerce_order_status_changed', 'hourly_update_status_orders', 10, 4 );
function hourly_update_status_orders( $order_id, $old_status, $new_status, $order ) {
// Set Your shop time zone (http://php.net/manual/en/timezones.php)
date_default_timezone_set('Europe/London');
// Enable the process to be executed daily
if( in_array( $new_status, array('processing') )
&& get_option( 'paid_orders_hourly_process' ) < time() ) :
$time_delay = 60 * 5; // <=== SET the time delay (here 1 hour)
$current_time = strtotime(str_replace(':','-', date('Y-m-d h:i:s') ));
$targeted_time = $current_time - $time_delay;
// Get paid orders (10 mints old)
$paid_orders = (array) wc_get_orders( array(
'limit' => -1,
'status' => 'processing',
'date_created' => '<' . $targeted_time,
'return' => 'ids',
) );
if ( sizeof($paid_orders) > 0 ) {
$completed_text = __("The order is Completed.", "woocommerce");
// Loop through WC_Order Objects
foreach ( $paid_orders as $paid_order ) {
$order->update_status( 'completed', $complted_text );
}
}
// Schedule the process to the next day (executed once restriction)
update_option( 'paid_orders_hourly_process', $current_time + $time_delay );
endif;
}
我只能让它适用于每日更改,但不能适用于每小时更改......
有人可以帮我检查一下我哪里错了吗?
已更新
这些解决方案确实没有制定,对于每小时(或更短)的延迟也不是很有效,因为当发出新订单时(或当管理员对订单状态进行手动更改时)会触发代码。
现在您的代码中有一些错误,请尝试以下操作(未经测试):
add_action( 'woocommerce_order_status_changed', 'hourly_update_status_orders', 10, 4 );
function hourly_update_status_orders( $order_id, $old_status, $new_status, $order ) {
// Set Your shop time zone (http://php.net/manual/en/timezones.php)
date_default_timezone_set('Europe/Paris');
// Enable the process to be executed daily
if( in_array( $new_status, array('processing') )
&& get_option( 'paid_orders_hourly_process' ) < time() ) :
$targeted_time = date( 'Y-m-d H:00:00', strtotime( '-1 hour' ) );
// Get paid orders (10 mints old)
$paid_orders = (array) wc_get_orders( array(
'limit' => -1,
'status' => 'processing',
'date_created' => '<' . $targeted_time,
'return' => 'ids',
) );
if ( sizeof($paid_orders) > 0 ) {
$completed_text = __("The order is Completed.", "woocommerce");
// Loop through WC_Order Objects
foreach ( $paid_orders as $paid_order ) {
$order->update_status( 'completed', $complted_text );
}
}
// Schedule the process to the next day (executed once restriction)
update_option( 'paid_orders_hourly_process', $current_time + $time_delay );
endif;
}
代码位于活动子主题(或活动主题)的functions.php文件中。
如果您想使用分钟而不是小时,您应该使用类似以下内容:
$targeted_time = date( 'Y-m-d H:i:00', strtotime( '-10 minutes' ) );
如果您想使用天而不是小时,您应该使用类似以下内容:
$targeted_time = date( 'Y-m-d', strtotime( '-5 days' ) );
如果您想使用月份而不是小时,您应该使用类似以下内容:
$targeted_time = date( 'Y-m-d', strtotime( '-2 months' ) );
最后一点 - 更好的选择。
最好使用其他东西,例如由 Automatic (WordPress 和 WooCommerce 的所有者) 制作的免费插件 Action Scheduler,这是一个强大的调度库,已包含在 WooCommerce 和插件 Subscriptions 中并使用。
您可以在任何代码中使用它,它是比其他任何东西更好的选择。
现在我正在使用这段代码,它看起来比以前更高效。但仍然存在间隔问题。当状态从处理中变为完成时,它们之间没有间隔。
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()->date('Y-m-d H:i:s'));
$time_current = time();
$time_interval = $time_current - $time_order;
//Case refresh page after 3 hours at order, no changed status
if( $order->get_status() == 'processing' && $time_interval < 18000 ) {
$order->update_status( 'completed' );
}
}