Диагностика задачи: зачем менять название товара автоматически
В стандартном WooCommerce название товара не меняется при редактировании его атрибутов. Это может быть неудобно, если вы хотите, чтобы в названии отражались выбранные характеристики (например, цвет или размер) для лучшей индексации или удобства клиентов.
Проверьте, что у вас есть переменный товар с атрибутами, и что вручную изменение названия не происходит автоматически при обновлении вариаций.
Пошаговое решение: как автоматически обновлять название товара при изменении атрибутов
1. Используем хук save_post_product для отслеживания обновления товара
Добавим функцию, которая при сохранении товара будет получать его атрибуты и обновлять название, добавляя их в скобках.
add_action('save_post_product', 'update_product_title_with_attributes', 20, 3);
function update_product_title_with_attributes($post_ID, $post, $update) {
// Проверяем, что это не автосохранение
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
// Получаем объект товара
$product = wc_get_product($post_ID);
if (!$product || 'variable' !== $product->get_type()) return;
// Получаем атрибуты товара
$attributes = $product->get_attributes();
if (empty($attributes)) return;
$attr_values = [];
foreach ($attributes as $attribute) {
if (!$attribute->get_variation()) continue; // только вариационные атрибуты
$options = $attribute->get_options();
if (empty($options)) continue;
// Получаем имена терминов
$terms_names = [];
foreach ($options as $term_id) {
$term = get_term($term_id);
if ($term && !is_wp_error($term)) {
$terms_names[] = $term->name;
}
}
if (!empty($terms_names)) {
$attr_values[] = implode('/', $terms_names);
}
}
if (empty($attr_values)) return;
// Формируем новое название
$base_title = $product->get_name();
// Удаляем старые скобки с атрибутами, если есть
$base_title = preg_replace('/\s*\([^)]*\)$/', '', $base_title);
$new_title = $base_title . ' (' . implode(', ', $attr_values) . ')';
// Обновляем название товара и сохраняем
wp_update_post([
'ID' => $post_ID,
'post_title' => $new_title
]);
}2. Обработка вариаций и их названий
Для вариаций можно использовать фильтр woocommerce_product_variation_title_include_attributes, чтобы не дублировать информацию в названии вариации, если она уже есть в названии основного товара.
add_filter('woocommerce_product_variation_title_include_attributes', '__return_false');Проверка результата после внедрения
- Откройте в админке переменный товар с атрибутами.
- Отредактируйте товар и измените атрибуты (например, добавьте или удалите значения).
- Сохраните товар.
- Проверьте, что в названии товара появились соответствующие атрибуты в скобках, например:
Футболка (Красный/Синий, L/XL). - Перейдите на страницу товара на сайте — убедитесь, что название отображается корректно.
Частые ошибки и как их исправить
- Название не меняется после сохранения: Проверьте, что хук
save_post_productподключён корректно и функция не прерывается на проверках. - Появляются старые скобки с атрибутами: В функции используется регулярное выражение для удаления старых скобок, убедитесь, что оно не удаляет лишнее.
- Некорректные названия атрибутов: Убедитесь, что атрибуты настроены как вариационные и используются термины таксономии, иначе функция не сможет получить имена.
- Производительность падает при сохранении: Если атрибутов много, можно оптимизировать функцию, например, кэшировать термины.
Практические советы по безопасности и производительности
- Используйте проверку
defined('DOING_AUTOSAVE') && DOING_AUTOSAVEчтобы избежать срабатывания функции при автосохранении. - Добавьте проверку прав пользователя, чтобы функция срабатывала только для администраторов или редакторов.
- Для больших магазинов с множеством атрибутов и вариаций рассмотрите возможность отложенного обновления названий через WP-Cron, чтобы не замедлять сохранение товара.
- Всегда делайте резервную копию перед внедрением кода, чтобы быстро откатиться в случае ошибок.
Сравнение способов решения задачи
| Метод | Плюсы | Минусы |
|---|---|---|
Код через save_post_product | Гибко, без плагинов, под контролем разработчика | Требует навыков PHP, может замедлить сохранение товара |
| Плагины для динамического названия | Простота настройки, поддержка | Может быть избыточно, нагрузка, зависимость от стороннего кода |
| Ручное обновление названия | Простота, отсутствие кода | Трудозатратно, ошибки из-за забывчивости |