Tipuri de postări personalizate și template_redirect

2 mar. 2012, 18:32:12
Vizualizări: 25.8K
Voturi: 12

Am două tipuri de postări personalizate (de exemplu post_type_1 și post_type_2) pe care aș dori să le redirecționez către șabloane independente (single-post_type_1.php și single-post_type_2.php) pentru a gestiona afișarea lor. Nu vreau să pun șabloanele de afișare în folderul temei deoarece vreau să fie autonome în folderele lor respective de plugin.

Cum pot face ca fiecare dintre ele să înregistreze un hook template_redirect fără a afecta celălalt? Sau ar trebui să folosesc o tehnică diferită?

În prezent, fac acest lucru în Plugin 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;
        }

    }
}

Și acest lucru în Plugin 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;
        }

    }
}

Odată ce înregistrez hook-ul template_redirect al plugin-ului 2, cel al plugin-ului 1 nu mai funcționează.

Am ratat ceva?

Care este cea mai bună modalitate de a face acest lucru?

0
Toate răspunsurile la întrebare 1
12
16

Ar trebui să folosești filtrul template_include pentru asta:

add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
    global $wp_query;
    //Aici poți face procesarea și să definești $template ca fiind calea completă către șablonul alternativ.
    return $template;
}

template_redirect este acțiunea apelată direct înainte de trimiterea headerelor pentru afișarea șablonului randat. Este un hook convenabil pentru redirecționări 404, etc... dar nu ar trebui folosit pentru includerea altor căi de șabloane, deoarece WordPress face asta în mod nativ cu filtrul 'template_include'.

Hook-urile template_include și single_template se ocupă DOAR de calea șablonului folosit pentru randarea conținutului. Acesta este locul potrivit pentru a ajusta calea unui șablon.

Actualizare din comentariul lui @ChipBennett:

single_template a fost eliminat începând cu versiunea 3.4. Folosește {posttype}_template în schimb.

2 mar. 2012 18:58:18
Comentarii

Deci, asta funcționează, dar se pare că template_redirect și single_template funcționează și ele. Problema reală pe care am identificat-o a fost că am o funcție personalizată de sortare a coloanelor din admin care se conectează la filtrul 'request' și nu am limitat modificarea variabilei $vars doar pentru cazurile în care tipul de postare era de un anumit tip. Dar, mă bucur să știu despre hook-ul template_include. Totuși, încă nu sunt sigur care este diferența dintre template_redirect, template_include și single_template.

anderly anderly
2 mar. 2012 19:24:25

@anderly Am actualizat răspunsul meu. Sper că te ajută.

Brian Fegter Brian Fegter
2 mar. 2012 19:36:34

Deci, cum rămâne cu single_template? Acest link (http://codex.wordpress.org/Plugin_API/Filter_Reference/single_template) spune că poate fi folosit pentru a ajusta template-ul pentru un post sau pagină când este apelat template-ul single. Asta încerc să fac. În orice caz, folosind fie filtrul template_include, fie single_template funcționează și par să realizeze același lucru.

anderly anderly
2 mar. 2012 19:39:24

single_template funcționează la fel, cu excepția faptului că este apelat condiționat. Acest lucru ajută la izolarea modificărilor de cale în loc să folosești un filtru prea general pe întreg site-ul.

Brian Fegter Brian Fegter
2 mar. 2012 19:42:14

Super, mulțumesc pentru ajutor. Deci, se pare că single_template este mai specific (domeniu de aplicare mai restrâns) decât template_include?

anderly anderly
2 mar. 2012 19:53:17

Corect. :)

Brian Fegter Brian Fegter
2 mar. 2012 20:22:59

Acest răspuns ți-a rezolvat întrebarea?

Brian Fegter Brian Fegter
2 mar. 2012 21:27:11

foarte tare... nu știam despre template_include

helgatheviking helgatheviking
2 mar. 2012 22:39:22

Da, ai răspuns (+1). Mulțumesc din nou!

anderly anderly
3 mar. 2012 06:42:30

Asigurați-vă că marcați răspunsul ca fiind corect, astfel încât și alții să știe ce a rezolvat problema. :)

Brian Fegter Brian Fegter
3 mar. 2012 06:43:23

Greșeala mea, credeam că am făcut deja asta. Tocmai l-am marcat ca răspuns corect. :)

anderly anderly
3 mar. 2012 21:55:42

Pentru informare, single_template a fost eliminat începând cu versiunea 3.4. Folosiți {posttype}_template în loc.

Chip Bennett Chip Bennett
2 ian. 2013 20:43:01
Arată celelalte 7 comentarii