これは この質問/回答 の拡張です。その質問へのコメントは、プラグインからテンプレートをロードするときにはtemplate_include
がtemplate_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'));
そのため、 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に特別な名前のテンプレートファイルを持っているなら言う)。