PHP рассчитать прошедшие даты с сегодняшнего дня - PullRequest
1 голос
/ 01 февраля 2020

Я создал функцию PHP, которая вычисляет, сколько лет заказу WordPress / WooCommerce. Если заказ старше 90 дней, он должен быть отменен. Функция раньше работала отлично. Однако с нового 2020 года он перестал работать. Я бы предположил, что это потому, что эта функция запуталась из-за того, что -90 дней, начиная с сегодняшнего дня, это год 2019. Как я могу заставить вычисления работать с прошлыми годами / 2019?

Я пытался играть с разными форматами даты из кодекса WordPress вместо mdy. Тем не менее, это, кажется, не имеет никакого значения.

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

    // set time to expire
    $time_to_expire = "-90 days";
    $expiration_date = date("m/d/y", 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('m/d/y', $order->ID );

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

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

add_action( 'admin_footer', 'expire_after_x_days' );

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

Вы рассматриваете эти переменные как экземпляры DateTime, но они являются строками. $order_time < $expiration_date сравнивает строки по алфавиту, а не по значению даты. Вместо этого используйте класс DateTime (https://www.php.net/manual/en/class.datetime.php).

2 голосов
/ 01 февраля 2020

Вы можете значительно упростить это, выполнив запрос UPDATE с предложением WHERE, чтобы получать только те заказы, которые старше 90 дней. Не нужно извлекать их все и l oop поверх результатов.

Вам нужно будет установить post_created на фактическое имя вашего столбца.

function expire_after_x_days() {
    global $wpdb;

    $result = $wpdb->query("UPDATE $wpdb->posts 
                            SET post_status = 'wc-cancelled'
                            WHERE post_type = 'shop_order' 
                              AND post_status = 'wc-processing'
                              AND post_created < DATE_SUB(NOW(), INTERVAL 90 DAY)");
} 
1 голос
/ 01 февраля 2020

Пожалуйста, измените формат даты с м / д / г на Гм . Пожалуйста, смотрите ниже код.

Вы также можете проверить вручную, изменив $ order_time = '12 / 11/18 ';

function expire_after_x_days(){
        global $wpdb;
        // Get current time
        $today = date("Y-m-d");

        // set time to expire
        $time_to_expire = "-90 days";
        $expiration_date = date("Y-m-d", 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('Y-m-d', $order->ID );
            // Compare order's time with current time
            //$order_time = '12/11/18';
                if ( $order_time < $expiration_date ){
                    //die("olde");
                        // Update order status    
                        $orders = array();
                        $orders['ID'] = $order->ID;
                        $orders['post_status'] = 'wc-cancelled';
                        wp_update_post( $orders );
                }else{
                    //echo 'not old date';die;
                }
            }
        }

} 
add_action( 'admin_footer', 'expire_after_x_days' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...