Свои настройки магазина
У плагина быстро появляются параметры: показывать ли срок изготовления, какой срок считать обычным, с какой суммы доставка бесплатна. Чтобы владелец магазина менял их без программиста, параметры выносят на страницу «WooCommerce → Настройки». Форму рисует и сохраняет сам WooCommerce — нужно только описать поля массивом.
Код урока пишется в includes/admin.php.
Раздел на готовой вкладке
Раздел — ссылка под названием вкладки. Добавим раздел Acme на вкладку «Товары»:
// wp-content/plugins/acme-shop/includes/admin.php
add_filter('woocommerce_get_sections_products', function (array $sections): array {
$sections['acme'] = 'Acme';
return $sections;
});Откройте «WooCommerce → Настройки → Товары»: рядом со ссылками «Основные» и «Запасы» появилась «Acme». Имя фильтра заканчивается идентификатором вкладки: products, shipping, account, advanced.
Поля раздела
// wp-content/plugins/acme-shop/includes/admin.php
add_filter('woocommerce_get_settings_products', function (array $settings, string $section): array {
if ($section !== 'acme') {
return $settings;
}
return [
['title' => 'Настройки Acme', 'type' => 'title', 'id' => 'acme_options'],
[
'title' => 'Показывать срок изготовления',
'id' => 'acme_show_lead_time',
'type' => 'checkbox',
'default' => 'yes',
],
[
'title' => 'Срок по умолчанию, дней',
'id' => 'acme_default_lead_time',
'type' => 'number',
'default' => 3,
],
['type' => 'sectionend', 'id' => 'acme_options'],
];
}, 10, 2);Для чужих разделов фильтр возвращает поля без изменений, для своего — собственный массив. Список начинается элементом title и заканчивается sectionend с тем же id. Перейдите в раздел «Acme»: там флажок и числовое поле, а кнопка «Сохранить изменения» уже работает.
Виды полей
type | Поле |
|---|---|
text, number, email, password | Строка ввода |
textarea | Многострочный текст |
checkbox | Флажок, хранит yes или no |
select | Список, варианты в options |
radio | Переключатели |
single_select_page | Выбор страницы сайта |
Параметр desc добавляет пояснение под полем, desc_tip => true превращает его в подсказку со знаком вопроса.
Чтение настроек
Значения лежат в таблице wp_options под ключом, равным id поля. Применим их к блоку со сроком изготовления:
// wp-content/plugins/acme-shop/includes/storefront.php
add_action('woocommerce_single_product_summary', function () {
global $product;
if (get_option('acme_show_lead_time', 'yes') !== 'yes') {
return;
}
$days = (int) $product->get_meta('_acme_lead_time')
?: (int) get_option('acme_default_lead_time', 3);
wc_get_template('single-product/lead-time.php', ['days' => $days], '', dirname(__DIR__) . '/templates/');
}, 25);Этот вариант заменяет функцию из урока о шаблонах. Снимите флажок в настройках — строка «Изготовим за…» исчезнет со страниц товаров. У товара без своего срока подставится срок по умолчанию.
Собственная вкладка
Когда настроек много, им отводят отдельную вкладку. Массив полей выносят в функцию и используют дважды — для вывода и для сохранения:
// wp-content/plugins/acme-shop/includes/admin.php
function acme_workshop_settings(): array
{
return [
['title' => 'Мастерская', 'type' => 'title', 'id' => 'acme_workshop'],
['title' => 'Email мастерской', 'id' => 'acme_workshop_email', 'type' => 'email'],
['type' => 'sectionend', 'id' => 'acme_workshop'],
];
}
add_filter('woocommerce_settings_tabs_array', function (array $tabs): array {
$tabs['acme'] = 'Acme';
return $tabs;
}, 50);
add_action('woocommerce_settings_acme', function () {
woocommerce_admin_fields(acme_workshop_settings());
});
add_action('woocommerce_settings_save_acme', function () {
woocommerce_update_options(acme_workshop_settings());
});Фильтр добавляет вкладку в конец списка. Первое действие рисует поля, второе сохраняет их при нажатии кнопки. На странице настроек появится вкладка «Acme» с полем для адреса почты.
Частая ошибка
Значение флажка проверяют как логическое: if (get_option('acme_show_lead_time')). WooCommerce хранит флажки строками yes и no, а непустая строка no в PHP истинна — условие выполняется всегда. Сравнивайте со строкой: === 'yes'.