30-50% off hundreds of digital assets! WordPress themes, video, music and more 30-50% Off Go to Sale
Advertisement
  1. Code
  2. WooCommerce
Code

Создание пользовательского метода доставки для WooCommerce

by
Difficulty:IntermediateLength:LongLanguages:

Russian (Pусский) translation by Sergey Zhuk (you can also view the original English article)

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

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

Чтобы следовать этому руководству, вам понадобятся:

  • WordPress
  • Установленный и активированный плагин WooCommerce
  • Редактор на выбор

Правила доставки для нашего способа доставки

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

Стоимость будет определяться весом, который нам нужно отправить, и зоной, в которую мы должны отправиться. Зона - это номер, присвоенный странам и ценам. Чем выше число, тем длиннее расстояние доставки. Наша вымышленная судоходная компания поставляется только в несколько стран:

  • США
  • Канада
  • Германия
  • Великобритания
  • Италия
  • Испания
  • Хорватия

Наша судоходная компания будет из Хорватии, поэтому Хорватия находится в зоне 0. Давайте определим зоны для других стран:

  • США: 3
  • Канада: 3
  • Германия: 1
  • Великобритания: 2
  • Италия: 1
  • Испания: 2

Теперь, когда у нас есть все страны, доступные для доставки в соответствующей зоне, пришло время определить цены.

  • Зона 0: 10 долларов США
  • Зона 1: 30 долларов США
  • Зона 2: 50 долларов США
  • Зона 3: 70 долларов США

Я упомянул также вес, не так ли? Наша судоходная компания может отправить до 100 кг, и цены:

  • 0-10 кг: $ 0
  • 11-30 кг: 5 долларов США
  • 31-50 кг: 10 долларов США
  • 51-100 кг: 20 долларов США

У нас есть все, что нам нужно для создания нашего метода доставки. Давайте немного узнаем о WooCommerce Shipping API.

Введение в API метода доставки WooCommerce

При создании способа доставки нам необходимо расширить класс из абстрактного класса WooCommerce WC_Shipping_Method. Определяемыми атрибутами в этом классе являются:

  • $Id: ID (slug, keyword) нашей доставки. Обязательные.
  • $number: Integer ID.
  • $method_title: название нашей доставки показано в админ.
  • $method_description: Краткое описание нашей доставки показано в admin (необязательно).
  • $enabled: Строка («да» или «нет»), которая определяет, если наша доставка включена и может использоваться или нет.
  • $title: Используется для отображения нашего отгрузочного имени на нашем сайте.
  • $ Availability: Определяет, доступна ли доставка, или нет.
  • $countries: Массив стран, для которых этот метод включен. Значение по умолчанию - пустой массив.
  • $tax_status: значение по умолчанию облагается налогом. Если он облагается налогом, взимается налог.
  • $fee: значение по умолчанию равно 0. Плата за метод.
  • $minimum_fee: минимальная плата за метод. Значение по умолчанию - null.
  • $has_settings: Определяет, имеет ли этот метод какие-либо настройки. Значение по умолчанию - true.
  • $supports: Массив, содержащий функции, поддерживаемые этим методом. Значение по умолчанию - пустой массив.
  • $rates: Массив рейтов Должно быть заполнено для регистрации стоимости доставки. Значение по умолчанию - пустой массив.

Определенные методы в WC_Shipping_Method:

  • is_taxable(): Возвращает, нужно ли вычислять налог сверху курса доставки.
  • add_rate($args=array()): подталкивает скорость доставки, определенную в параметре $args, в атрибут $rates.
  • has_settings(): Возвращает значение атрибута $has_settings.
  • is_available(): Возвращает, доступна ли доставка. Если в атрибуте $countries указаны страны и атрибут $availability задан в значениях, включая, конкретные или исключающие, он вернет true или false, если страна доступна для доставки.
  • get_title(): возвращает название этой доставки.
  • get_fee($fee, $total): Возвращает стоимость вознаграждения за эту доставку на основе проанализированных $fee и $total.
  • supports($feature): Возвращает, поддерживает ли этот способ доставки функцию или нет.

Так как класс WC_Shipping_Method расширяет класс WC_Settings_API, существует больше атрибутов и методов, которые здесь не будут объясняться ради простоты.

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

  • init(): создает поля формы и настройки (может быть назван по-разному, если мы используем методы внутри него и вызываем его в методе __constructor).
  • calculate_shipping($package): этот метод используется для расчета стоимости доставки. Package представляет собой array с продуктами для отправки.

В методе calculate_shipping мы добавляем рейт с помощью метода add_rate. Этот метод принимает массив с несколькими вариантами:

  • id: идентификатор рейта.
  • label: метка для рейта
  • cost: Сумма доставки. Это может быть одно значение или array с затратами для каждого элемента в корзине.
  • taxes: он принимает array налогов или ничего, так что налог рассчитывается WooCommerce. Он может даже принимать false, если вы не хотите, чтобы рассчитывался налог.
  • сalc_tax: Принимает per_order или per_item. Если вы используете per_item, вам нужно будет предоставить array затрат.

Чтобы зарегистрировать метод доставки, нам необходимо добавить наш метод доставки в array зарегистрированного метода, передав имя нашего класса. Мы можем получить доступ к этому array и отправить измененный array обратно с помощью фильтра WordPress, который определен внутри плагина WooCommerce. Этот фильтр называется woocommerce_shipping_methods.

