Диагностика проблемы: почему нужно удалять товары при изменении статуса публикации
В WooCommerce товары — это обычные записи типа product. Иногда требуется автоматически удалять товары из базы при смене их статуса публикации (например, при переводе товара в черновик или на ожидание). Это актуально для магазинов с регулярным обновлением ассортимента, где устаревшие товары не должны занимать место и влиять на производительность.
По умолчанию WordPress не удаляет записи при смене статуса — они просто меняют статус, оставаясь в базе. Поэтому нужно написать кастомный код, который удалит товар сразу после изменения статуса на нежелательный.
Пошаговое решение: как реализовать автоматическое удаление товаров при смене статуса
1. Подключаем хук transition_post_status
Для отслеживания смены статуса записи используется хук transition_post_status. Он позволяет получить старый и новый статус, а также ID записи.
2. Проверяем, что тип записи — product и новый статус — нужный для удаления
В нашем примере будем удалять товары, которые переводят в статус draft или pending. В других случаях — не трогаем.
3. Вызываем функцию удаления записи wp_delete_post с принудительным удалением
Важно вызвать wp_delete_post($post_id, true), где второй параметр true — чтобы удалить товар без помещения в корзину.
add_action('transition_post_status', 'auto_delete_product_on_status_change', 10, 3);
function auto_delete_product_on_status_change($new_status, $old_status, $post) {
if ($post->post_type !== 'product') {
return;
}
// Статусы при которых удаляем товар
$statuses_to_delete = ['draft', 'pending'];
if (in_array($new_status, $statuses_to_delete) && $new_status !== $old_status) {
// Удаляем товар без помещения в корзину
wp_delete_post($post->ID, true);
}
}
Проверка результата после внедрения кода
- Перейдите в админку WooCommerce → Товары.
- Выберите любой опубликованный товар и измените его статус на «Черновик» или «Ожидает проверки».
- Сохраните изменения.
- Обновите список товаров — товар должен исчезнуть полностью, а не просто сменить статус.
- Для контроля можно проверить базу данных, таблицу
wp_posts, чтобы убедиться, что запись удалена.
Частые ошибки и как их исправить
- Товар не удаляется при смене статуса: проверьте, что хук подключен правильно и файл с кодом загружается (например, functions.php вашей темы или плагина). Для отладки добавьте
error_logвнутри функции. - Удаляются не только товары: убедитесь, что проверка типа записи
$post->post_type === 'product'корректно работает. - Удаление происходит при каждом сохранении: добавьте проверку, что старый и новый статус отличаются, чтобы избежать повторного удаления.
- Проблемы с правами доступа: функция
wp_delete_postтребует прав администратора. Убедитесь, что код выполняется в контексте с нужными правами.
Практические советы по безопасности и производительности
- Добавляйте логи для отслеживания удалений, особенно на живом сайте.
- Используйте резервное копирование перед внедрением автоматических удалений.
- Если в магазине много товаров, удаление может нагрузить базу — рассмотрите пакетное удаление с WP-CLI.
- Для контроля можно отправлять уведомления администратору о каждом удалении через
wp_mail.
Сравнение вариантов реализации автоматического удаления товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Хук transition_post_status + wp_delete_post |
Простота, точечное удаление, не требует плагинов | Нужно аккуратно писать код, может удалить товар без проверки | Пример из статьи |
| Плагин для массового удаления товаров | Графический интерфейс, безопасный пакетный режим | Не всегда поддерживает автоматическое удаление по статусу | WooCommerce Bulk Delete и аналоги |
| WP-CLI скрипты для удаления | Высокая производительность, можно запускать по расписанию | Требует командной строки и навыков администратора сервера | wp post delete $(wp post list --post_type=product --post_status=draft --field=ID) --force |