gpt4 book ai didi

php - 更新所有 WooCommerce 处理订单中的 ACF 字段

转载 作者:行者123 更新时间:2023-12-04 08:00:37 25 4
gpt4 key购买 nike

目标是获取/查询/循环所有具有 order_status“正在处理”的订单,如果他们没有延期交货的商品,则将高级自定义字段“internal_status”更新为“准备打包”
现在对于一种测试方法(为了保持简单并查看它是否有效),我只是尝试在订单传递到状态“已完成”时更新自定义字段(还没有“缺货商品”的条件)
基于 Auto completed status for all existing processing orders in 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 文件中。第一个功能经过测试并有效。第二个函数不会抛出任何错误。
相关: Change order status for backordered items in Woocommerce

关于php - 更新所有 WooCommerce 处理订单中的 ACF 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66496936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com