web-dev-qa-db-ja.com

template_include(現在のテーマでデフォルトのプラグインテンプレートを上書きする)

これは この質問/回答 の拡張です。その質問へのコメントは、プラグインからテンプレートをロードするときにはtemplate_includetemplate_redirectよりも望ましいことを示しています。

ただし、これをtemplate_includeにぶら下げると、レイアウトオーバーライド http://Pastebin.com/LWpSrfim を使用するレイアウトを除いて、サイト上のすべてのページビュー(その他のページビュー)が壊れてしまいます。テーマディレクトリに上書き(オーバーライド) - たとえば、標準の単一ビューはまだ以下に出力されます。


編集:ソースコード

<?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

そのため、 template_redirect は、正規化、フィードなどの目的で使用されます。提供されているテンプレートを変更する場合は、 template_include をお勧めします。

template_redirectとは異なり、template_includeはテンプレートページのパスをフィルタリングする filter です。つまり、テンプレートをロード/インクルードするのではなく、単にtemplate pathを返すだけです。 WordPressは返されたものすべてに対して直接的なインクルードを行います。

適切なフックであることとは別に、それは関数がフックされていないかオーバーライドされることを可能にします - それが今までに分配されるならばあるべきです。

関連質問: プラグインとテンプレートのカスタム分類法

この動作例(GitHub Repro): https://github.com/stephenh1988/Event-Organiser/blob/master/includes/event-organiser-templates.php

使用例

 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');

あなたは上記に関連した関連する質問を見たいと思うかもしれません - これはテーマがプラグインを上書きできるようにする方法を示しています(彼らが彼らのtheme/child-themeに特別な名前のテンプレートファイルを持っているなら言う)。

10
Stephen Harris