WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Как создать нужное мне ЧПУ кастомных постов WordPress?

пытаюсь получить URI в котором буду тотображаться все вложенные категории поста. Пост download Таксономия download_cat Например если я создам категории news -> football -> matches (где matches дочерняя категория football, а football дочерняя категория news) И попробую перейти на страницу matches то по дефолту получу сделающий адрес example.com/download_cat/matches
но не
example.com/download_cat/news/football/matches
Мой код:
Регистрация поста

register_post_type('download', array(
		'label'  => null,
		'labels' => array(
			'name'               => 'Документация', // основное название для типа записи
			'singular_name'      => 'Документация', // название для одной записи этого типа
			'add_new'            => 'Добавить документ', // для добавления новой записи
			'add_new_item'       => 'Добавление документа', // заголовка у вновь создаваемой записи в админ-панели.
			'edit_item'          => 'Редактирование документа', // для редактирования типа записи
			'new_item'           => 'Новый документ', // текст новой записи
			'view_item'          => 'Смотреть документ', // для просмотра записи этого типа.
			'search_items'       => 'Искать документ', // для поиска по этим типам записи
			'not_found'          => 'Не найдено', // если в результате поиска ничего не было найдено
			'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине
			'parent_item_colon'  => '', // для родителей (у древовидных типов)
			'menu_name'          => 'Документация', // название меню
		),
		'description'         => '',
		'menu_position'       => 6,
		'public'              => true,
		'publicly_queryable'  => true,
		'show_ui'             => true,
		'show_in_rest'        => false,
		'rest_base'           => '',
		'show_in_menu'        => true,
		'exclude_from_search' => false,
		'capability_type'     => 'post',
		'map_meta_cap'        => true,
		'hierarchical'        => false,
		'rewrite'             => array( 'slug'=>'download/%download_cat%', 'with_front'=>false, 'pages'=>false, 'feeds'=>false, 'feed'=>false ),
		'has_archive'         => 'downloads',
		'query_var'           => true,
		'supports'            => array( 'title' ),
		'taxonomies'          => array( 'download_cat' ),
	) );

Регистрация таксономии:

register_taxonomy('download_cat', array('download'), array(
		'label'                 => '', // определяется параметром $labels->name
		'labels'                => array(
			'name'              => 'Категории',
			'singular_name'     => 'Категория',
			'search_items'      => 'Поиск категории',
			'all_items'         => 'Все категории',
			'view_item '        => 'Просмотр категории',
			'parent_item'       => 'Родительская категория',
			'parent_item_colon' => 'Родительская категория:',
			'edit_item'         => 'Редиктировать категорию',
			'update_item'       => 'Обновит ькатегорию',
			'add_new_item'      => 'Добавить новую категорию',
			'new_item_name'     => 'Добавить новую категорию',
			'menu_name'         => 'Категории',
		),
		'description'           => '', // описание таксономии
		'public'                => true,
		'show_in_nav_menus'     => false, // равен аргументу public
		'show_ui'               => true, // равен аргументу public
		'show_tagcloud'         => false, // равен аргументу show_ui
		'hierarchical'          => true,
		'rewrite'               => array('slug'=>'download', 'hierarchical'=>false, 'with_front'=>false, 'feed'=>false ),
		'show_admin_column'     => true, // Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5)
	) );

И хук для формирования чпу:

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

function download_rout( $permalink, $post ){

	// выходим если это не наш тип записи: без холдера %products%
	if( strpos($permalink, '%download_cat%') === false )
		return $permalink;

	// Получаем элементы таксы
	$terms = get_the_terms($post, 'download_cat');
	// если есть элемент заменим холдер
	if( ! is_wp_error($terms) && !empty($terms) && is_object($terms[0]) ) {
		//$term_slug = array_pop($terms)->slug;
		//$term_slug = $terms[0]->slug;
		$term_slug =  get_term_parents_list( $terms[0]->term_id, 'download_cat', array(
			'separator' => '/',
			'format'    => 'slug',
			'link'      => false,
			'inclusive' => true,
		) );
		$term_slug = trim($term_slug, '/');
	}

	// элемента нет, а должен быть...
	else
		$term_slug = 'no-categories';

	return str_replace('%download_cat%', $term_slug, $permalink );

Таким кодом получается заставить формировать uri нужным образом но если мы создадим любой пост для дочерней категории то получим 404.
Например если я создам пост test для категории matches, то на странцие редактирования поста сформируется нужный мне uri а именно
example.com/download/news/football/matches/test
но если я перейду по этому адресу то получу 404.

То же самое произойдет если я попытаюсь перейти например по адресу example.com/download/news/football или example.com/download/news/football/matches/, но если я запрошу адрес example.com/download/news, то отработает категория news и выведет все посты. Или же если наберу адрес example.com/download/matches/test то выведется запись test.

Я так понимаю что просто с помощью этого хука нарезать адреса мало, нужно наверное их как-то регистрировать? Подскажите пожалуйста в чем проблема.

1
Павел
5.5 лет назад 3
  • 0

    По себе скажу что задача сложная, стандартными способами вордпресс не реализовать и проверить эту часть:

    'rewrite' => array('slug'=>'download', 'hierarchical'=>false,
    может 'hierarchical'=>true ?

    .................

    Далее, внимательно изучать и читать статью https://wp-kama.ru/id_7637/chpu-dlya-treh-taksonomij-i-tipa-zapisi-odnovremenno.html

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

    Еще есть хорошие слайды по теме тут: https://es.slideshare.net/MikeSchinkel/hardcore-url-routing-2014


    Еще может осложнит задачу это пагинация с учетом всех этих выкрутасов...

    Павел 5.5 лет назад

    Спасибо за помощь

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация