Удалить обработку заказов через 10 дней - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь создать функцию, которая должна проверять заказы, сделанные в магазине WooCommerce. Если статус заказа не был изменен с обработки на выполнение в течение 10 дней, функция должна отменить заказ.

Я нашел wpdb, где, по-моему, мне удалось выполнить поиск, чтобы найти заказы старше 10 дней. Может ли кто-нибудь указать мне правильное направление, как действовать дальше? Я предполагаю, что мне нужно создать функцию, которая содержит WC_Order :: update_status () для обновления статуса заказа. Я просто не знаю, как связать все это вместе.

Я просматривал кодекс Wordpress и нашел wpdb, который содержит набор функций, используемых для взаимодействия с базой данных. Я предполагаю, что мне нужно использовать wpdb в моей функции, но не знаю, как действовать дальше.

Я также искал замену родного крона Wordpress реальным кроном, который проверяет дату и обновляет статус заказов. Однако после некоторых исследований я подумал, что это слишком сложный способ решения моей проблемы.

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 голосов
/ 26 июня 2019

Эта функция справится с этим:

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 
0 голосов
/ 27 июня 2019

Вы можете достичь этого даже без использования WP. Вам нужно работать с запланированными событиями MySQL, для этого вам нужно создать хранимую процедуру 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/

0 голосов
/ 25 июня 2019

В 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...