Спеціальні типи публікацій та 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.


Таким чином, це працює, але виявляється, що і шаблон_посередку та single_template також працює. Справжньою проблемою, яку я визначив, було те, що у мене є власна функція сортування стовпців адміністратора, яка залучається у фільтр "запит", і я не обмежував модифікацію змінної $ vars лише тоді, коли тип повідомлення був певного типу. Але я радий дізнатися про гачок template_include. Досі не впевнений, в чому різниця між template_redirect, template_include та single_template, хоча.
anderly

@anderly я оновив свою відповідь. Сподіваюсь, це допомагає.
Брайан Фегтер

Отже, як щодо 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.