Как правильно настроить register_post_types и register_taxonomy?

Задача: настроить register_post_types и register_taxonomy
Ожидание: пост кастомного типа записи открывается по адресу "домен/страна/город/университет", где "страна" и "город" это кастомные таксономии присвоенные для поста кастомного типа записи
Вводные:
1. Код functions.php согласно источника: wp-kama.ru/function/register_post_type:
function register_post_types(){
	register_post_type( 'universities', [
		'label'  => null,
		'labels' => [
			'name'               => 'Universities', // основное название для типа записи
			'singular_name'      => 'universities', // название для одной записи этого типа
			'add_new'            => 'Добавить Uni', // для добавления новой записи
			'add_new_item'       => 'Добавление Uni', // заголовка у вновь создаваемой записи в админ-панели.
			'edit_item'          => 'Редактирование Uni', // для редактирования типа записи
			'new_item'           => 'Новое Uni', // текст новой записи
			'view_item'          => 'Смотреть Uni', // для просмотра записи этого типа.
			'search_items'       => 'Искать Uni', // для поиска по этим типам записи
			'not_found'          => 'Не найдено', // если в результате поиска ничего не было найдено
			'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине
			'parent_item_colon'  => '', // для родителей (у древовидных типов)
			'menu_name'          => '', // название меню
		],
		'description'            => '',
		'public'                 => true,
		// 'publicly_queryable'  => null, // зависит от public
		// 'exclude_from_search' => null, // зависит от public
		// 'show_ui'             => null, // зависит от public
		// 'show_in_nav_menus'   => null, // зависит от public
		'show_in_menu'           => null, // показывать ли в меню админки
		// 'show_in_admin_bar'   => null, // зависит от show_in_menu
		'show_in_rest'        => null, // добавить в REST API. C WP 4.7
		'rest_base'           => null, // $post_type. C WP 4.7
		'menu_position'       => null,
		'menu_icon'           => null,
		//'capability_type'   => 'post',
		//'capabilities'      => 'post', // массив дополнительных прав для этого типа записи
		//'map_meta_cap'      => null, // Ставим true чтобы включить дефолтный обработчик специальных прав
		'hierarchical'        => false,
		'supports'            => [ 'title', 'editor' ], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats'
		'taxonomies'          => ['country'],
		'has_archive'         => false,
		'rewrite' => array('slug' => 'universities/country/city'),
		'query_var'           => true,
	] );
}
add_action( 'init', 'register_post_types' );

function create_taxonomy(){
	register_taxonomy( 'country', [ 'universities' ], [
		'label'                 => '', // определяется параметром $labels->name
		'labels'                => [
			'name'              => 'Country',
			'singular_name'     => 'Country',
			'search_items'      => 'Search Country',
			'all_items'         => 'All Country',
			'view_item '        => 'View Country',
			'parent_item'       => 'Parent Country',
			'parent_item_colon' => 'Parent Country:',
			'edit_item'         => 'Edit Country',
			'update_item'       => 'Update Country',
			'add_new_item'      => 'Add New Country',
			'new_item_name'     => 'New Country Name',
			'menu_name'         => 'Country',
			'back_to_items'     => '← Back to Country',
		],
		'description'           => '', // описание таксономии
		'public'                => true,
		// 'publicly_queryable'    => null, // равен аргументу public
		// 'show_in_nav_menus'     => true, // равен аргументу public
		// 'show_ui'               => true, // равен аргументу public
		// 'show_in_menu'          => true, // равен аргументу show_ui
		// 'show_tagcloud'         => true, // равен аргументу show_ui
		// 'show_in_quick_edit'    => null, // равен аргументу show_ui
		'hierarchical'          => true,

		'rewrite' => array('slug' => 'universities'),
		//'query_var'             => $taxonomy, // название параметра запроса
		'capabilities'          => array(),
		'meta_box_cb'           => null, // html метабокса. callback: `post_categories_meta_box` или `post_tags_meta_box`. false — метабокс отключен.
		'show_admin_column'     => false, // авто-создание колонки таксы в таблице ассоциированного типа записи. (с версии 3.5)
		'show_in_rest'          => null, // добавить в REST API
		'rest_base'             => null, // $taxonomy
		// '_builtin'              => false,
		//'update_count_callback' => '_update_post_term_count',
	] );

	register_taxonomy( 'city', [ 'universities' ], [
		'label'                 => '', // определяется параметром $labels->name
		'labels'                => [
			'name'              => 'city',
			'singular_name'     => 'city',
			'search_items'      => 'Search city',
			'all_items'         => 'All city',
			'view_item '        => 'View city',
			'parent_item'       => 'Parent city',
			'parent_item_colon' => 'Parent city:',
			'edit_item'         => 'Edit city',
			'update_item'       => 'Update city',
			'add_new_item'      => 'Add New city',
			'new_item_name'     => 'New city Name',
			'menu_name'         => 'city',
			'back_to_items'     => '← Back to city',
		],
		'description'           => '', // описание таксономии
		'public'                => true,
		// 'publicly_queryable'    => null, // равен аргументу public
		// 'show_in_nav_menus'     => true, // равен аргументу public
		// 'show_ui'               => true, // равен аргументу public
		// 'show_in_menu'          => true, // равен аргументу show_ui
		// 'show_tagcloud'         => true, // равен аргументу show_ui
		// 'show_in_quick_edit'    => null, // равен аргументу show_ui
		'hierarchical' => true, // Указываем, что таксономия иерархическая
    	'parent' => 'country',
		'rewrite' => array('slug' => 'universities/country'),
		//'query_var'             => $taxonomy, // название параметра запроса
		'capabilities'          => array(),
		'meta_box_cb'           => null, // html метабокса. callback: `post_categories_meta_box` или `post_tags_meta_box`. false — метабокс отключен.
		'show_admin_column'     => false, // авто-создание колонки таксы в таблице ассоциированного типа записи. (с версии 3.5)
		'show_in_rest'          => null, // добавить в REST API
		'rest_base'             => null, // $taxonomy
		// '_builtin'              => false,
		//'update_count_callback' => '_update_post_term_count',
	] );
}
add_action( 'init', 'create_taxonomy' );


2. Cозданы страницы для отображения информации согласно источника wp-kama.ru/handbook/theme/theme-files-hierarchy: taxonomy-country.php, taxonomy-city.php и single-universities.php.

Контекст: помимо университетов будут так же кастомные записи для других типов записи.

Что я делал: пытался добавить ярлык к урлу.
function custom_term_link($termlink, $term, $taxonomy) {
    // Проверяем, что мы работаем с таксономией city
    if ($taxonomy === 'city') {
        // Получаем родительскую таксономию country
        $country = get_term($term->parent, 'country');

        // Если у термина есть родительская таксономия country, добавляем ее ярлык к урлу
        if ($country && !is_wp_error($country)) {
            $termlink = str_replace('country', $country->slug, $termlink);
        }
    }

    return $termlink;
}
add_filter('term_link', 'custom_term_link', 10, 3);


Что я получил: нулевой результат.

Вопрос: как правильно настроить register_post_types и register_taxonomy чтобы получить для поста кастомного типа записи урлы вида "домен/страна/город/университет", где "страна" и "город" это кастомные таксономии присвоенные для поста кастомного типа записи?
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы