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

CPT + Taxonomy после %post_name%

Нужна реализация меню для ресторана, но столкнулся с проблемой таксономии (возможно есть другое решение).

Есть следующая структура: site.com/family/%post_name%, а нужно site.com/family/%post_name%/%taxonomy%, где:
family – это кастомный тип записи,
%taxonomy% – это название меню для ресторана (например, Сезонное меню).

Пробывал rewrite и прочие решения, но всегда %taxonomy% WordPress ставит перед %post_name%, а нужно инверсию сделать: сначала идет имя ресторана, а потом при переходе на страницу его меню будет в ЧПУ название этого меню (site.com/family/vinoteka/season-menu, к примеру).

Вот код, с которым я сейчас работаю:

add_action('init', 'family_post_type');
function family_post_type() {

	register_taxonomy('menu', array('family'), array(
		'label'                 => 'Меню закладу',
		'labels'                => array(
			'name'              => 'Меню закладів', 'taxonomy general name',
			'singular_name'     => 'Меню закладу', 'taxonomy singular name',
			'search_items'      => 'Пошук меню',
			'all_items'         => 'Всі меню',
			'parent_item'       => '',
			'parent_item_colon' => '',
			'edit_item'         => 'Редагувати меню',
			'update_item'       => 'Оновити меню',
			'add_new_item'      => 'Додати нове меню',
			'new_item_name'     => 'Нове меню',
			'menu_name'         => 'Меню',
		),
		'public'                => true,
		'show_in_nav_menus'     => false,
		'show_ui'               => true,
		'show_tagcloud'         => false,
		'hierarchical'          => true,
		'rewrite'               => array('slug'=>'family', 'hierarchical'=>false, 'with_front'=>false, 'feed'=>false ),
		'show_admin_column'     => true, // Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5)

	));

	register_post_type('family', array(
		'label'               => 'Наші заклади',
		'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,
		'show_in_rest'        => false,
		'rest_base'           => '',
		'exclude_from_search' => false,
		'capability_type'     => 'post',
		'map_meta_cap'        => true,
		'hierarchical'        => false,
		'rewrite'             => array( 'slug'=>'family/%menu%', 'with_front'=>false, 'pages'=>false, 'feeds'=>false, 'feed'=>false ),
		'has_archive'         => 'family',
		'query_var'           => true,
		'menu_icon'           => 'dashicons-store',
		'supports'            => array('title','thumbnail','excerpt'),
		'taxonomies'          => array('menu')
	) );

}

## Filter for URL CPT
add_filter('post_type_link', 'family_permalink', 1, 2);
function family_permalink( $permalink, $post ){
	// выходим если это не наш тип записи: без холдера %products%
	if( strpos($permalink, '%menu%') === false )
		return $permalink;

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

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

Решение прокомментировал ниже..

0
Виталий
4.1 год назад
  • 0

    Да, к сожалению, так не работает.
    Теперь просто URL: /?family=shato-roial

    Решил вопрос следующим образом:
    Перевёл значение

    'hierarchical'       => false,

    в

    'hierarchical'       => true,

    Потом прописал ещё в масив поддержки:

    'supports'           => array(....., 'page-attributes')

    После чего, перевёл страницу 'capability_type' post в page:

    'capability_type'    => 'page',

    Создал для страниц ШАБЛОНЫ и вуаля.
    Сделал вложеность страницы, для каждого меню свой родитель (то есть, страница ресторана).

    Теперь структура выглядит то, что надо: site.com/family/rondel/osnovne-menu/

    Комментировать
  • 1
    Kama9598

    Там в ядре имя всегда будет в конце. Чтобы добиться нужного тебе результата, тебе нужно вообще отключить базовую регу ЧПУ при реге типа записи, так:

    'rewrite'             => false,

    И затем сразу полсе реги типа записи, регнуть ЧПУ вручную, примерно так:

    // регистрируем структуру через add_permastruct
    add_permastruct( 'realty', 'family/%post_name%/%menu%', array(
    	'with_front'  => 0,
    	'paged'       => 0,
    	'feed'        => 0,
    	'walk_dirs'   => 0,
    ));

    И возможно нужно будет еще где-то что-то подкрутить, чтобы все заработало. Я сейчас не подскажу, забыл уже как там точно все работает.

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