Encodera

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

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

Оглавление

Изменение и создание товаров

Товар меняют теми же объектами, что и читают: у каждого метода get_... есть пара set_.... Изменения остаются в памяти, пока не вызван save() — он записывает товар в базу и обновляет всё связанное.

Где выполнять

Разовые операции — создать товары, поднять цены — удобно запускать из консоли. Создайте в плагине папку scripts и файл scripts/update-mug.php:

// wp-content/plugins/acme-shop/scripts/update-mug.php
$product = wc_get_product(12);
 
$product->set_regular_price('11.90');
$product->save();
 
echo 'Новая цена: ' . $product->get_regular_price() . PHP_EOL;

Файл начинается с <?php. Запустите его из папки сайта:

wp eval-file wp-content/plugins/acme-shop/scripts/update-mug.php

Команда загружает WordPress, выполняет файл и печатает «Новая цена: 11.90». Обновите страницу товара — цена изменилась.

Методы изменения

МетодЧто задаёт
set_name('Кружка')Название
set_regular_price('11.90')Обычную цену
set_sale_price('9.90')Цену со скидкой, пустая строка снимает скидку
set_sku('MUG-001')Артикул
set_manage_stock(true)Включает учёт остатков
set_stock_quantity(15)Остаток
set_status('draft')Статус: publish, draft, private
set_category_ids([15])Категории

Цены передают строками с точкой.

Создание товара

Новый товар — новый объект нужного класса. Файл scripts/create-plate.php:

// wp-content/plugins/acme-shop/scripts/create-plate.php
$product = new WC_Product_Simple();
 
$product->set_name('Тарелка');
$product->set_sku('PLATE-001');
$product->set_regular_price('7.50');
$product->set_short_description('Керамическая тарелка, 22 см.');
$product->set_manage_stock(true);
$product->set_stock_quantity(40);
$product->set_status('publish');
 
$id = $product->save();
 
echo "Создан товар $id" . PHP_EOL;

Метод save() возвращает идентификатор нового товара. После запуска через wp eval-file тарелка появится в «Товары» и на странице /shop/.

Собственные данные

Для свойств, которых у товара нет, служат метаданные — пары «ключ — значение», привязанные к товару:

// wp-content/plugins/acme-shop/scripts/update-mug.php
$product = wc_get_product(12);
 
$product->update_meta_data('_acme_lead_time', 3);
$product->save();
 
echo $product->get_meta('_acme_lead_time') . PHP_EOL;

Скрипт записывает срок изготовления в три дня и печатает 3. Ключ начинается с подчёркивания, чтобы не показываться в блоке «Произвольные поля» редактора, и с приставки acme, чтобы не совпасть с чужим.

Изменение по событию

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

// wp-content/plugins/acme-shop/includes/products.php
add_action('woocommerce_no_stock', function (WC_Product $product) {
    $product->set_catalog_visibility('hidden');
    $product->save();
});

Хук woocommerce_no_stock срабатывает, когда остаток товара дошёл до нуля. Товар исчезнет из каталога и поиска, но останется доступен по прямой ссылке.

Удаление

$product->delete();       // в корзину
$product->delete(true);   // навсегда

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

Цену меняют напрямую: update_post_meta($id, '_price', 10). Запись в базе изменится, но кеш товара и таблица поиска wp_wc_product_meta_lookup останутся старыми — в каталоге, сортировке и фильтрах товар будет со старой ценой. Меняйте товар только методами set_... и save().

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

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