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 );
}
Решение прокомментировал ниже..
Да, к сожалению, так не работает.
Теперь просто URL: /?family=shato-roial
Решил вопрос следующим образом:
Перевёл значение
в
Потом прописал ещё в масив поддержки:
После чего, перевёл страницу 'capability_type' post в page:
Создал для страниц ШАБЛОНЫ и вуаля.
Сделал вложеность страницы, для каждого меню свой родитель (то есть, страница ресторана).
Теперь структура выглядит то, что надо: site.com/family/rondel/osnovne-menu/
Там в ядре имя всегда будет в конце. Чтобы добиться нужного тебе результата, тебе нужно вообще отключить базовую регу ЧПУ при реге типа записи, так:
И затем сразу полсе реги типа записи, регнуть ЧПУ вручную, примерно так:
И возможно нужно будет еще где-то что-то подкрутить, чтобы все заработало. Я сейчас не подскажу, забыл уже как там точно все работает.