Custom Post Types e template_redirect

2 mar 2012, 18:32:12
Visualizzazioni: 25.8K
Voti: 12

Ho due custom post types (ad esempio post_type_1 e post_type_2) che vorrei reindirizzare a template indipendenti (single-post_type_1.php e single-post_type_2.php) per gestire la loro visualizzazione. Non voglio mettere i template di visualizzazione nella cartella del tema poiché desidero che siano autonomi nelle rispettive cartelle dei plugin.

Come posso fare in modo che ciascuno di essi registri un hook template_redirect senza influenzare l'altro? O dovrei utilizzare una tecnica diversa?

Attualmente, sto facendo questo nel 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;
        }

    }
}

E questo nel 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;
        }

    }
}

Una volta che registro l'hook template_redirect del plugin 2, quello del plugin 1 non funziona più.

Mi sta sfuggendo qualcosa?

Qual è il modo migliore per farlo?

0
Tutte le risposte alla domanda 1
12
16

Dovresti utilizzare il filtro template_include per questo:

add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
    global $wp_query;
    //Fai qui il tuo processing e definisci $template come il percorso completo al tuo template alternativo.
    return $template;
}

template_redirect è l'azione chiamata direttamente prima che gli header vengano inviati per l'output del template renderizzato. È un hook comodo per fare redirect 404, ecc... ma non dovrebbe essere usato per includere altri percorsi di template poiché WordPress fa questo in modo nativo con il filtro 'template_include'.

Gli hook template_include e single_template gestiscono SOLAMENTE il percorso del template usato per il rendering del contenuto. Questo è il posto corretto per modificare un percorso di template.

Aggiornamento dal commento di @ChipBennett:

single_template è stato rimosso a partire dalla versione 3.4. Usa {posttype}_template invece.

2 mar 2012 18:58:18
Commenti

Quindi, questo funziona, ma si scopre che anche template_redirect e single_template funzionano. Il vero problema che ho identificato era che ho una funzione personalizzata per l'ordinamento delle colonne di amministrazione che si aggancia al filtro 'request' e non stavo limitando la modifica della variabile $vars solo quando il post type era di un certo tipo. Comunque, sono contento di aver scoperto l'hook template_include. Ancora non sono sicuro della differenza tra template_redirect, template_include e single_template però.

anderly anderly
2 mar 2012 19:24:25

@anderly Ho aggiornato la mia risposta. Spero che sia d'aiuto.

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

Quindi, che dire di single_template? Questo link (http://codex.wordpress.org/Plugin_API/Filter_Reference/single_template) dice che può essere utilizzato per modificare il template per un post o una pagina quando viene chiamato il single template. Questo è quello che sto cercando di fare. In ogni caso, utilizzare sia il filtro template_include che single_template funziona e sembra ottenere lo stesso risultato.

anderly anderly
2 mar 2012 19:39:24

single_template funziona allo stesso modo, ma viene chiamato in modo condizionale. Questo aiuta a isolare i cambiamenti di percorso invece di utilizzare un filtro "a martello" su tutto il sito.

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

Fantastico, grazie per il tuo aiuto. Quindi, sembra che single_template sia più specifico (scope ristretto) rispetto a template_include?

anderly anderly
2 mar 2012 19:53:17

Esatto. :)

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

Questa risposta ha risolto il tuo dubbio?

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

molto interessante... non conoscevo template_include

helgatheviking helgatheviking
2 mar 2012 22:39:22

Sì, hai risposto perfettamente (+1). Grazie ancora!

anderly anderly
3 mar 2012 06:42:30

Assicurati di contrassegnare la risposta come corretta in modo che gli altri sappiano cosa ha risolto il tuo problema. :)

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

Colpa mia, pensavo di averlo già fatto. L'ho appena contrassegnata come risposta corretta. :)

anderly anderly
3 mar 2012 21:55:42

Per tua informazione, single_template è stato rimosso dalla versione 3.4. Usa invece {posttype}_template.

Chip Bennett Chip Bennett
2 gen 2013 20:43:01
Mostra i restanti 7 commenti