Encodera

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

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

Оглавление

Свои поля товара в панели

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

Где писать код

Создайте файл includes/admin.php и подключите его в acme-shop.php. В нём будет всё, что меняет панель управления.

Поле в редакторе

// wp-content/plugins/acme-shop/includes/admin.php
add_action('woocommerce_product_options_general_product_data', function () {
    woocommerce_wp_text_input([
        'id' => '_acme_lead_time',
        'label' => 'Срок изготовления, дней',
        'type' => 'number',
        'custom_attributes' => ['min' => 0, 'step' => 1],
    ]);
});

Откройте любой товар в панели: в блоке «Данные товара» на вкладке «Основные», под ценами, появилось числовое поле. Функция woocommerce_wp_text_input() сама рисует поле и подставляет сохранённое значение из метаданных с ключом, равным id.

Сохранение

Само поле ничего не сохраняет. Значение записывают в хуке, который срабатывает при сохранении товара:

// wp-content/plugins/acme-shop/includes/admin.php
add_action('woocommerce_admin_process_product_object', function (WC_Product $product) {
    $days = isset($_POST['_acme_lead_time']) ? absint($_POST['_acme_lead_time']) : 0;
 
    $product->update_meta_data('_acme_lead_time', $days);
});

Введите в поле 3 и нажмите «Обновить» — значение останется в поле после перезагрузки. Функция absint() превращает ввод в неотрицательное целое. Вызывать save() не нужно: WooCommerce сохранит товар сам сразу после хука, а права пользователя он уже проверил.

Вывод на витрине

Значение читают там, где оно нужно покупателю:

// wp-content/plugins/acme-shop/includes/storefront.php
add_action('woocommerce_single_product_summary', function () {
    global $product;
 
    $days = (int) $product->get_meta('_acme_lead_time');
 
    if ($days > 0) {
        printf('<p class="acme-lead-time">Изготовим за %d дн.</p>', $days);
    }
}, 25);

На странице товара между кратким описанием и кнопкой появится строка «Изготовим за 3 дн.».

Другие поля и вкладки

ФункцияПоле
woocommerce_wp_text_input()Строка или число
woocommerce_wp_textarea_input()Многострочный текст
woocommerce_wp_select()Выпадающий список, значения в options
woocommerce_wp_checkbox()Флажок, хранит yes или no
ХукВкладка блока «Данные товара»
woocommerce_product_options_general_product_dataОсновные
woocommerce_product_options_inventory_product_dataЗапасы
woocommerce_product_options_shippingДоставка
woocommerce_product_options_advancedДополнительно

Столбец в списке товаров

// wp-content/plugins/acme-shop/includes/admin.php
add_filter('manage_edit-product_columns', function (array $columns): array {
    $columns['acme_lead_time'] = 'Срок';
 
    return $columns;
});
 
add_action('manage_product_posts_custom_column', function (string $column, int $postId) {
    if ($column === 'acme_lead_time') {
        $product = wc_get_product($postId);
 
        echo esc_html($product ? $product->get_meta('_acme_lead_time') : '');
    }
}, 10, 2);

Фильтр добавляет заголовок столбца, действие заполняет ячейки. В списке «Товары» появится столбец «Срок» с числом дней.

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

Поле добавили, а хук сохранения — нет: значение пропадает после нажатия «Обновить». Поле и сохранение — всегда две отдельные функции с одинаковым ключом. Вторая причина «пропавшего» поля — включён новый блочный редактор товара («WooCommerce → Настройки → Дополнительно → Функции»): хуки woocommerce_product_options_... в нём не работают.

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

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