Encodera

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

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

Оглавление

Свои настройки магазина

У плагина быстро появляются параметры: показывать ли срок изготовления, какой срок считать обычным, с какой суммы доставка бесплатна. Чтобы владелец магазина менял их без программиста, параметры выносят на страницу «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'.

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

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