Tipi di post personalizzati e template_redirect


9

Ho due tipi di post personalizzati (ad esempio post_type_1 e post_type_2) che vorrei reindirizzare a modelli indipendenti (single-post_type_1.php e single-post_type_2.php) per gestirne la visualizzazione. Non voglio mettere i modelli di visualizzazione nella cartella dei temi perché li voglio autonomi nelle rispettive cartelle dei plugin.

Come posso fare in modo che ognuno di essi registri un hook template_redirect senza influire sull'altro? O dovrei usare una tecnica diversa?

Attualmente, lo sto facendo 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 registrato l'hook template_redirect del plugin 2, il plugin 1 non funziona più.

Mi sto perdendo qualcosa?

Qual è il modo migliore per farlo?

Risposte:


13

Dovresti usare 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;
    //Do your processing here and define $template as the full path to your alt template.
    return $template;
}

template_redirectè l'azione chiamata direttamente prima che le intestazioni vengano inviate per l'output del modello renderizzato. È un comodo gancio per fare reindirizzamenti 404, ecc ... ma non dovrebbe essere usato per includere altri percorsi di modelli poiché WordPress lo fa in modo innato con il filtro 'template_include'.

template_includee gli single_templatehook si occupano SOLO del percorso del modello utilizzato per il rendering del contenuto. Questo è il posto giusto per regolare un percorso modello.

Aggiornamento dal commento di @ChipBennett:

single_templateè stato rimosso dal 3.4. Utilizzare invece {posttype} _template.


Quindi, funziona, ma risulta che funzionano anche template_redirect e single_template. Il vero problema che ho determinato è che ho una funzione di ordinamento delle colonne dell'amministratore personalizzata che si aggancia al filtro 'request' e non ho limitato la modifica della variabile $ vars solo quando il tipo di post era di un certo tipo. Ma sono felice di sapere dell'hook template_include. Non sono ancora sicuro di quale sia la differenza tra template_redirect, template_include e single_template.
Anderly

@anderly ho aggiornato la mia risposta. Spero che sia di aiuto.
Brian Fegter

Quindi, per quanto riguarda single_template? Questo link ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) dice che può essere usato per regolare il modello per un post o una pagina quando viene chiamato il modello singolo. Questo è quello che sto cercando di fare. In ogni caso, l'utilizzo dei filtri template_include o single_template funziona e sembra realizzare la stessa cosa.
Anderly

1
single_template funziona allo stesso modo tranne che è chiamato in modo condizionale. Questo aiuta a isolare i cambi di percorso invece di utilizzare un filtro a martello su tutto il sito.
Brian Fegter,

1
molto bello ... non sapevo di template_include
helgatheviking
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.