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

Подключение шаблона для таксономии пользовательского типа записи

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

На сайт добавил произвольный тип записи (События) и две таксономии к нему (рубрики: "Города" и "Календари"). Все файлы вынес в отдельную категорию calendar/

Структура папки получилась такая:

  1. /calendar/init-type-events - инициализация пользовательского типа и таксономий к нему.
  2. /calendar/events.php - вывод всех созданных событий.
  3. /calendar/single-events.php — вывод одного события.
  4. /calendar/taxonomy/calendars.php — вывод таксономии "Календари".
  5. /calendar/taxonomy/cities.php — вывод таксономии города.

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

Частично у меня это получилось, спасибо статье: "3 способа создать шаблон страницы" (а именно третьему способу). Но проблему, которую у меня не решить - это вывод шаблонов для таксономий.

Для наглядности закинул, что на данный момент получилось на сайт https://alexanderyurchenko.ru/events/

Приведу код инициализации пользовательского типа данных:

function init_events_post_type()
{
	$labels_post_type_events = [
		'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' => 'События',
	];
	$args_post_type_events = [
		'labels' => $labels_post_type_events,
		'description' => 'args_post_type_events',
		'public' => true,
		'menu_icon' => 'dashicons-calendar-alt',
		'menu_position' => 5,
		'supports' => ['title', 'custom-fields'],
		'taxonomies' => ['calendars', 'cities'],
	];
	register_post_type('events', $args_post_type_events);

	// Регистрация таксономии "Календари"
	$labels_taxonomy_calendars = [
		'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' => 'Календари'
	];
	$args_taxonomy_calendars = [
		'labels' => $labels_taxonomy_calendars,
		'description' => 'args_taxonomy_cities',
		'public' => true,
		'publicly_queryable' => true,
		'show_ui' => true,
		'show_in_nav_menus' => true,
		'show_tagcloud' => true,
		'query_var' => true,
		'hierarchical' => true,
		'rewrite' => true
	];
	register_taxonomy('calendars', 'events', $args_taxonomy_calendars);

	// Регистрация таксономии "Города"
	$labels_taxonomy_cities = [
		'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' => 'Страны'
	];
	$args_taxonomy_cities = [
		'labels' => $labels_taxonomy_cities,
		'description' => 'args_taxonomy_cities',
		'public' => true,
		'publicly_queryable' => true,
		'show_ui' => true,
		'show_in_nav_menus' => true,
		'show_tagcloud' => true,
		'query_var' => true,
		'hierarchical' => true,
		'rewrite' => true
	];
	register_taxonomy('cities', 'events', $args_taxonomy_cities);
}

add_action('init', 'init_events_post_type');

А так же, частично работающее подключение шаблонов (в списка событий и одного события):

//// Шаблоны страниц через фильтр "template_include"
add_filter('template_include', 'my_template');
function my_template($template)
{
	# шаблон для страниц для выводо одиночного события произвольного типа "events"
	if (is_page('events')) {
		return get_stylesheet_directory() . '/calendar/events.php';
	}

	# шаблон для страниц для выводо одиночного события произвольного типа "events"
	global $post;
	if ($post->post_type == 'events') {
		return get_stylesheet_directory() . '/calendar/single-events.php';
	}

	# шаблон для страниц для выводо таксономий "Города"
	global $query_var;
	if (taxonomy_exists('cities') == true) {
		return get_template_directory() . '/calendar/taxonomy/cities.php';
	}

	# шаблон для страниц для выводо таксономий "Календари"
	if (taxonomy_exists('calendars') == true) {
		return get_template_directory() . '/calendar/taxonomy/calendars.php';
	}
	return $template;
}

Последние две проверки, пробовал по всякому и через is_category (как было в статье), is_tax, is_tem - все безрезультатно sad

Подскажите, что я делаю не так? Это основы и я понимаю, что если не пойму их буду делать полную хрень.

Заметки к вопросу:
Александр 4.6 лет назад

Забыл добавить, что в итоге у меня получилось.

• Подключение шаблона для списка событий - работает
• Подключение шаблона для одного события - работает
• Вывод шаблона для списка событий - не работает (при попытке перейти по любой из рубрик загружается single-eevnts.php, т.е. шаблон для отображения одного события).

0
Александр
4.6 лет назад
  • 1
    campusboy4742 www.youtube.com/c/wpplus

    Предполагаю, что так:

    add_filter( 'template_include', 'my_template' );
    function my_template( $template ) {
    	# шаблон для страниц для вывод одиночного события произвольного типа "events"
    	// или is_post_type_archive('events'), если бы сделал 'has_archive' => 'events'
    	if ( is_page( 'events' ) ) {
    		return get_stylesheet_directory() . '/calendar/events.php';
    	}
    
    	# шаблон для страниц для выводо одиночного события произвольного типа "events"
    	if ( is_singular( 'events' ) ) {
    		return get_stylesheet_directory() . '/calendar/single-events.php';
    	}
    
    	# шаблон для страниц для выводо таксономий "Города"
    	if ( is_tax( 'cities' ) ) {
    		return get_stylesheet_directory() . '/calendar/taxonomy/cities.php';
    	}
    
    	# шаблон для страниц для выводо таксономий "Календари"
    	if ( is_tax( 'calendars' ) ) {
    		return get_stylesheet_directory() . '/calendar/taxonomy/calendars.php';
    	}
    
    	return $template;
    }
    Александр 4.6 лет назад

    Спасибо, все работать стало корректно.

    campusboy 4.6 лет назад

    Ммм, скорее всего так:

    <?php echo esc_html( get_queried_object()->name ); ?>
    Александр 4.6 лет назад

    ой, увидели smile А то я удалил потом часть коммента, так как быстро нашел ответ. Тайтл term выводиться

    single_term_title();
    campusboy 4.6 лет назад

    Ну она внутри делает как раз то, что я написал smile

    Александр 4.6 лет назад

    понял, ещё раз спасибо smile

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