✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Как программно добавить пользовательскую скидку в WooCommerce Checkout

462

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

Почему купоны — это способ сделать это

В более старых версиях WooCommerce у нас было несколько («хакерских») вариантов добавления скидок с помощью кода, например предоставление отрицательного числа add_fee()или работа с get_discounted_price(). К сожалению, эти методы больше не работают или считаются устаревшими и будут удалены в более поздних версиях. Структурно хороший способ добавить скидки — использовать встроенную функцию купонов в WooCommerce.

Однако купон, как правило, не может быть автоматически применен к корзине. Он требует, чтобы покупатель вручную ввел код купона, который ему или ей должен был быть предоставлен. В некоторых интернет-магазинах вы просто хотите, чтобы скидка применялась автоматически при выполнении определенного условия без каких-либо действий покупателя. Это то, что мы исправим с помощью кода.

Пользовательские скидки с купонами

Вам нужно будет создать купон с кодом и настроить его с нужными параметрами. Вы сможете применять его, удалять и изменять различные выходные данные везде, где купон виден покупателю. При желании, если вы на самом деле не хотите, чтобы купоны были доступны для покупателей в вашем интернет-магазине, мы рассмотрим несколько простых приемов, чтобы скрыть возможности ручного ввода кодов купонов.

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

Создайте свою скидку в виде купона

Первым шагом является создание купона, который будет «заполнителем» для вашей скидки. Самый простой — просто создать его в панели администратора WooCommerce (WooCommerce > Купоны > Добавить купон).

Если вы хотите создать купон программно, купон на самом деле является публикацией, которую вы можете создать wp_insert_post(), но вам нужно позаботиться о том, чтобы создать публикацию с купоном только один раз. В WooCommerce есть краткое руководство по программному созданию купона.

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

Создание класса PHP, который будет содержать весь наш код

Давайте, наконец, перейдем к кодированию! Вы можете определить этот класс непосредственно внутри вашей темы functions.php, в коде плагина или во включенном отдельном файле.

class AWPCustomDiscount { private $coupon_code = 'example';   public function __construct() {   } } new AWPCustomDiscount();

Назовите свой класс как угодно и замените переменную класса $coupon_codeтем, что вы назвали своим купоном. Не забудьте инициализировать класс после в конце (new AWPCustomDiscount()).

Если вы раньше программировали объектно-ориентированное программирование, это должно быть вам знакомо. Если нет, не волнуйтесь, это должно быть просто. Мы добавим сюда несколько функций и обратимся к коду купона с расширением $this->coupon_code. Начнем с кода, отвечающего за фактическое добавление купона при выполнении условий.

Программное применение купона

По опыту я понял, что перехват кода для применения и удаления купонов работает лучше всего и наиболее последовательно, используя следующие два крючка; один для корзины (woocommerce_before_cart) и один для оформления заказа (woocommerce_before_checkout_form).

Внутри функции все, что нам нужно сделать, это проверить условия, которые нам нужны. WooCommerce предлагает функции для получения объекта корзины with WC()->cart, которые мы можем использовать для получения всей необходимой информации о корзине, такой как ее товары и итоги. В качестве примера приведенный ниже код применит скидку, если общая сумма в корзине (за исключением любых скидок) превышает определенную сумму.

Мы также должны убедиться, что если условия не выполняются, мы должны удалить скидку, если она была добавлена ​​ранее. В нашем примере представьте, что клиент превысил максимальную сумму, но затем перешел в корзину, удалил некоторые товары и, таким образом, снова получил меньше необходимой суммы. Поскольку купоны не применяются автоматически, любые примененные купоны также необходимо удалить программным способом.

С использованиемapply_coupon

Купоны добавляются в объект корзины с apply_coupon()указанием кода купона в качестве параметра и удаляются из объекта корзины remove_coupon()с кодом купона в качестве параметра. Достаточно просто. Мы также можем использовать функцию, так удачно названную get_applied_coupons()в объекте корзины, чтобы проверить, был ли уже применен наш купон.

Если вы не знакомы с использованием объектно-ориентированного PHP в WordPress; вот краткий обзор того, как работает вышеприведенное: __construct()Функция будет выполняться всякий раз, когда класс инициализируется, что мы делаем сразу после класса. Внутри __construct()вы обычно добавляете все хуки, как обычно делаете, например, внутри functions.php. Чтобы WordPress нашел наши функции внутри нашего класса, нам нужно сообщить хуку, чтобы он ссылался на функцию, определенную в массиве, состоящем из $this(объекта класса) и имени функции.