Создание нового класса доставки

Мы создадим наш метод доставки в качестве нового плагина, который расширяет плагин WooCommerce. Создайте новую папку tutsplus-shipping в wp-content/plugins. Кроме того, создайте файл с тем же именем tutsplus-shipping.php и добавьте следующий код:

Может показаться, что тут много в чем придется разбираться, но все это довольно просто. Сначала мы проверяем, определена ли константа WPINC, потому что если нет, это означает, что кто-то пытается получить доступ к этому файлу напрямую или из местоположения, которое не является WordPress.

Теперь, когда мы уверены, что к этому файлу будут обращаться только из WordPress, мы можем двигаться дальше. Прежде чем мы начнем создавать наш метод доставки для WooCommerce, мы должны быть уверены, что WooCommerce активна. Мы проверяем, находится ли файл woocommerce.php в массиве активных плагинов, который сохраняется в базе данных под опцией active_plugins.

Затем мы создаем функцию tutsplus_shipping_method, которую мы также добавляем в действие woocommerce_shipping_init. Действие woocommerce_shipping_init является основным действием для WooCommerce Shippings, которое включает в себя все классы доставки до того, как они будут созданы. Используя это действие, мы уверены, что наш метод доставки будет включен после того, как WooCommerce будет инициализирована и в нужном месте для WooCommerce.

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

Настройка доступности страны

Наш метод доставки доступен только в ранее определенном списке стран. Это будет установлено перед методом init внутри метода __construct. Добавьте это в метод __construct:

Атрибут availability установлен в 'including', так что эта доставка доступна только для стран, включенных в атрибут countries. Когда WooCommerce захочет отображать доступные отгрузки нашему клиенту, он проверяет, включена ли страна доставки в атрибут countries для этой доставки.

Создание настроек

Если вы внимательно посмотрите на наш метод __construct, вы увидите, что мы проверяем настройки на свойства enabled и title. Мы создадим поля, которые позволят изменять наши свойства.

Скопируйте этот код и заполните наш метод init_form_fields:

Теперь вы можете перейти к администрированию WordPress и изменить эти настройки в WooCommerce > Settings > Shipping > TutsPlus Shipping.

The TutsPlus Shipping Options Screen

Попробуйте изменить параметр Enable и увидите на вкладке Shipping Options, если наш метод доставки включен или нет.

Мы также определили, что наш способ доставки может доставлять до 100 кг. Что, если это правило изменится в ближайшем будущем? Мы можем легко разрешить редактирование в настройках. Мы добавим эту настройку, поэтому наш метод init_form_fields теперь выглядит так:

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

Расчет стоимости доставки

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

Мы собираемся обновить метод calculate_shipping по одному шагу за раз, чтобы вы могли понять каждый шаг. Первый шаг - получить стоимость по весу. Добавьте этот код в этот метод:

Мы определили несколько исходных переменных: $weight, $cost и $country. Переменная $weight будет содержать общий вес от всех продуктов, переменная $cost будет хранить стоимость этого метода доставки, а переменная $country будет содержать ISO-код для выбранной страны доставки.

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

Последнее, что нужно сделать, это получить стоимость рассчитанного веса. Если вы внимательно посмотрите на последнюю часть, мы не установили лимит на 100 кг, как мы сказали. Наша стоимость доставки покажет стоимость даже для тележки с общим весом 101 кг и более. Эта часть нашего лимита доставки будет сделана позже в статье как ограничение при обработке оформления или обновлении заказа.

Калькуляция затрат для выбранной страны доставки

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

Массив $countryZones содержит зоны для каждой страны. Второй массив $zonePrices содержит цены для каждой зоны. Как только мы установили оба этих массива, мы получим стоимость по зоне следующим образом:

  • Мы передаем код страны ISO в массив $countryZones, чтобы получить зону.
  • Мы передаем возвращенную зону в массив $zonePrices, чтобы получить стоимость.
  • Мы добавляем возвращаемую стоимость в переменную $cost.

Регистрация тарифа

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

Вот полный код этого метода, если у вас возникли проблемы с ним:

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

Cost of our custom shipping method with a shipping country from zone 3

Добавление ограничений

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

Sorry 120 kg exceeds the maximum weight of 100 kg for TutsPlus Shipping

Функция ограничения

В нашей функции мы будем рассматривать метод доставки, который был выбран. Если этот метод - наш метод TutsPlus_Shipping_Method, мы проверим его вес и общий вес в корзине. Если вес от корзины превышает лимит веса, мы уведомим нашего клиента.

После фильтра woocommerce_shipping_methods добавьте следующий код:

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

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

Уведомление об обновлении заказа

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

Добавьте этот код после нашей функции tutsplus_validate_order:

Уведомление об оплате

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

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

Давайте добавим нашу функцию к этому действию:

Полный код

Вот полный код этого настраиваемого способа доставки, поэтому если у вас возникли проблемы с этим учебником, вы можете посмотреть его здесь:

Заключение

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

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

Если у вас есть какие-либо вопросы по этому или любому другому методу доставки, вы можете опубликовать их в комментариях ниже. Вы также можете следить за мной в моем блоге или в twitter @igorbenic.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.