Woocommerce не отменяет статус отложенных заказов - PullRequest
0 голосов
/ 20 мая 2019

Мне нужно отменить отложенные ордера в определенном сценарии через 4 часа после создания ордера.

Пример: 2 клиента

1-ый клиент делает заказ в 17:00, поэтому его статус приостановлен (я хочу, чтобы он был отменен через 4 часа с даты создания заказа, если он не оплатил, поэтому он должен быть отменен 9: 00:00)

2-ой заказчик делает заказ в 5:37, поэтому он находится в режиме ожидания (я хочу, чтобы он был отменен через 4 часа после даты создания заказа, если он не оплатил, поэтому он должен быть отменен 9: 37)

Я хочу, чтобы он отменял заказы сразу после истечения каждого заказа по истечении 4 часов с даты создания заказа отдельно, а не как задание cron, чтобы работать каждые 4 часа, как в предыдущем примере, если событие cron начинается в 6: 00:00 и будет выполняться каждые 4 часа, поэтому первый заказ клиента истекает в 22:00, а второй - также в 22:00.

Я попробовал решение здесь Автоматически отменять заказ через X дней, если в WooCommerce нет платежей

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

Я использовал многие из решений, упомянутых в соответствующем вопросе выше, но только тот, который запоминает первый ответ, когда я помню, когда администратор / менеджер магазина посещает страницу заказов. Мне нужно, чтобы это делалось автоматически, без каких-либо действий со стороны людей. .

Вот мой код в плагине для отмены заказов

<?php


function ash2osh_faw_get_unpaid_submitted() {        
        global $wpdb;
          $options = get_option('woocommerce_' . ASH2OSH_FAW_PAYMENT_METHOD . '_settings');
        $expire_hours =  $options['unpaid_expire'];
        if(!trim($expire_hours)){
            $expire_hours='48';
        }
        $unpaid_submitted = $wpdb->get_col( $wpdb->prepare( "
                SELECT posts.ID
                FROM {$wpdb->posts} AS posts
                WHERE posts.post_status = 'wc-on-hold'
                AND posts.post_date < %s
        ", date( 'Y-m-d H:i:s', strtotime('-'.$expire_hours.' hours') ) ) ); 

        return $unpaid_submitted;
}

function ash2osh_faw_wc_cancel_unpaid_submitted() {        
        $unpaid_submit = ash2osh_faw_get_unpaid_submitted();

        if ( $unpaid_submit ) {                
                foreach ( $unpaid_submit as $unpaid_order ) {                        
                        $order = wc_get_order( $unpaid_order );
                        $cancel_order = True;

                        foreach  ( $order->get_items() as $item_key => $item_values) {                                
                                $manage_stock = get_post_meta( $item_values['variation_id'], '_manage_stock', true );
                                if ( $manage_stock == "no" ) {                                        
                                        $payment_method = $order->get_payment_method();                                        
                                        if ( $payment_method == "cheque" ) {
                                                $cancel_order = False;
                                        }
                                }                                
                        }
                        if ( $cancel_order == True ) {
                                $order -> update_status( 'cancelled', __( 'Unpaid submission expired after hours set in payment plugin options.', 'woocommerce') );
                        }
                }
        }        
}
add_action( 'woocommerce_cancel_unpaid_submitted', 'ash2osh_faw_wc_cancel_unpaid_submitted' );//for customization purposes

Это третье решение здесь: Автоматически отменять заказ через X дней, если платеж в WooCommerce не проверяется и работает нормально: НО я хочу, чтобы он был отменен, когда заказ находится в состоянии удержания, а не завершено / обрабатывается и подлежит отмене, если прошло 4 часа после даты создания заказа, и это должно быть запланировано и выполняться каждые 30 минут, а не ежедневно

1 Ответ

0 голосов
/ 15 июля 2019

ты пробовал это? Автоматическая отмена Woocommerce On-Hold через X дней . У меня та же проблема, что и у вас (но с 72-часовым временем отмены), а также нет ограничений на платежный шлюз, так что это мой код:

function get_unpaid_submitted() {        
    global $wpdb;

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

    return $unpaid_submitted;
}
function wc_cancel_unpaid_submitted() {
    $unpaid_submit = get_unpaid_submitted();
    if ( $unpaid_submit ) {                
        foreach ( $unpaid_submit as $unpaid_order ) {                        
            $order = wc_get_order( $unpaid_order );
            $order -> update_status( 'cancelled', __( 'Orden cancelada por falt de pago.', 'woocommerce') );
        }
    }        
}
add_action('woocommerce_cancel_unpaid_submitted', 'wc_cancel_unpaid_submitted',10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...