HPOS - 自动删除 Woocommerce 中超过 3 个月的已完成订单

问题描述 投票:0回答:1

我需要设置 Woocommerce 自动清理超过 3 个月的已完成订单,并发现 如何在 Woocommerce 中自动删除旧的已完成订单 答案代码,该代码在激活 HPOS 的情况下不起作用。我添加了一些调试语句并为每个订单 ID 获取

Error deleting order ID:
。知道如何解决吗?

    add_action( 'admin_footer', 'auto_trash_old_completed_orders_345erhwe546' );
    function auto_trash_old_completed_orders_345erhwe546() {
        global $nm_theme_options;

        if ( isset( $nm_theme_options['delete_all_woo_orders_older_then_3_months'] ) && $nm_theme_options['delete_all_woo_orders_older_then_3_months'] == 1 ) {
            // Theme option is set to delete old orders

            $completed_order_ids = wc_get_orders( array(
                'limit'         => 100, // By batch of 100 orders
                'status'        => 'completed', 
                'return'        => 'ids',
                'date_created'  => '<' . date( 'Y-m-d', strtotime( '-3 months' ) ),
            ) );

            if ( count( $completed_order_ids ) > 0 ) {
                // Orders found, proceed to delete

                foreach ( $completed_order_ids as $completed_order_id ) {
                    $trashed = wp_trash_post( $completed_order_id );
                    $deleted = wp_delete_post( $completed_order_id, true );

                    // DEBUG
                    if ( ! $trashed || ! $deleted ) {
                        echo '<script>alert("Error deleting order ID: ' . $completed_order_id . '");</script>';
                    }
                    
                }
            }
            
            // DEBUG
            echo '<script>alert("Orders deleted: ' . count( $completed_order_ids ) . '");</script>';
            
        } else {
            
            // DEBUG
            echo '<script>alert("Theme option not set to delete old orders.");</script>';
            
        }
    }
php wordpress woocommerce
1个回答
0
投票

启用高性能订单存储 (HPOS) 时,不应使用经典的 WordPress 帖子和帖子元功能。相反,您可以使用

WC_Data
delete()
方法
,例如:

add_action( 'admin_footer', 'auto_trash_old_completed_orders' );
function auto_trash_old_completed_orders(){
    $completed_orders = wc_get_orders( array(
        'limit'         => 100, // By batch of 100 orders
        'status'        => 'completed', 
        'date_created'  => '<' . date("Y-m-d", strtotime("-6 months")),
    ) );

    if ( count($completed_orders) > 0 ){
        foreach( $completed_orders as $completed_order ) {
            $completed_order->delete(true); 
        }
    }
} 

代码位于子主题的functions.php 文件中(或插件中)。应该可以。

请注意,我已经减少了要处理的订单数量……这个“限制”参数应该根据托管进行微调。

© www.soinside.com 2019 - 2024. All rights reserved.