カスタム投稿タイプを追加するWordpressプラグインを作成している最中です。そのために、デフォルトのテンプレートを表示します。基本的に、これはイベント管理プラグインで、カスタム投稿タイプはイベント用です。いくつかのカスタムメタフィールドと子の投稿タイプ(Performance)があるので、それらを表示するためのデフォルトのテンプレートがなければ、それを使用することはかなり不愉快です。ただし、必要に応じて、テーマデザイナーがこれらの投稿タイプ用の独自のテンプレートを作成できるようにしたいと思います。
テーマが独自のテンプレートを提供していない限り、私のプラグインで提供されているテンプレートを使用する方法はありますか?そのためのベストプラクティスは何ですか?
編集:
Peter Rowellのアドバイスに従って、template_redirectアクションをキャッチしました。投稿タイプが私のもので、そのためのテンプレートが現在のテーマに存在しない場合は、デフォルトでプラグインのテンプレートが使用されます。
class FestivityTemplates {
public static function determineTemplate(){
global $post;
$standard_type = strpos($post->post_type, 'fest_');
if(is_single() && $standard_type !== false) {
FestivityTemplates::loadSingleTemplate($post);
}
}
private static function loadSingleTemplate($post) {
$template_name = 'single-'.$post->post_type.'.php';
$template = locate_template(array($template_name), true);
if(empty($template)) {
include(WP_PLUGIN_DIR . '/Festivity/lib/templates/' . $template_name);
exit();
}
}
}
add_action('template_redirect', array('FestivityTemplates', 'determineTemplate'));
WPがこれに使用するルーチンを見てみるとよいでしょう: locate_template()
。これはwp-includes/theme.php
内にあり、そのファイル内の多数の関数から呼び出されます。これらの関数は、現在のページに基づいて正しいtypeのテンプレートを選択し、次にテーマ階層を上って一致するものを探すためにwp-includes/template-loader.php
によって使用されます。
たくさんのテンプレート関連フィルタもあります (スクロールダウン)テンプレートリクエストを 'ハイジャック'して自分のロジックを適用することができます。
これはsingle-saalon_events.php
とarchive-saalon_events.php
の呼び出しをハイジャックして、代わりに/your-plugin/templates/
フォルダのファイルを使用する方法の例です。
# Template for displaying a single event
add_filter( 'single_template', 'saalon_events_single_template') ) ;
function saalon_events_single_template($single_template) {
global $post;
if ($post->post_type == 'saalon_events')
$single_template = dirname( __FILE__ ) . '/templates/saalon_events_single.php';
return $single_template;
}
# Template for displaying the events archive
add_filter( 'archive_template', 'saalon_events_archive_template') ) ;
function saalon_events_archive_template($archive_template) {
if ( is_post_type_archive('saalon_events') ) // since 3.1
$archive_template = dirname( __FILE__ ) . '/templates/saalon_events_archive.php';
return $archive_template;
}
リソース:
http://codex.wordpress.org/Plugin_API/Filter_Reference#Template_Filtershttp://codex.wordpress.org/Plugin_API/Filter_Reference/_single_template
ああ、template_redirect
アクションもよさそうだ! http://codex.wordpress.org/Plugin_API/Action_Reference#Template_Actions
お役に立てれば!
ベストプラクティスかどうかはわかりませんが、同様の問題が発生したときにthe_contentフックを使用して投稿タイプをチェックし、そのカスタムタイプが正しいかどうかを確認したので、必要なものだけを返しました。例えば:
add_filter('the_content','events_conetnt_display');
function events_conetnt_display($content){
global $post;
if (!$post_type == "events"){
return $content;
}else{
remove_filter( 'the_content', 'events_conetnt_display' );
$events_meta = get_post_custom($post->ID);
$new_content = '<div class="event_container">';
$new_content .= '<div class="event_title">'.get_the_title($post->ID).'</div>';
$new_content .= '<div class="event_description">'.apply_filters('the_content',get_the_content()).'</div>';
$new_content .= '<div class="event_start_date">'.$events_meta['start_date'].'</div>';
$new_content .= '<div class="event_end_date">'.$events_meta['start_end'].'</div>';
//...
//whatever
//...
add_filter('the_content','events_conetnt_display');
return $new_content;
}
}
私のプラグインには、彼がthe_content Hookを使用したいのか、それとも以下のようなカスタムテンプレートを持っているのかをユーザーに決定させるオプションがありました。
if (get_option('use_content_template')){
add_filter('the_content','events_conetnt_display');
}