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


9

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

Я что-то пропустил?

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

Ответы:


13

Вы должны использовать фильтр 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.


Итак, это работает, но оказывается, что template_redirect и single_template тоже работают. Реальная проблема, которую я определил, заключалась в том, что у меня есть пользовательская функция сортировки столбцов администратора, которая подключается к фильтру 'request', и я не ограничивал изменение переменной $ vars только тогда, когда тип записи был определенного типа. Но я рад узнать о хуке template_include. Все еще не уверен, в чем разница между template_redirect, template_include и single_template, хотя.
anderly

@andly я обновил свой ответ. Надеюсь это поможет.
Брайан Фегтер

Итак, что насчет single_template? Эта ссылка ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) говорит, что его можно использовать для настройки шаблона для сообщения или страницы при вызове одного шаблона. Это то, что я пытаюсь сделать. В любом случае, использование фильтров template_include или single_template работает и, по-видимому, выполняет то же самое.
anderly

1
single_template работает так же, за исключением того, что он вызывается условно. Это помогает изолировать изменения пути вместо использования молоткового фильтра на всем участке.
Брайан Фегтер

1
очень круто ... я не знал о template_include
helgatheviking
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.