目标是获取/查询/循环所有具有order_status "Processing"的订单,如果他们没有项目在backorder,更新一个高级自定义字段'internal_status'值'Ready to Pack'
现在测试的方法(保持简单,看看它是否工作),我只是试图更新自定义字段每当一个订单被传递到状态"完成"(无"缺货"条件;然而)
基于WooCommerce应答代码中所有现有处理订单的自动完成状态,以下是我的代码尝试:
function auto_update_orders_internal_status(){
// 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)
add_action('acf/save_post', 'update_internal_status_ready_to_pack');
}
add_action( 'woocommerce_order_status_completed', 'auto_update_orders_internal_status' );
function update_internal_status_ready_to_pack ( $order_id ) {
$internalstatus = 'Ready to Pack';
update_field( 'internal_status', $internalstatus, $order_id );
}
我意识到我在这里没有完全掌握的一件事是查询/获取所有订单的"处理状态"的方法。并更新相应的字段。
您应该尝试以下轻量级且有效的方法(使用使用WPDB
SQL查询的自定义函数,查询所有没有缺货的订单id):
/*
* Custom function that query all orders without backordered items
*
* @param bool|string $status Order status can be defined (optional)
* @return array
*/
function get_orders_ids_without_backordered_items( $status = false ) {
global $wpdb;
$post_status_query = $status ? "AND p.post_status = 'wc-" . str_replace('wc-', '', $status) . "'" : '';
return (array) $wpdb->get_col( "
SELECT p.ID
FROM {$wpdb->prefix}posts p
WHERE p.ID NOT IN (
SELECT DISTINCT oi.order_id FROM {$wpdb->prefix}woocommerce_order_items oi
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
WHERE oim.meta_key = 'Backordered'
) $post_status_query
" );
}
// Update ACF 'internal_status' custom field on processing orders.
add_action( 'woocommerce_order_status_completed', 'auto_update_orders_internal_status', 10, 2 ); // Optional (to be removed if not necessary)
add_action( 'woocommerce_order_status_processing', 'auto_update_orders_internal_status', 10, 2 );
function auto_update_orders_internal_status( $order_id, $order ){
// Get all "processing" orders without backordered items
$orders_ids = get_orders_ids_without_backordered_items( 'processing' );
if( ! empty($orders_ids) ) {
foreach($orders_ids as $post_id) {
$acf_value = 'Ready to Pack';
if ( get_field( 'internal_status', $post_id ) !== $acf_value ) {
update_field( 'internal_status', $acf_value, $post_id );
}
}
}
}
代码放在活动子主题(或活动主题)的functions.php文件中。第一个函数经过测试并正常工作。第二个函数没有抛出任何错误。
相关:更改Woocommerce中缺货项目的订单状态