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