Types de publication personnalisés et template_redirect


9

J'ai deux types de publication personnalisés (par exemple post_type_1 et post_type_2) que je voudrais rediriger vers des modèles indépendants (single-post_type_1.php et single-post_type_2.php) pour gérer leur affichage. Je ne veux pas mettre les modèles d'affichage dans le dossier de thème car je veux qu'ils soient autonomes dans leurs dossiers de plugins respectifs.

Comment puis-je demander à chacun d'entre eux d'enregistrer un hook template_redirect sans affecter l'autre? Ou devrais-je utiliser une technique différente?

Actuellement, je fais cela dans le 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;
        }

    }
}

Et cela dans le 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;
        }

    }
}

Une fois que j'ai enregistré le hook template_redirect du plugin 2, le plugin 1 ne fonctionne plus.

Suis-je en train de manquer quelque chose?

Quelle est la meilleure façon de procéder?

Réponses:


13

Vous devez utiliser le filtre template_include pour cela:

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_redirectest l'action appelée directement avant l'envoi des en-têtes pour la sortie du modèle rendu. C'est un crochet pratique pour faire des redirections 404, etc ... mais ne devrait pas être utilisé pour inclure d'autres chemins de modèles comme WordPress le fait de manière innée avec le filtre 'template_include'.

template_includeet les single_templatehooks traitent UNIQUEMENT le chemin du modèle utilisé pour le rendu du contenu. C'est le bon endroit pour ajuster un chemin de modèle.

Mise à jour du commentaire de @ChipBennett:

single_templatea été supprimé à partir du 3.4. Utilisez {posttype} _template à la place.


Donc, cela fonctionne, mais il s'avère que le template_redirect et le single_template fonctionnent aussi. Le vrai problème que j'ai déterminé était que j'avais une fonction de tri de colonne d'administration personnalisée qui se connecte au filtre `` demande '' et je ne limitais pas la modification de la variable $ vars uniquement lorsque le type de publication était d'un certain type. Mais, je suis heureux de connaître le hook template_include. Je ne sais toujours pas quelle est la différence entre template_redirect, template_include et single_template.
anderly

@anderly j'ai mis à jour ma réponse. J'espère que cela t'aides.
Brian Fegter

Alors qu'en est-il de single_template? Ce lien ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) indique qu'il peut être utilisé pour ajuster le modèle d'un article ou d'une page lorsque le modèle unique est appelé. Voilà ce que j'essaie de faire. Dans tous les cas, l'utilisation de filtres template_include ou single_template fonctionne et semble accomplir la même chose.
anderly

1
single_template fonctionne de la même manière, sauf qu'il est appelé conditionnellement. Cela permet d'isoler les changements de chemin au lieu d'utiliser un filtre à marteaux sur l'ensemble du site.
Brian Fegter

1
très cool ... je ne connaissais pas template_include
helgatheviking
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.