Как программно заменить символы в слагах продуктов WooCommerce?

Вопрос или проблема

Я пытаюсь изменить структуру 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);

Объяснение кода

  1. Проверка типа поста: Мы проверяем, что тип поста — это продукт WooCommerce.
  2. Изменение слага: Мы заменяем 22,5 на 22-5 непосредственно в слаге.
  3. Санитизация слага: Важно правильно обработать новый слаг с помощью 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();

Заключение

Эти два подхода будут эффективно решать вашу задачу. Первый код позволяет динамически обновлять слаги новых продуктов, а второй — корректно изменять слаги уже существующих товаров в вашей системе.

Используйте данный метод и не забудьте протестировать его на тестовом сайте перед применением на рабочем. Это поможет избежать нежелательных эффектов. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...