WordPress как на ладони
Официальная конференция по WordPress в Moскве 18-19 августа, начало в 9:00 wordpress jino

ЧПУ в custom post type

Каким образом можно задать ЧПУ для произольной таксономии и произольного типа постов таким образом?

Для таксономии:

http://site.ru/category-1/sub-category-1/sub-category-2/

Для постов:

http://site.ru/category-1/sub-category-1/sub-category-2/post-name/

У меня получается только в таком виде:

Для таксономии:

http://site.ru/custom_taxonomy_name/category-1/sub-category-1/sub-category-2/

Для постов:

http://site.ru/custom_post_name/category-1/sub-category-1/sub-category-2/post-name/

В коде ниже
custom_post_name = adv
custom_taxonomy_name = search

Вот код как делаю это:

<?php 

add_rewrite_tag('platform_category', '(.+)');

// Создаем произвольную таксономию
function add_new_taxonomies() {
	register_taxonomy('platform',
		array('adv'),
		array(
			'labels' => array(
				'name' => 'Категории',
				/*......*/
			),
			'public' => true, 
			'show_in_nav_menus' => true,
			'show_ui' => true,
			'show_tagcloud' => true,
			'update_count_callback' => '_update_post_term_count',
			'query_var' => true,
			'hierarchical' => true,
			'rewrite' => array(
				'slug' => 'search',
				'hierarchical' => true,
				'with_front' => false
			),
		)
	);
}
add_action( 'init', 'add_new_taxonomies', 0 );

// Создаем произвольный тип постов
function create_post_type() { 
	  register_post_type( 'adv', 
	  array( 
		  'labels' => array( 
		  'name' => __( 'Объявления' ), 
		  /*......*/
	  ), 
	  'public' => true, 
	  'query_var' => true,
	  'publicly_queryable' => true,
	  'menu_position' => 5,
	  'rewrite' => array('slug' => '%platform_category%'), 
	  'supports' => array('title', 'editor', 'thumbnail'), 
	  'taxonomies'          => array(),
	  ) 
	  ); 
} 
add_action( 'init', 'create_post_type' ); // инициируем добавления типа

// Заменим %platform_category%  в ссылках постов на ссылку со всем деревом таксономии
function wpa_platform_post_link( $post_link, $id = 0 ){
	$post = get_post($id);  
	if ( is_object( $post ) ){
		$terms = wp_get_object_terms( $post->ID, 'platform' );
		if( $terms ){
		foreach($terms as $term)
		{
		$cats[] = $term->slug;
		}
		$cats = "adv/".implode("/", $cats);
			return str_replace( '%platform_category%' , $cats , $post_link );
		}
	}
	return $post_link;  
}
add_filter( 'post_type_link', 'wpa_platform_post_link', 10, 2 );

// Добавим правило для постов
function add_ticket_rewrite_rules($rules) {
	$newrules = array();
	$newrules['adv/(.+?)/([^/]+)$'] = 'index.php?adv=$matches[2]';

	return array_merge($newrules,$rules);
}
add_filter('rewrite_rules_array', 'add_ticket_rewrite_rules');
0
Андрей
4 месяца назад
  • 0

    Посмотри как сделано тут: https://wp-kama.ru/id_7637/chpu-dlya-treh-taksonomij-i-tipa-zapisi-odnovremenno.html

    Отключи совсем rewrite у типа поста, хуком перехвати создание урл для этого типа и формируй динамически урл используя категории, все есть по ссылке выше.

    Не поленись, прочитай весь код, там все понятно.

    Да и вообще уже готово как по мне как раз что бы было все как у тебя. Возми его код и измени для себя.

    Андрей 4 месяца назад

    Спасибо. Изучу все. Но сразу бросилось в глаза то что в URL присутствует:
    "estate"
    dom/estate/spain/valensiya/sale-rent/

    То есть имя таксономии и имя типа записи в URL присутствует (правда в по ссылке они совпадают, а у меня разные). А хотелось бы избавиться от них вообще.

    ant 4 месяца назад

    Что бы избавится совсем, то тогда просто пользуйся стандартными страницами и постами и рули категориями

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