Вопрос или проблема
Я пытаюсь изменить структуру URL своих слагов продуктов WooCommerce, программно заменяя определенные символы. Вот моя текущая ситуация:
Название продукта: Столичный флаг 15×22,5 см
Пример текущего слага:
/product/dek-flag-15×225-cm-masa
Пример желаемого слага:
/product/dek-flag-15×22-5-cm-masa
Как вы видите, я хочу заменить 22,5 в слаге на 22-5. Я пробовал несколько подходов, включая использование фильтра wp_insert_post_data, чтобы изменить слаг во время создания или обновления продукта, но не смог заставить это работать так, как ожидал.
Вот код, который я пытался использовать:
function custom_product_slug_replace_comma($slug, $post_ID, $post_status, $post_type) {
// Работает только для продуктов WooCommerce
if ('product' === $post_type) {
// Заменяем запятые на (-)
$slug = str_replace(',', '-', $slug);
}
return $slug;
}
add_filter('wp_unique_post_slug', 'custom_product_slug_replace_comma', 10, 4);
Однако слаг остается неизменным после сохранения продукта. Я также хочу убедиться, что существующие слаги продуктов обновлены, чтобы соответствовать желаемому формату.
Может кто-нибудь подсказать мне, как правильно это сделать? Я открыт для динамичного решения, которое будет работать для всех будущих продуктов, или одноразового скрипта, который обновит существующие слаги.
Заранее спасибо за вашу помощь
Ответ или решение
Программная замена символов в слагах продуктов WooCommerce
Ваша задача состоит в том, чтобы программно изменить структуру URL слагов продуктов в WooCommerce, заменив запятую на дефис в определенной части слага. Ваша попытка с использованием фильтра wp_unique_post_slug
была на правильном пути, но, к сожалению, не сработала как ожидалось. Рассмотрим более подробный подход, который поможет вам достичь желаемого результата.
Принципы работы с слагами в WooCommerce
Слаг (slug) — это часть URL, которая идентифицирует продукт при его отображении на сайте. Он автоматически создается при создании продукта, но вы можете настроить его через фильтры WordPress, такие как wp_insert_post_data
, для динамической замены символов при сохранении.
Исправленный код для замены символов
Вам следует использовать фильтр wp_insert_post_data
, чтобы изменить слаг перед его сохранением. Это не только позволит вам изменять слаги для новых продуктов, но также может быть адаптировано для обновления существующих. Вот пример правильного кода:
function custom_product_slug_replace_comma($data, $postarr) {
// Проверяем, что это продукт WooCommerce
if ($data['post_type'] === 'product') {
// Извлекаем текущий слаг
$slug = $data['post_name'];
// Заменяем запятую на дефис
$slug = str_replace('22,5', '22-5', $slug);
// Обновляем слаг в массиве данных
$data['post_name'] = sanitize_title($slug);
}
return $data;
}
add_filter('wp_insert_post_data', 'custom_product_slug_replace_comma', 10, 2);
Объяснение кода
- Проверка типа поста: Мы проверяем, что тип поста — это продукт WooCommerce.
- Изменение слага: Мы заменяем
22,5
на22-5
непосредственно в слаге. - Санитизация слага: Важно правильно обработать новый слаг с помощью
sanitize_title
, что удалит нежелательные символы и приведет к корректному формату URL.
Обновление существующих слагов
Чтобы обновить уже существующие продукты с новыми слагами, вам потребуется выполнить одноразовый скрипт. Используйте следующее:
function update_existing_product_slugs() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
);
$products = new WP_Query($args);
if ($products->have_posts()) {
while ($products->have_posts()) {
$products->the_post();
$post_id = get_the_ID();
$slug = get_post_field('post_name', $post_id);
// Выполняем замену
$new_slug = str_replace('22,5', '22-5', $slug);
if ($new_slug !== $slug) {
// Обновляем слаг
wp_update_post(array(
'ID' => $post_id,
'post_name' => sanitize_title($new_slug)
));
}
}
}
wp_reset_postdata();
}
// Запуск функции для обновления слагов (вы можете поместить этот вызов в админку или триггер)
update_existing_product_slugs();
Заключение
Эти два подхода будут эффективно решать вашу задачу. Первый код позволяет динамически обновлять слаги новых продуктов, а второй — корректно изменять слаги уже существующих товаров в вашей системе.
Используйте данный метод и не забудьте протестировать его на тестовом сайте перед применением на рабочем. Это поможет избежать нежелательных эффектов. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.