10天后删除处理订单

时间:2019-06-25 20:37:24

标签: php mysql wordpress function woocommerce

我正在尝试创建一个功能,该功能应检查对WooCommerce商店的订单。如果订单状态在10天内没有从处理更改为完成,则该功能应取消订单。

我找到了wpdb,我认为我已经设法查找了10天以上的订单。有人可以指出正确的方向,说明如何从这里开始吗?我假设我必须创建一个包含WC_Order :: update_status()的函数以更新订单状态。我只是不知道如何将所有这些链接在一起。

我一直在浏览Wordpress Codex,发现了wpdb,其中包含一组用于与数据库进行交互的功能。我假设我必须在函数中使用wpdb,但不知道如何从这里开始。

我还一直在寻找用真正的cron替换本地的Wordpress cron,以检查日期并更新订单状态。但是,经过一些研究,我认为这是解决我的问题的一种太复杂的方法。

function get_processing_expiry() {        
            global $wpdb;

            $processing_expiry = $wpdb->get_col( $wpdb->prepare( "
                    SELECT posts.ID
                    FROM {$wpdb->posts} AS posts
                    WHERE posts.post_status = 'wc-processing'
                    AND posts.post_date < %s
            ", date( 'Y-m-d H:i:s', strtotime('-10 days') ) ) );

            return $processing_expiry;
    }

我希望订单处理十天以上时,订单状态将从处理中更改为取消。

3 个答案:

答案 0 :(得分:0)

例如,在MySQL中,您有很多日期和时间函数来检查记录是否早于10天。为此,您可以使用INTERVAL这样的东西:

SELECT posts.ID
FROM {$wpdb->posts} AS posts
WHERE posts.post_status = 'wc-processing'
AND posts.post_date < NOW() - INTERVAL 10 DAY

然后,您只能使用SQL来解决它。

https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

答案 1 :(得分:0)

此函数将处理它:

function expire_after_x_days(){
        global $wpdb;
    // Get current time
        $today = date("mdy");

    // set time to expire
        $time_to_expire = "-10 days";
        $expiration_date = date("mdy", strtotime( $today . $time_to_expire));

    // Get orders with processing status
        $result = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_type = 'shop_order' AND post_status = 'wc-processing'");

        if( !empty($result)) foreach ($result as $order){
            // Get order's time
            $order_time = get_the_time('mdy', $order->ID );

    // Compare order's time with current time -10 days
        if ( $order_time < $expiration_date ){

    // Update order status    
                $orders = array();
                $orders['ID'] = $order->ID;
                $orders['post_status'] = 'wc-cancelled';
                wp_update_post( $orders );
            }
        }
} 

    // Use the best HOOK for your case 
    add_action( 'admin_footer', 'expire_after_x_days' );

    // OR simply call the function if you are pasting this in your functions.php 

答案 2 :(得分:0)

您甚至不需要使用WP就可以实现这一点,您需要使用MySQL Scheduled Events,为此,您需要创建一个存储过程Cancel_Orders(),该逻辑具有删除或取消订单并每天或间隔一定时间安排事件的逻辑

CREATE EVENT Cencel_Orders_Event
ON SCHEDULE EVERY 5 SECOND
DO
CALL Cancel_Orders();

参阅http://www.mysqltutorial.org/mysql-triggers/working-mysql-scheduled-event/