web-dev-qa-db-ja.com

テーマが上書きできるデフォルトのカスタム投稿テンプレートを作成する

カスタム投稿タイプを追加する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'));
4
saalon

WPがこれに使用するルーチンを見てみるとよいでしょう: locate_template() 。これはwp-includes/theme.php内にあり、そのファイル内の多数の関数から呼び出されます。これらの関数は、現在のページに基づいて正しいtypeのテンプレートを選択し、次にテーマ階層を上って一致するものを探すためにwp-includes/template-loader.phpによって使用されます。

4
Peter Rowell

たくさんのテンプレート関連フィルタもあります (スクロールダウン)テンプレートリクエストを 'ハイジャック'して自分のロジックを適用することができます

これはsingle-saalon_events.phparchive-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

お役に立てれば!

4
Michal Mau

ベストプラクティスかどうかはわかりませんが、同様の問題が発生したときに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');
}
1
Bainternet