Диагностика задачи: зачем менять название и слаг товара автоматически
В WooCommerce иногда возникает необходимость динамически менять название товара и его URL-адрес (слаг) в зависимости от определённых условий — например, добавлять пометки для распродаж, акций, сезонных предложений или региональных особенностей. Стандартными средствами WooCommerce и WordPress это не реализуется, а ручное редактирование неудобно и ошибочно при большом каталоге.
Проверить, что название или слаг не меняются автоматически, можно, открыв страницу редактирования товара и убедившись, что поля не изменяются при обновлении данных или по событию.
Как реализовать автоматическое изменение названия и слага товара в WooCommerce
Основные хуки для изменения данных товара
Для изменения названия и слага удобно использовать хук save_post_product, который срабатывает при сохранении товара. Это позволяет динамически модифицировать поля перед сохранением в базу.
Пример кода для изменения названия и слага при определённом условии
add_action('save_post_product', 'wpmanager_change_product_title_and_slug', 20, 3);
function wpmanager_change_product_title_and_slug($post_ID, $post, $update) {
// Проверяем, что это не автосохранение
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Проверяем права пользователя
if (!current_user_can('edit_post', $post_ID)) {
return;
}
// Получаем объект товара
$product = wc_get_product($post_ID);
if (!$product) {
return;
}
// Условие: если цена товара ниже 1000, добавляем пометку "- Акция" в название
if ($product->get_price() < 1000) {
$new_title = $post->post_title;
if (strpos($new_title, ' - Акция') === false) {
$new_title .= ' - Акция';
// Обновляем заголовок и слаг
$post_update = array(
'ID' => $post_ID,
'post_title' => $new_title,
'post_name' => sanitize_title($new_title),
);
// Убираем хук, чтобы не было зацикливания
remove_action('save_post_product', 'wpmanager_change_product_title_and_slug', 20);
wp_update_post($post_update);
// Восстанавливаем хук
add_action('save_post_product', 'wpmanager_change_product_title_and_slug', 20, 3);
}
} else {
// Если цена выше 1000 и в названии есть пометка, убираем её
$old_title = $post->post_title;
if (strpos($old_title, ' - Акция') !== false) {
$new_title = str_replace(' - Акция', '', $old_title);
$post_update = array(
'ID' => $post_ID,
'post_title' => $new_title,
'post_name' => sanitize_title($new_title),
);
remove_action('save_post_product', 'wpmanager_change_product_title_and_slug', 20);
wp_update_post($post_update);
add_action('save_post_product', 'wpmanager_change_product_title_and_slug', 20, 3);
}
}
}Объяснение кода
- Используем
save_post_productдля перехвата сохранения товара. - Проверяем, чтобы не было автосохранения и чтобы пользователь имел права.
- Получаем цену и проверяем условие, например, цена ниже 1000.
- Если условие выполнено, добавляем к названию суффикс
- Акцияи обновляемpost_titleиpost_name(слаг). - Предотвращаем рекурсию, временно удаляя хук перед обновлением и восстанавливая после.
Проверка результата после внедрения
1. Откройте любой товар в админке WooCommerce.
2. Измените цену товара на значение меньше 1000 и сохраните.
3. Проверьте, что в названии товара автоматически появился суффикс - Акция.
4. Проверьте URL товара — слаг должен совпадать с новым названием.
5. Измените цену обратно выше 1000 и сохраните — пометка должна исчезнуть.
Частые ошибки и способы их исправления
- Рекурсия при обновлении поста: Если не отключить хук перед вызовом
wp_update_post, будет зацикливание. Решение — использоватьremove_actionперед обновлением иadd_actionпосле. - Отсутствие проверки прав: Если не проверять права пользователя, может возникнуть ошибка при автоматическом сохранении. Используйте
current_user_can('edit_post', $post_ID). - Не обновляется слаг: Обязательно обновляйте поле
post_nameвместе сpost_title, применяяsanitize_title(). - Автосохранение вызывает лишние обновления: Проверяйте константу
DOING_AUTOSAVEи возвращайте управление, если она true.
Практические советы по безопасности и производительности
- Избегайте тяжелых операций в хук
save_post_product, так как он срабатывает при каждом сохранении товара. - Кэшируйте результаты, если условия проверки становятся сложными.
- Для массового изменения большого каталога лучше использовать WP-CLI скрипты, чтобы не нагружать веб-сервер.
- Следите за логами ошибок при отладке, чтобы вовремя обнаруживать проблемы с правами и рекурсией.
Сравнение вариантов реализации автоматического изменения названия и слага
| Вариант | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Код на хуке save_post_product | Полный контроль, не требует сторонних плагинов, гибкость | Риск рекурсии, нужен опыт, возможна нагрузка при массовом обновлении | Для точечных условий и динамических изменений при сохранении |
| Плагин с настройками (например, автоматизация WooCommerce) | Простота установки, UI для настройки | Менее гибко, может замедлять сайт | Для пользователей без навыков программирования |
| Массовый импорт/экспорт CSV с изменениями | Удобно для одноразовых массовых изменений | Не динамично, требует повторного импорта | Для одноразовых корректировок большого каталога |