【问题标题】:Update an ACF field in all WooCommerce processing orders更新所有 WooCommerce 处理订单中的 ACF 字段
【发布时间】:2021-06-04 09:26:21
【问题描述】:

目标是获取/查询/循环所有订单状态为“正在处理”的订单,如果它们没有延期交货的项目,则将高级自定义字段 '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 );

}

我知道我在这里没有完全掌握的一件事是查询/获取“处理状态”的所有订单并更新其相应字段的方法。

【问题讨论】:

    标签: php sql woocommerce advanced-custom-fields orders


    【解决方案1】:

    您应该尝试以下轻量级且有效的方式(使用使用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

    【讨论】:

    • 第二个函数正在应用更改,但是 SQL 查询似乎有些问题,因为这会使每个处理订单上的自定义字段都发生更改,即使那些仅包含延期交货的项目也会受到影响,所以 atm 基本上影响了所有处理订单,无论它们的项目状态如何。事情终于奏效了,但只有一半:')
    • 现在,当我手动搜索 woocommerce_order_itemmeta 表,查看延期交货的正确订单商品 ID 时,我找不到任何等于“延期交货”的元密钥,即使该商品已明确延期交货并具有正确的库存产品设置,我正在尝试进一步调查
    • 好的,我已经找出问题所在:将产品库存设置设置为管理库存->“允许延期交货”,从技术上讲,该产品处于延期交货状态,但它没有注册元键“延期交货" 在 woocommerce_order_itemmeta 表中。产品延期交货设置必须是“允许,但通知客户”,以便“延期交货”元键显示在 woocommerce_order_itemmeta 表中,并使上述查询正常工作。谢谢你,洛伊克!
    • @JaimeMatos 很高兴知道...我会添加注释。
    • @JaimeMatos 您现在提出的问题与您最初的问题不同(您要求在没有延期交货的情况下获得订单,以更新自定义字段)。按照您现在的要求管理实时库存/订单是不同的,我认为比您想象的要复杂得多。你应该提出一个新问题,更好地解释事情。问候。
    猜你喜欢
    • 2022-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2017-12-13
    • 2019-03-27
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多