Как настроить постоянные ссылки для пользовательского типа сообщения с терминами таксономии

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

<?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);
}

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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]