Я нахожусь в процессе создания дополнительного плагина, который представляет собой пользовательский платежный шлюз, использующий плагин 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;
}
Как вы можете видеть, я прокомментировал бит, где нужно опустошить корзину, а также конечная точка добавляет шаблон благодарности вместо того, чтобы просто оставаться на той же странице.
Пока что я попробовал:
Ничто не работает, и я прошел через плагин и вижу несколько вещей, которые я мог сделать.
Найдите фильтр, похожий на приведенный ниже, который может делать то, что мне нужно
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
}
});
Мне нужно, чтобы он оставался на той же странице (обновлялся) так же, как и при проверке деталей для обновления итогов.
Создайте заказ с этими текущими деталями и верните номер заказа
Не прекратит сеанс корзины в этот момент, поэтому, если я обновлю браузер для аргументов, он останется в живых. (Я разработаю способ убить корзину, когда человек уходит, и в этот момент был создан уникальный сеанс).
Именно с этим битом я боролся в течение прошлых нескольких дней и не уверен лучший путь.
Любая помощь или указатели будут с благодарностью.
Спасибо
И я
Хорошо, понял это.
Существует действие заголовка, которое очищает корзину.
Нам нужно было добавить еще несколько статусов в массив, чтобы он игнорировал его.
Сначала удалите действие, а затем добавьте свой собственный метод.
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');
Других решений пока нет …