Изменение и создание товаров
Товар меняют теми же объектами, что и читают: у каждого метода 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().