web-dev-qa-db-ja.com

カスタム投稿タイププラグイン:テンプレートはどこに置くのですか?

私はカスタムポストタイプのプラグインを書いています。その一部は私がショートコードでテンプレートに出力しています。しかし、他の部分ではカスタムの投稿テンプレートが必要で、CPTのテンプレート階層を使用する方法を考え出しました。しかし、カスタムテンプレートはテーマの中にあり、少なくとも最初からプラグインは自己完結型であるべきだと思います。

それでは、ここでベストプラクティスは何ですか? CPTプラグインにテンプレートファイルを含めるにはどうすればいいですか?これがどのように行われるかの特に良い例を私に指摘してもらえますか?

ご協力いただきありがとうございます。

11

それでは、ここでベストプラクティスは何ですか?

テーマにそれを処理させることとあなたのプラグインでデフォルトを提供することの組み合わせを言うでしょう。

single_templateフィルタを使用してテンプレートを切り替えることができます。コールバックで、テーマが投稿タイプのテンプレートを提供しているかどうかを確認します。提供されている場合は、何もしません。

<?php
add_filter('single_template', 'wpse96660_single_template');
function wpse96660_single_template($template)
{
    if ('your_post_type' == get_post_type(get_queried_object_id()) && !$template) {
        // if you're here, you're on a singlar page for your costum post 
        // type and WP did NOT locate a template, use your own.
        $template = dirname(__FILE__) . '/path/to/fallback/template.php';
    }
    return $template;
}

私はこの方法が一番好きです。あなたの投稿タイプに付随するあらゆるカスタムデータをサポートする "テンプレートタグ"(例:the_contentthe_title)の健全なセットを提供することとそれを組み合わせて、あなたはエンドユーザーにいくつかの健全なデフォルトと共に多くのカスタマイズ力を与えます。 Bbpressはこの種のことを非常にうまく行っています。ユーザーテンプレートが見つかった場合はそれを含め、多数のテンプレートタグを提供します。

あるいは、the_contentフィルタを付けてコールバックを使用して、コンテンツ自体の内容を変更することもできます。

<?php
add_filter('the_content', 'wpse96660_the_content');

function wpse96660_the_content($content)
{
    if (is_singular('your_post_type') && in_the_loop()) {
        // change stuff
        $content .= '<p>here we are on my custom post type</p>';
    }

    return $content;
}
8
chrisguitarguy

リクエストがあなたの投稿タイプに対するものである場合は、template_includeにフックしてプラグインファイルを返すことができます。

add_filter( 'template_include', 'insert_my_template' );

function insert_my_template( $template )
{
    if ( 'my_post_type' === get_post_type() )
        return dirname( __FILE__ ) . '/template.php';

    return $template;
}

しかしこれは外観を劇的に変えるでしょう。まだきれいな解決策はありません。

3
fuxia