web-dev-qa-db-fra.com

template_include (remplacement des modèles de plugin par défaut via le thème actuel)

Ceci est une extension de cette question/réponse . Un commentaire sur cette question fait référence à template_include préféré à template_redirect lors du chargement de modèles à partir d'un plug-in.

Cependant, suspendre ceci à template_include, c'est tout casser sur le site (toute autre vue de page), à ​​l'exception des dispositions qui utilisent le remplacement de la disposition http://Pastebin.com/LWpSrfim placé dans la substitution de répertoire de thème) - la vue unique standard, par exemple, est toujours affichée en dessous.


Edit: code source

<?php
class moulding_templates {
    public static function determine_template(){
        global $post,$wp_query;

        // custom post types
        $post_type_array = array('moulding_profiles','moulding_combination','moulding_collection','idea_gallery');
        foreach ($post_type_array as $post_type_single) {
            global $post;
            if (is_singular($post_type_single)) {
                moulding_templates::loadSingleTemplate($post);
            }
        }
        // custom taxonomies
        $taxonomy_array = array('profile_categories','combination_categories','wood_types');
        foreach ($taxonomy_array as $taxonomy_single) {
            if (is_tax($taxonomy_single)) {
                moulding_templates::loadTaxonomyTemplate($taxonomy_single);
            }
        }
    }

    private static function loadSingleTemplate($post) {
        $template_name = 'moulding-templates/single-'.$post->post_type.'.php';
        $template = locate_template(array($template_name), true);
        if(empty($template)) {
            include(MOULDINGS_BASE_DIR . 'includes/' . $template_name);
            exit();
        }
    }
    private static function loadTaxonomyTemplate($taxonomy) {
        $template_name = 'moulding-templates/taxonomy-'.$taxonomy.'.php';
        $template = locate_template(array($template_name), true);
        if(empty($template)) {
            include(MOULDINGS_BASE_DIR . 'includes/' . $template_name);
            exit();
        }
    }
}
add_action('template_include', array('moulding_templates', 'determine_template'));
6
Zach

Ainsi, le template_redirect est utilisé pour des tâches telles que la canonisation, les flux, etc. Si vous souhaitez modifier le modèle servi, il est préférable d'utiliser template_include .

Contrairement à template_redirect, template_include est un filter qui filtre le chemin de la page de modèle. Cela signifie que vous ne chargez/n'incluez pas le modèle, mais retournez simplement le chemin du modèle. WordPress fait une inclusion directe sur tout ce qui est retourné.

En plus d'être le crochet approprié, cela permet de décrocher la fonction ou de la surcharger - ce qui devrait être le cas si elle devait être distribuée un jour.

Question connexe: Taxonomie personnalisée dans le plug-in et le modèle

Exemple de cette action (GitHub Repro): https://github.com/stephenh1988/Event-Organiser/blob/master/includes/event-organiser-templates.php

Exemple d'utilisation:

 function wpse51038_maybe_alter_template($template){

    // is a specific custom taxonomy being shown?
    $taxonomy_array = array('profile_categories','combination_categories','wood_types');
    foreach ($taxonomy_array as $taxonomy_single) {
        if ( is_tax($taxonomy_single) ) {
            //For plugins. You may want to check this template exists before over-riding
            $template = plugin_dir_path('path/to/my/tax-template.php', __FILE__ );
            break;
        }
    }

  return $template;

 }
 add_filter('template_include','wpse51038_maybe_alter_template');

Vous voudrez peut-être examiner la question connexe liée à la question ci-dessus - cela montre comment permettre au thème de remplacer le plug-in (par exemple, s'ils ont un fichier de modèle nommé en particulier dans leur thème/thème-enfant).

10
Stephen Harris