Структура постоянной ссылки продукта WooCommerce с использованием add_rewrite_rule() с родительской/дочерней/страницей

Я пытаюсь настроить структуру постоянных ссылок для продуктов WooCommerce.

Я пробовал реализовать решение с помощью add_rewrite_rule(), но безуспешно. В настоящее время ссылки генерируются как:

  • my-website.com/shop/product/product_name-sku

но я хочу, чтобы они были структурированы как:

  • my-website.com/shop/parent-cat/child-cat/product_name-sku

Я изо всех сил пытаюсь понять, как объединить get_terms() с родительскими и дочерними категориями.

Мой фрагмент кода:

add_filter('post_type_link', 'custom_product_permalink', 1, 2);

function custom_product_permalink($link, $post) {
    if ($post->post_type == 'product') {
        // Convert the entire URL to lowercase
        return strtolower(home_url('shop/product/' . $post->post_name . '-' . get_post_meta($post->ID, '_sku', true) . '/'));
    } else {
        return $link;
    }
}

add_action('init', 'custom_product_permalink_rewrite_rules');

function custom_product_permalink_rewrite_rules() {
    add_rewrite_rule(
        'shop/product/([^/]+)-([^/]+)/?$',
        'index.php?post_type=product&name=$matches[1]&sku=$matches[2]',
        'top'
    );

    flush_rewrite_rules();
}

Я новичок в продвинутом кодировании WordPress, буду очень признателен за любые рекомендации и помощь.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функцию custom_product_permalink() можно изменить, чтобы найти и включить полный ярлык категории (с родительскими ярлыками) и исключить строку «продукт» (что также меняет правило перезаписи):

add_filter('post_type_link', 'custom_product_permalink', 1, 2);

function custom_product_permalink($link, $post) {
    if ($post->post_type == 'product') {
        $cat_tax = 'product_cat';
        // Find the product category IDs
        $cat_ids = wp_get_post_terms($post->ID, $cat_tax, ['fields' => 'ids']);
        $cat_full_slug = '';
        if (is_array($cat_ids) && !empty($cat_ids)) {
            // Build a full hierarchical category slug
            $cat_full_slug = get_term_parents_list($cat_ids[0], $cat_tax, [
                'format' => 'slug',
                'separator' => '/',
                'link' => false,
                'inclusive' =>true
            ]);
        }
        // Convert the entire URL to lowercase
        return strtolower(home_url('shop/' . $cat_full_slug .
                                   $post->post_name . '-' .
                                   get_post_meta($post->ID, '_sku', true) . '/'));
    } else {
        return $link;
    }
}

add_action('init', 'custom_product_permalink_rewrite_rules');

function custom_product_permalink_rewrite_rules() {
    add_rewrite_rule(
        'shop/.+/([^/]+)-([^/]+)/?$',
        'index.php?post_type=product&name=$matches[1]&sku=$matches[2]',
        'top'
    );

    flush_rewrite_rules();
}

Обратите внимание, что для этого у продукта должна быть хотя бы одна категория. В случаях, когда существует несколько категорий, используется только первая, возвращаемая wp_get_post_terms(). _sku также является обязательным и не может содержать -.

Другие вопросы по теме

Отменить конкретную стоимость доставки, если бесплатная стоимость доставки доступна для 2 зон доставки
Вариативное изображение щелкните раскрывающийся список атрибутов изменения выбранного значения в WooCommerce
Wordpress и Docker Compose – «Ошибка при установке соединения с базой данных» / «Ошибка базы данных» с использованием wp-config.php
POST http://domain/wp-admin/admin-ajax.php 400 (неверный запрос)
Из элементов заказа WooCommerce создайте массив идентификаторов продуктов и их количеств
WordPress: проблема с пользовательским метаполем, не обновляющимся с текущими пользовательскими метазначениями сообщения при редактировании сообщения
Как вставить всего несколько слов в переведенные строки WooCommerce
Заказ каталога WooCommerce по индивидуальному диапазону на основе метаданных
WordPress Docker: найдите том из другого контейнера с помощью wpcli
Woocommerce Один продукт Ajax добавляет в корзину с пользовательскими данными элемента корзины