Свой плагин для доработок
Плагин — папка с 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 может быть ещё не загружен — сайт падает с ошибкой. Весь код должен выполняться внутри функций, подключённых к хукам.