Продолжаю публиковать уроки про «условные методы оплаты», вы уже можете прочекать ранее опубликованные, в которых мы отключали методы оплаты в зависимости от суммы заказа и в зависимости от страны/города покупателя.
И конечно же, не забывайте, что у меня на сайте есть видеокурс по WooCommerce, в котором мы создаём собственную тему для интернет-магазина с нуля на основе вёрстки.
Сегодня мы попробуем включать и отключать доступные на странице оформления заказа и на странице оплаты конкретного заказа методы оплаты в зависимости от способа доставки, выбранного покупателем.
Сам сниппет кода выглядит вот так и вы вполне можете его вставить в functions.php
вашей текущей темы, или же дочерней – если не хотите, чтобы всё слетело после обновлений.
add_filter( 'woocommerce_available_payment_gateways', 'truemisha_payments_on_shipping' ); function truemisha_payments_on_shipping( $available_gateways ) { if( is_admin() ) { return $available_gateways; } if( is_wc_endpoint_url( 'order-pay' ) ) { return $available_gateways; } $chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); //echo '<pre>';print_r( $chosen_methods ); if ( isset( $available_gateways[ 'cod' ] ) && 'free_shipping:1' == $chosen_methods[0] ) { unset( $available_gateways[ 'cod' ] ); // отключаем оплату при доставке } return $available_gateways; }
Ну и конечно же, нужно немного изменить, либо создать отдельный код для страниц оплаты конкретного заказа (это в личном кабинете пользователя), разница заключается в том, что на тех страницах нет корзины и способ доставки нужно получать из заказа.
add_filter( 'woocommerce_available_payment_gateways', 'truemisha_payments_on_shipping_2' ); function truemisha_payments_on_shipping_2( $available_gateways ) { if( is_admin() ) { return $available_gateways; } if( ! is_wc_endpoint_url( 'order-pay' ) || empty( $_GET[ 'key' ] ) ) { return $available_gateways; } $order_id = wc_get_order_id_by_order_key( $_GET[ 'key' ] ); $order = wc_get_order( $order_id ); if ( isset( $available_gateways[ 'cod' ] ) && $order->has_shipping_method( 'free_shipping' ) ) { unset( $available_gateways[ 'cod' ] ); } return $available_gateways; }
Давайте познакомимся с методами объектами WC_Order
для получения информации о доставки, вы можете использовать get_shipping_methods()
, чтобы получить массив со всей информацией, можете использовать get_shipping_method()
, чтобы получить только название способа доставки. Я вот например использовал проверку при помощи has_shipping_method()
, передав туда ярлык способа доставки.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Спасибо за подсказку, как раз искал подобный способ. Со своей задачей данный код справляется великолепно! Только в моем случае появились побочные эффекты! Не знаю каким боком но девятая строка в первом сниппете:
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
.в моем случае также повлияла на отображение списка меню в редакторе меню администратора, то есть область "Структура меню" пропала полностью! В визуальных настройках редактор меню остался. В логах нашел следующую информацию: "PHP Fatal error: Uncaught Error: Call to a member function get() on null in ..." ну и далее путь к этой строке сниппета. После того как закомментировал данную строку редактор меню заработал.
Это как то лечится?
Спасибо за вашу внимательность, да, можно легко исправить условием
is_admin()
, код обновил.Спасибо за помощь )) все работает.
Супер! ⚡️
Очень прошу, сделайте урок по отображению полей оформления заказа в зависимости от физического или юридического лица. И было бы круто показать эти данные в письме клиенту и заказе в админке.
Что-то подобное уже есть на сайте.
Немного не то, тут лучше делать обычным переключателем в виде плашек или radio. И в зависимости от сделанного выбора, показывать нужные поля.
Можно пример такого кода?
Подскажите, а как одновременно отключить 2 способа оплаты?
Добрый день, Михаил!
Подскажите чтобы объединить способ доставки и категорию для отключения кнопки перехода на оплату из корзины, как лучше использовать две проверки?
Заранее благодарю!
Добрый день!
Имеется ввиду же категория товара?
Думаю примерно так:
Здравствуйте, во втором коде на 16 строке в конце ) { лишние
Здравствуйте и спасибо! (исправлено)
Всё получилось и работает, но появился вопрос, можно ли сделать в обратную сторону? К примеру чтобы чековые платежи показывались только для самовывоза?
Ну в целом вы можете
$available_gateways
черезforeach
пропустить и отключить всё, кроме чековых платежей.Это слишком сложно для меня я только копипастить умею. Лучше сделаю какие-нибудь костыли, спасибо Вам за замечательный блог!
Сорри, сначала невнимательно прочитал и в итоге не сразу понял вашу задачу. В первом коде меняем эти строчки:
Во втором:
То есть мы оставляем способ оплаты чеками только для самовывоза, во всех остальных случаях отключаем.
Делаем проверку
isset( $available_gateways[ 'cheque' ] )
, чтобы убедиться, что оплата чеками вообще существует на сайте, этот код можно убрать и всё будет работать всё равно, но будем получать PHP нотисы в некоторых ситуациях.Проверки
'local_pickup:4' !== $chosen_methods[0]
и! $order->has_shipping_method( 'local_pickup' )
позволяют нам проверить, что текущий выбранный метод доставки не является самовывозом, т.е. любой другой.Здравствуйте! Есть проблема, если к методу оплаты добавлена комиссия, то при переключении способов доставки комиссия остается даже на том способе оплаты, на котором она не подключалась или наоборот, не появляется, где она должна быть. Я так понимаю должно быть дополнительное обновление, после обновления суммы?
Здравствуйте. Есть проблема - на сайте Woocommerce периодически исчезают способы оплаты для неавторизованных пользователей. Соответственно, клиенты не могут оплатить заказ. Есть ли какие-то способы автоматической проверки наличия способов оплат для неавторизованных пользователей? Например, если способы оплат пропали - чтоб сообщалось на почту, телефон или мессенджер? Заранее спасибо.