Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Свой плагин для доработок

Плагин — папка с PHP-файлом, который WordPress подключает при каждой загрузке сайта. Доработки магазина держат в собственном плагине: он не зависит от темы, переживает обновления WooCommerce и выключается одним щелчком.

Создание

Команды для генерации нет — папку и файл создают вручную. Создайте папку wp-content/plugins/acme-shop, а в ней файл acme-shop.php:

<?php
// wp-content/plugins/acme-shop/acme-shop.php
/**
 * Plugin Name: Acme Shop
 * Description: Доработки магазина.
 * Version: 1.0.0
 * Requires Plugins: woocommerce
 */
 
defined('ABSPATH') || exit;

Комментарий с Plugin Name — заголовок: по нему WordPress узнаёт плагин. Строка Requires Plugins не даст включить его без WooCommerce. Проверка ABSPATH запрещает открывать файл напрямую по адресу. Плагин появится в «Плагины → Установленные» — нажмите «Активировать».

Проверка WooCommerce

Свой код подключают, только когда WooCommerce загружен. Добавьте в конец acme-shop.php:

// wp-content/plugins/acme-shop/acme-shop.php
add_action('plugins_loaded', function () {
    if (!class_exists('WooCommerce')) {
        return;
    }
 
    require __DIR__ . '/includes/storefront.php';
});

Хук plugins_loaded срабатывает, когда все плагины подключены. Если WooCommerce выключен, функция выходит, и сайт не падает с ошибкой «класс не найден».

Первый файл с кодом

Создайте includes/storefront.php:

// wp-content/plugins/acme-shop/includes/storefront.php
add_action('woocommerce_before_shop_loop', function () {
    echo '<p class="acme-note">Бесплатная доставка от 50 €</p>';
});

Откройте /shop/: над списком товаров появилась строка. Как и любой PHP-файл, этот начинается с <?php — в примерах курса первая строка опущена, вместо неё указан путь к файлу.

Раскладка файлов

По ходу курса плагин вырастет до такой структуры:

acme-shop/
├── acme-shop.php          главный файл: заголовок и подключения
├── includes/
│   ├── storefront.php     хуки витрины
│   ├── products.php       работа с товарами
│   ├── cart.php           корзина
│   ├── checkout.php       оформление заказа
│   ├── orders.php         заказы
│   └── admin.php          поля и настройки в панели
├── templates/             собственные шаблоны
└── assets/                стили и скрипты

Каждый новый файл из includes подключают строкой require в главном файле, рядом с storefront.php. Дальше в уроках это подразумевается.

Совместимость с HPOS

Плагин должен сообщить, что умеет работать с новым хранилищем заказов. Добавьте в acme-shop.php:

// wp-content/plugins/acme-shop/acme-shop.php
add_action('before_woocommerce_init', function () {
    if (class_exists(\Automattic\WooCommerce\Utilities\FeaturesUtil::class)) {
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility(
            'custom_order_tables',
            __FILE__,
            true
        );
    }
});

Без этого объявления WooCommerce покажет в панели предупреждение о несовместимом плагине. Вызов должен стоять именно в главном файле: __FILE__ указывает, какой плагин делает заявление.

Куда код писать нельзя

МестоПочему нет
wp-content/plugins/woocommerce/Правки стирает обновление
functions.php темыЛогика пропадает при смене темы
Плагины-«сниппеты» в панелиКод не попадает в систему контроля версий

В теме оставляют только внешний вид: стили и копии шаблонов.

Частая ошибка

Функции WooCommerce вызывают прямо в теле главного файла: $product = wc_get_product(12); на верхнем уровне. В этот момент WooCommerce может быть ещё не загружен — сайт падает с ошибкой. Весь код должен выполняться внутри функций, подключённых к хукам.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.