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


У меня есть два пользовательских типа сообщений (например, 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 больше не работает.

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

Как лучше всего это сделать?

Author: anderly, 2012-03-02

1 answers

Для этого следует использовать фильтр 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.

 13
Author: Brian Fegter, 2013-01-02 19:22:33