Как настроить постоянные ссылки для пользовательского типа сообщения с терминами таксономии - PullRequest
0 голосов
/ 19 октября 2018

Я настроил CPT и налоги вручную в WPCodex, но у меня нет структуры, которая бы мне подходила.
У меня есть продукт в термине "subterm"
"subterm" находится в "term "- родительский термин.
У меня есть: products / subterm / product
Я хочу: products / term / subterm / (и более, если термин isset) product.
Пожалуйста, помогите мне.
Мой код

<?php
private static function products() {
        $tax_labels = [
            'name' => 'Категории',
            'singular_name' => 'Категория',
            'menu_name' => 'Категории',
            'all_items' => 'Все категории',
            'edit_item' => 'Редактировать категорию',
            'view_item' => 'Просмотр категории',
            'update_item' => 'Обновить название категории',
            'add_new_item' => 'Добавить новую категорию',
            'new_item_name' => 'Новое название категории',
            'parent_item' => 'Родительская категория',
            'parent_item_colon' => 'Родитель категории:',
            'search_items' => 'Поиск категория',
            'popular_items' => 'Популярная категория',
        ];
        $tax_args = [
            'label' => 'Категории',
            'labels' => $tax_labels,
            'public' => true,
            'hierarchical' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'show_in_nav_menus' => true,
            'query_var' => true,
            'rewrite' => ['slug' => 'products', 'with_front' => true, 'hierarchical' => true,],
            'show_admin_column' => false,
            'show_in_rest' => false,
            'rest_base' => 'seofw_category_products',
            'show_in_quick_edit' => true,
        ];
        register_taxonomy('seofw_category_products', ['seofw_products'], $tax_args);

        $pt_labels = [
            'name' => 'Товары',
            'singular_name' => 'Товар',
            'menu_name' => 'Каталог товаров',
            'all_items' => 'Все товары',
            'add_new' => 'Добавить товар',
            'add_new_item' => 'Добавить новый товар',
            'edit_item' => 'Редактировать товар',
            'new_item' => 'Новый товар',
            'view_item' => 'Просмотр товара',
            'view_items' => 'Просмотр товаров',
            'search_items' => 'Поиск товара',
            'not_found' => 'Не найдено ни одного товара',
            'not_found_in_trash' => 'Ни найдено ни одного товара в корзине',
            'parent_item_colon' => 'Родитель товара',
            'featured_image' => 'Изображение товара',
            'set_featured_image' => 'Установить изображение товара',
            'remove_featured_image' => 'Удалить изображение товара',
            'use_featured_image' => 'Использовать как изображение товара',
            'archives' => 'Каталог',
        ];
        $pt_args = [
            'label' => 'Товары',
            'labels' => $pt_labels,
            'description' => 'Простой магазин.',
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true,
            'show_in_rest' => false,
            'rest_base' => '',
            'has_archive' => true,
            'show_in_menu' => true,
            'show_in_nav_menus' => true,
            'exclude_from_search' => false,
            'capability_type' => 'post',
            'map_meta_cap' => true,
            'hierarchical' => true,
            'rewrite' => ['slug' => 'products/%products_category%', 'with_front' => true],
            'query_var' => true,
            'menu_icon' => 'dashicons-cart',
            'supports' => ['title', 'editor', 'thumbnail', 'excerpt', 'comments'],
        ];
        register_post_type('seofw_products', $pt_args);
    }

    public static function products_permalink() {

        add_filter('rewrite_rules_array', function ($rules) {
            $new = [];
            $new['products/([^/]+)/(.+)/?$'] = 'index.php?seofw_products=$matches[2]';
            $new['products/(.+)/?$'] = 'index.php?seofw_category_products=$matches[1]';

            return array_merge($new, $rules); // Ensure our rules come first
        });

        add_filter('post_type_link', function ($link, $post) {
            if ($post->post_type == 'seofw_products') {
                if ($cats = get_the_terms($post->ID, 'seofw_category_products')) {
                    $link = str_replace('%products_category%', current($cats)->slug, $link);
                }
            }
            return $link;
        }, 10, 2);
    }

    private static function services() {
        $tax_labels = [
            'name' => 'Категории',
            'singular_name' => 'Категория',
            'menu_name' => 'Категории',
            'all_items' => 'Все категории',
            'edit_item' => 'Редактировать категорию',
            'view_item' => 'Просмотр категории',
            'update_item' => 'Обновить название категории',
            'add_new_item' => 'Добавить новую категорию',
            'new_item_name' => 'Новое название категории',
            'parent_item' => 'Родительская категория',
            'parent_item_colon' => 'Родитель категории:',
            'search_items' => 'Поиск категория',
            'popular_items' => 'Популярная категория',
        ];
        $tax_args = [
            'label' => 'Категории',
            'labels' => $tax_labels,
            'public' => true,
            'hierarchical' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'show_in_nav_menus' => true,
            'query_var' => true,
            'rewrite' => ['slug' => 'services', 'with_front' => true,],
            'show_admin_column' => false,
            'show_in_rest' => false,
            'rest_base' => 'seofw_category_services',
            'show_in_quick_edit' => true,
        ];
        register_taxonomy('seofw_category_services', ['seofw_services'], $tax_args);

        $pt_labels = [
            'name' => 'Услуги',
            'singular_name' => 'Услуга',
            'menu_name' => 'Каталог услуг',
            'all_items' => 'Все услуги',
            'add_new' => 'Добавить слугу',
            'add_new_item' => 'Добавить новую услугу',
            'edit_item' => 'Редактировать услугу',
            'new_item' => 'Новая услуга',
            'view_item' => 'Просмотр услуги',
            'view_items' => 'Просмотр услуг',
            'search_items' => 'Поиск услуги',
            'not_found' => 'Не найдено ни одной услуги',
            'not_found_in_trash' => 'Ни найдено ни одной услуги в корзине',
            'parent_item_colon' => 'Родитель услуги',
            'featured_image' => 'Изображение услуги',
            'set_featured_image' => 'Установить изображение услуги',
            'remove_featured_image' => 'Удалить изображение услуги',
            'use_featured_image' => 'Использовать как изображение услуги',
            'archives' => 'Каталог',
        ];
        $pt_args = [
            'label' => 'Услуги',
            'labels' => $pt_labels,
            'description' => 'Каталог услуг',
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true,
            'show_in_rest' => true,
            'rest_base' => '',
            'has_archive' => true,
            'show_in_menu' => true,
            'show_in_nav_menus' => true,
            'exclude_from_search' => false,
            'capability_type' => 'post',
            'map_meta_cap' => true,
            'hierarchical' => false,
            'rewrite' => ['slug' => 'services/%services_category%', 'with_front' => true],
            'query_var' => true,
            'menu_icon' => 'dashicons-groups',
            'supports' => ['title', 'editor', 'thumbnail', 'comments', 'author'],
        ];
        register_post_type('seofw_services', $pt_args);
    }

    public static function service_permalink() {

        add_filter('rewrite_rules_array', function ($rules) {
            $new = [];
            $new['services/([^/]+)/(.+)/?$'] = 'index.php?seofw_services=$matches[2]';
            $new['services/(.+)/?$'] = 'index.php?seofw_category_services=$matches[1]';

            return array_merge($new, $rules); // Ensure our rules come first
        });

        add_filter('post_type_link', function ($link, $post) {
            if ($post->post_type == 'seofw_services') {
                if ($cats = get_the_terms($post->ID, 'seofw_category_services')) {
                    $link = str_replace('%services_category%', current($cats)->slug, $link);
                }
            }
            return $link;
        }, 10, 2);
    }

Извините за мой английский
Можно так же написать ответ на русском)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...