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

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

我需要设置 WooCommerce 自动清理超过 3 个月的已完成订单,并发现 如何在 Woocommerce 中自动删除旧的已完成订单 答案代码,该代码不适用于激活的高性能订单存储 (HPOS)。

这是我的代码尝试:

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>';
        
    }
}

我添加了一些调试语句,并为每个订单 ID 获取 “删除订单 ID 时出错”。知道如何解决吗?

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.