Intereting Posts
WordPress Двадцать двенадцать детских тем. Удаление виджетированных областей по умолчанию Как заставить администратора WP распознать только что созданную дочернюю тему? Страница автора – Список категорий плюс количество должностей в этой категории Пользовательская таксономия WP_Query для всех условий в таксономии? Глобальные функции на WPMU Загружать классы, используя spl_autoload_register Как интернационализировать WordPress – извлекать строки с текстовыми доменами, для каждого текстового поля отдельно Изменить URL для блога? Запросить все сообщения, где мета-ключ не существует Показать домашнюю страницу (только) Счетчик посещений Меню исчезает с помощью специальной ссылки типа сообщения Запретить запуск темы отображение виджета на флажке Ошибки SSL при активации моей настраиваемой темы Запрос сообщений с нескольких сайтов в сети?

Пользовательские типы сообщений и template_redirect

У меня есть два пользовательских типа сообщений (например, post_type_1 и post_type_2), которые я хотел бы перенаправить на независимые шаблоны (single-post_type_1.php и single-post_type_2.php) для обработки их отображения. Я не хочу помещать шаблоны отображения в папку темы, поскольку я хочу, чтобы они были автономными в своих соответствующих папках плагинов.

Как я могу, чтобы каждый из них регистрировал крючок template_redirect, не затрагивая другого? Или я должен использовать другую технику?

В настоящее время я делаю это в Плагине 1:

add_action( 'template_redirect', 'template_redirect_1' ); function template_redirect_1() { global $wp_query; global $wp; if ( $wp_query->query_vars['post_type'] === 'post_type_1' ) { if ( have_posts() ) { include( PATH_TO_PLUGIN_1 . '/views/single-post_type_1.php' ); die(); } else { $wp_query->is_404 = true; } } } 

И это в Плагине 2:

 add_action( 'template_redirect', 'template_redirect_2' ); function template_redirect_2() { global $wp_query; global $wp; if ( $wp_query->query_vars['post_type'] === 'post_type_2' ) { if ( have_posts() ) { include( PATH_TO_PLUGIN_2 . '/views/single-post_type_2.php' ); die(); } else { $wp_query->is_404 = true; } } } 

Как только я зарегистрирую плагин template_redirect плагина 2, плагин 1 больше не работает.

Я что-то упускаю?

Каков наилучший способ сделать это?

Для этого вы должны использовать фильтр template_include:

 add_filter('template_include', 'wpse_44239_template_include', 1, 1); function wpse_44239_template_include($template){ global $wp_query; //Do your processing here and define $template as the full path to your alt template. return $template; } 

template_redirect – это действие, вызываемое непосредственно перед отправкой заголовков для вывода обработанного шаблона. Это удобный крючок для 404 переадресаций и т. Д., Но он не должен использоваться для включения других шаблонов шаблонов, поскольку WordPress делает это врожденно с помощью фильтра «template_include».

template_include и single_template ТОЛЬКО путь к шаблону, используемому для рендеринга содержимого. Это подходящее место для настройки пути к шаблону.

Обновление от комментария @ChipBennett:

single_template удален с 3.4. Вместо этого используйте {posttype} _template.