WordPress как на ладони
wordpress jino

Настройка ЧПУ для произвольных типов записей

Настраиваю ЧПУ. Но не все выходит так как нужно.

add_action('init', 'my_custom_init');
function my_custom_init(){
	register_post_type('shemy', array(
		'labels'             => array(
			'name'               => 'Схемы', // Основное название типа записи
			'singular_name'      => 'Схема', // отдельное название записи типа Book
			'add_new'            => 'Добавить новую',
			'add_new_item'       => 'Добавить новую схему',
			'edit_item'          => 'Редактировать схему',
			'new_item'           => 'Новая схема',
			'view_item'          => 'Посмотреть схему',
			'search_items'       => 'Найти схему',
			'not_found'          =>  'Схемы не найдено',
			'not_found_in_trash' => 'В корзине схем не найдено',
			'parent_item_colon'  => '',
			'menu_name'          => 'Схемы'

		  ),
		'public'             => true,
		'publicly_queryable' => true,
		'show_ui'            => true,
		'show_in_menu'       => true,
		'query_var'          => true,
		'rewrite'             => false,
		'has_archive'         => 'shemy',
		'taxonomies'          => array( 'catshemy' ),
		'capability_type'    => 'post',
		'has_archive'        => true,
		'hierarchical'       => false,
		'menu_position'      => null,
		'supports'           => array('title','editor','author','thumbnail','excerpt','comments')
	) );
}

add_action('init', function(){
	global $wp_rewrite;

	// добавим тег перезаписи, чтобы add_permastruct() его поняла
	// он потом будет заменен на часть регулярки указанной во втором параметре
	$wp_rewrite->add_rewrite_tag( '%shemy%', '([^/]+)', "post_type=shemy&name=" );

	$permastruct = 'shemy/%catshemy%/%shemy%.html'; // наша структура ЧПУ
	$args = array(
		'with_front'  => true,
		'paged'       => true,
		'feed'        => false,
		'forcomments' => false,
		'walk_dirs'   => false,
		'endpoints'   => false,
	);

	// добавляем структуру ЧПУ
	$wp_rewrite->add_permastruct( 'shemy', $permastruct, $args );

}, 1);

// хук, через который подключается функция
// регистрирующая новые таксономии (create_shemy_taxonomies)
add_action( 'init', 'create_shemy_taxonomies', 0 );

// функция, создающая таксономию "Категории" для постов типа "shemy"
function create_shemy_taxonomies(){
	// определяем заголовки для 'Категории'
	$labels = array(
		'name' => _x( 'Рубрики', 'taxonomy general name' ),
		'singular_name' => _x( 'Рубрика', 'taxonomy singular name' ),
		'search_items' =>  __( 'Поиск рубрик' ),
		'all_items' => __( 'Все записи' ),
		'parent_item' => __( 'Parent Genre' ),
		'parent_item_colon' => __( 'Parent Genre:' ),
		'edit_item' => __( 'Редактировать рубрику' ),
		'update_item' => __( 'Обновить рубрику' ),
		'add_new_item' => __( 'Добаить рубрику' ),
		'new_item_name' => __( 'New Genre Name' ),
		'menu_name' => __( 'Рубрики' ),
	);

	// Добавляем древовидную таксономию 'catshemy' (как категории)
	register_taxonomy('catshemy', array('shemy'), array(
		'hierarchical' => true,
		'labels' => $labels,
		'show_ui' => true,
		'query_var' => true,
		'rewrite' => array('slug'=>'shemy', 'hierarchical'=>false, 'with_front'=>false, 'feed'=>false ),
	));
}

## Отфильтруем ЧПУ произвольного типа
// фильтр: apply_filters( 'post_type_link', $post_link, $post, $leavename, $sample );
add_filter('post_type_link', 'shemy_permalink', 1, 2);
function shemy_permalink( $permalink, $post ){
	// выходим если это не наш тип записи: без холдера %products%
	if( strpos($permalink, '%catshemy%') === false )
		return $permalink;

	// Получаем элементы таксы
	$terms = get_the_terms($post, 'catshemy');
	// если есть элемент заменим холдер
	if( ! is_wp_error($terms) && !empty($terms) && is_object($terms[0]) )
		$term_slug = array_pop($terms)->slug;
	// элемента нет, а должен быть...
	else
		$term_slug = 'no-catshemy';

	return str_replace('%catshemy%', $term_slug, $permalink );
}

Я использую хлебные крошки от Wp-kama.
И здесь есть ошибки, которые сам не в силах исправить.
Находясь на странице записи получаю такую структуру:
Главная / Схемы / Тест /
Здесь не правильная ссылка на Схемы, она имеет вид href="http://сайт.ру/?post_type=shemy"

Находясь в таксономии по типу рубрик из цепочки пропадает "Схемы", выдает вот такое: Главная / Тест, а должно быть Главная / Схемы / Тест

Второй момент, о одном из сайтов мне нужно удалить префикс из УРЛ, для этого есть код:

add_filter('post_type_link', 'remove_post_type_slug', 10, 2 );
add_action('pre_get_posts', 'add_post_type_to_get_posts_request' );

// Удаляем префикс с именем типа записи из URL
function remove_post_type_slug( $post_link, $post ){
	if( $post->post_type === 'team' ){
		return str_replace("/$post->post_type/", '/', $post_link );
	}

	return $post_link;
}

// Добавляем тип записи в запрос
function add_post_type_to_get_posts_request( $query ){
	if( ! $query->is_main_query() ) return; // не основной запрос

	// не запрос с name параметром (как у постоянной страницы)
	if( ! isset($query->query['page']) || empty($query->query['name']) || count($query->query) != 2 )
		return;

	$query->set('post_type', array('post', 'page', 'team') ); // 'team' added
}

Но как тогда мне выше переписать код, чтоб УРЛ были вида

Сайт/рубрика/подрубрика/пост.html

Мне удавалось сделать это для записи, но находясь в рубрике было

Сайт/название таксономии/рубрика

Очень прошу разобраться

stepan год назад

публикуйте задание на бирже фриланса.
Вряд ли кто-то будет "за спасибо" разбираться в Вашем коде.

0
stahov год назад

Нет ответов на этот вопрос.

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