Оставайтесь на той же странице и не очищайте сессию корзины во время оформления заказа Woocomerce

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

Это работает, и я вижу форму оплаты правильно и пункты, что здорово.
У меня проблема с опцией процесса оплаты.

Страница оформления заказа имеет i-frame для платежного решения и должна отображаться только при создании заказа и наличии идентификатора. И чтобы убедиться, что у нас есть все данные о людях и т. Д.

Однако процесс оплаты приведет вас на страницу благодарности.
Это также сбрасывает сессию корзины.

даже если я перенаправлю URL на страницу корзины, поиграв с ней, она все равно убивает корзину.

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

Функция в моем расширенном классе такова.

        public function process_payment( $order_id ) {

global $woocommerce;

#$order = wc_create_order();
///
$order = new WC_Order( $order_id );

// Mark as on-hold (we're awaiting the cheque)
$order->update_status('on-hold', __( 'Awaiting Confirmation of Funds', 'woocommerce' ));

// Reduce stock levels
///$order->reduce_order_stock();

// Remove cart
//$woocommerce->cart->empty_cart();

// Return thankyou redirect
return array(
'refresh' => true,
'reload' => false,
'result' => 'success',
'redirect' => $this->get_return_url( $order )
);
///return $order_id;
}

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

Пока что я попробовал:

  • Воспроизведение кода из моей проверки на странице благодарности и что
    приводит к неопределенному извлечению, потому что процесс удаляет его
    затем
  • Изменение ссылки на конечную точку так же, как оформить заказ
  • Создание другой страницы и размещение на ней того же шорткода

Ничто не работает, и я прошел через плагин и вижу несколько вещей, которые я мог сделать.

  • Скопируйте функцию process_payment в мой расширенный класс и
    эффективно переписать его
    или же
  • Найдите фильтр, похожий на приведенный ниже, который может делать то, что мне нужно

    add_action (‘woocommerce_thankyou’, function () {

    global $woocommerce;
    $order = new WC_Order();
    if ( $order->status != 'failed' ) {
    wp_redirect( home_url() ); exit; // or whatever url you want
    }
    

    });

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

Именно с этим битом я боролся в течение прошлых нескольких дней и не уверен лучший путь.

Любая помощь или указатели будут с благодарностью.

Спасибо

И я

1

Решение

Хорошо, понял это.

Существует действие заголовка, которое очищает корзину.
Нам нужно было добавить еще несколько статусов в массив, чтобы он игнорировал его.

Сначала удалите действие, а затем добавьте свой собственный метод.

function st_wc_clear_cart_after_payment( $methods ) {
global $wp, $woocommerce;

if ( ! empty( $wp->query_vars['order-received'] ) ) {

$order_id = absint( $wp->query_vars['order-received'] );

if ( isset( $_GET['key'] ) )
$order_key = $_GET['key'];
else
$order_key = '';

if ( $order_id > 0 ) {
$order = wc_get_order( $order_id );

if ( $order->order_key == $order_key ) {
WC()->cart->empty_cart();
}
}

}

if ( WC()->session->order_awaiting_payment > 0 ) {

$order = wc_get_order( WC()->session->order_awaiting_payment );

if ( $order->id > 0 ) {
// If the order has not failed, or is not pending, the order must have gone through
if ( ! $order->has_status( array( 'failed', 'pending','pending-st-cleared-funds','on-hold' ) ) ) { ///// <- add your custom status here....
WC()->cart->empty_cart();
}
}
}
}
function override_wc_clear_cart_after_payment() {
remove_filter('get_header', 'wc_clear_cart_after_payment' );
add_action('get_header', 'st_wc_clear_cart_after_payment' );
}
add_action('init', 'override_wc_clear_cart_after_payment');
1

Другие решения

Других решений пока нет …