Внутри функции addDiscount()мы программируем в наших условиях. В приведенном выше примере я получаю общее использование корзины WC()->cart->get_subtotal()и сравниваю его с моими условиями — выше 500.

Примечание. Если вам нужно получить и сравнить итоги корзины, имейте в виду, что большинство итогов включают купоны. Например, более знакомые WC()->cart->get_cart_contents_total()вернут полную сумму до отправки, но со скидками; Это означает, что если ваша скидка применялась ранее, эта сумма будет неверна для сравнения.

Вы можете позвонить apply_coupon(), не проверяя, был ли купон уже применен (ifпроверка в строке #14), потому что функция apply_coupon()сама позаботится о том, чтобы не добавить его повторно, если он был применен ранее. Однако эта ifпроверка не позволяет покупателю получать сообщение об ошибке «Купон уже применен» каждый раз при обновлении корзины.

Вот как ваша скидка будет отображаться в общей сумме корзины в корзине и при оформлении заказа:

Как программно добавить пользовательскую скидку в WooCommerce Checkout

Ваши условия скидки

Условия для вашего купона полностью зависят от вас и ваших потребностей. Я установил несколько примеров условий для добавления пользовательской платы в более раннем посте — например, в зависимости от места доставки или того, какие продукты находятся в корзине. Вы также можете сравнить сегодняшнюю дату, если хотите предоставить специальную скидку на Рождество или Хэллоуин, или предоставить скидку на основе условий вошедшего в систему клиента.

Если вы предпочитаете применять купон в зависимости от настроек, которые вы установили в самом купоне — например, исключить или включить определенные идентификаторы продуктов, вы также можете сделать это. Вы можете создать экземпляр объекта купона из кода купона, например:

С этим объектом купона у вас есть доступ ко всем функциям для получения любых настроек, которые вы установили в купоне. Например, получение идентификаторов продуктов, которые должны быть включены в купон:

Обратитесь к документации по классу WC_Coupon, чтобы узнать, как получить то, что вам нужно.

Исправить видимую метку купона

Купон теперь должен быть добавлен и удален, когда ваша корзина соответствует или не соответствует вашим условиям, установленным в addDiscount(). Однако в итоговой таблице как в корзине, так и при оформлении заказа скидка отображается как «Купон: пример» (или любой другой код вашего купона). Это не хорошо! К счастью, эту метку легко изменить с помощью фильтра woocommerce_cart_totals_coupon_label. Мы добавим фильтр к нашему __construct()и определим функцию:

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

Удалить опцию пользователя, чтобы удалить скидку

Еще одна вещь, которую вы могли заметить при отображении нашей скидки в корзине и при оформлении заказа, это наличие ссылки «[Удалить]» после ее суммы. Это поведение купонов по умолчанию в WooCommerce, но в нашем случае это нежелательно. И потому, что это может сбить с толку клиентов, и потому, что наш код повторно применит его после удаления.

WooCommerce предоставляет фильтр woocommerce_cart_totals_coupon_htmlдля вывода суммы. К счастью, WooCommerce предоставляет HTML-вывод только самой суммы в качестве третьего параметра этого фильтра. Мы можем просто вернуть это вместо того, чтобы убедиться, что наша скидка представлена ​​​​правильно с валютой и всем остальным.

Необязательно: скрытие функции купона для клиентов.

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

Удаление его из кассы

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

... public function __construct() { add_action('woocommerce_before_cart', [$this, 'addDiscount']); add_action('woocommerce_before_checkout_form', [$this, 'addDiscount']); add_filter('woocommerce_cart_totals_coupon_label', [$this, 'discountLabel'], 10, 2); add_filter('woocommerce_cart_totals_coupon_html', [$this, 'discountHtml'], 10, 3); remove_action('woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10); } ...

Удаление из корзины

Удалить функцию кода купона в корзине, к сожалению, не так просто, поскольку это жестко запрограммировано в шаблоне. Вам нужно будет переопределить шаблон корзины WooCommerce, чтобы удалить функцию купона. Скопируйте файл pluginswoocommercetemplatescartcart.phpв your-themewoocommercecartcart.php.

Файлы шаблонов WooCommerce постоянно меняются, поэтому указание точного номера строки не поможет. Но вы найдете код, который выводит ввод и кнопку для купона, ближе к нижней части файла; выглядит примерно так:

Что вам нужно сделать, так это закомментировать вывод, связанный с купоном. Я рекомендую добавить комментарий PHP /*прямо перед if-check и закрыть его */сразу после закрывающей скобки. Вот так:

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

Источник записи: awhitepixel.com

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