Диагностика задачи: зачем менять статус и название товара после покупки
В стандартном WooCommerce товар после продажи остается в каталоге с обычным статусом и названием. Однако в ряде случаев необходимо автоматически изменить статус товара (например, сделать его "временно недоступным" или "закрытым") и модифицировать название (чтобы информировать покупателей о статусе или скидке) сразу после успешной оплаты. Это помогает управлять ограниченными партиями, акциями, или указывать, что товар распродан.
Как определить, что задача актуальна для вашего сайта
- Вы продаёте ограниченные товары и хотите блокировать повторные покупки после достижения лимита.
- Необходимо показывать пользователям изменённое название товара после покупки (например, "Продано" или "Ожидается поступление").
- Хотите автоматизировать процесс обновления статуса без ручного вмешательства.
Пошаговое решение: изменение статуса и названия товара после успешного заказа
1. Используем хук woocommerce_order_status_completed для запуска функции после оплаты
WooCommerce предоставляет хук woocommerce_order_status_completed, который срабатывает, когда заказ переводится в статус "завершён". В эту точку можно добавить нашу логику.
2. Код для изменения статуса товара и модификации названия
add_action('woocommerce_order_status_completed', 'update_products_after_purchase', 10, 1);function update_products_after_purchase($order_id) { if (!$order_id) return; $order = wc_get_order($order_id); if (!$order) return; foreach ($order->get_items() as $item) { $product_id = $item->get_product_id(); $product = wc_get_product($product_id); if (!$product) continue; // Меняем статус на "черновик" (draft) $post = array( 'ID' => $product_id, 'post_status' => 'draft' ); wp_update_post($post); // Добавляем префикс к названию товара $new_title = '[Продано] ' . $product->get_name(); // Обновляем заголовок через базовую функцию WP wp_update_post(array( 'ID' => $product_id, 'post_title' => $new_title )); }}Этот код переводит товар в статус "черновик", скрывая его из каталога, и меняет название, добавляя префикс "[Продано]".
3. Добавление кода в файл functions.php дочерней темы GeneratePress
Чтобы изменения не пропали при обновлении темы, вставьте код в functions.php вашей дочерней темы GeneratePress или используйте плагин для кастомных сниппетов (например, Code Snippets).
Проверка результата после внедрения
- Оформите тестовый заказ и переведите его в статус "завершён" (если оплата через тестовый шлюз - это происходит автоматически).
- Перейдите в админку WordPress > Товары и найдите купленный товар.
- Убедитесь, что статус товара изменился на "Черновик" (Draft).
- Проверьте, что название товара теперь начинается с префикса "[Продано]".
- Зайдите на фронтенд сайта и убедитесь, что товар не отображается в каталоге (или отображается с новым названием, если статус не черновик).
Частые ошибки и как их исправить
- Товар не меняет статус после оплаты: Проверьте, что заказ переводится в статус "completed". В некоторых магазинах используется статус "processing" — соответственно, нужно использовать другой хук
woocommerce_order_status_processing. - Название не обновляется: Убедитесь, что у вас нет плагинов или кэширования, которые перезаписывают заголовки товаров. Очистите кэш и попробуйте снова.
- Продукт остаётся видимым: Статус "draft" скрывает товар, но если нужно, чтобы товар был виден, но с изменённым названием, используйте другой статус или настройте логику отображения через фильтры.
- Изменения не влияют на вариативные товары: Для вариативных товаров дополнительно нужно изменять дочерние вариации, иначе они останутся доступными.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию сайта перед добавлением кода.
- Добавляйте проверки на валидность объекта товара и заказа, чтобы избежать ошибок PHP.
- Если магазин большой и заказ содержит много товаров, оптимизируйте код, чтобы избежать нагрузки на базу данных.
- Для массовых изменений после покупки лучше использовать очереди или WP-Cron, чтобы не блокировать загрузку страницы.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Изменение статуса и названия через хук PHP | Гибко, быстро, без дополнительных плагинов | Требует навыков программирования, возможны ошибки при обновлениях |
| Использование плагинов автоуправления товарами | Простой интерфейс, поддержка и обновления | Зависимость от стороннего кода, возможные конфликты |
| Ручное обновление после покупки | Просто для небольших магазинов | Трудозатратно, риск пропуска |