web-dev-qa-db-ja.com

アクティブテーマから独立したプラグイン内でカスタム投稿タイプのテンプレートを定義することは可能ですか?

私はオープンソースプロジェクトに関するデータを管理するためのプラグインを書いています。私はオブジェクトモデルを開発し、すべてのカスタム投稿タイプと分類法をうまく作成し、そしてMembersプラグインを使って正しい機能/役割を実装しました。適切なユーザーは自分の投稿を作成、変更、削除できます。管理者は自分の投稿を承認し、他のユーザーの投稿を変更および削除できます。

私の問題は、私が単一のプロジェクトとプロジェクトのリスト(単一でアーカイブ、私はこのレベルではWordpressで働いたことがないと思う)のテンプレートを定義したいということです。現在のテーマで、単一のプロジェクトまたはプロジェクトのリストのページをレンダリングします。 TwentyTenテーマを使用している場合は、これらのカスタム投稿タイプに自分のプラグインのテンプレートを使用する必要があります。 TwentyElevenテーマを使用している場合でも、これらのカスタム投稿タイプに自分のプラグインのテンプレートを使用したいと思います。

私はこれが「うまくいく」パラダイムに従うようにしたいのですが、今のところユーザーは単にプラグインディレクトリにフォルダをドロップすることはできません - テーマを切り替えるたびに適切なファイルをテーマフォルダに追加する必要があります。テンプレートの階層をチェックアウトし、ファイル名が正しいことを確認しましたが、それらがpluginフォルダーまたはplugin/templatesフォルダーにある場合、それらはWordpressでは使用されません。

ありがとうございます。

7
ZachM

あなたはtemplate_includeフィルタを使う必要があります。これはすべてのテンプレート包含のための一般的なフィルタです。

add_filter( 'template_include', 'my_plugin_templates' );
function my_plugin_templates( $template ) {
    $post_types = array( 'project' );

    if ( is_post_type_archive( $post_types ) && ! file_exists( get_stylesheet_directory() . '/archive-project.php' ) )
        $template = 'path/to/list/template/in/plugin/folder.php';
    if ( is_singular( $post_types ) && ! file_exists( get_stylesheet_directory() . '/single-project.php' ) )
        $template = 'path/to/singular/template/in/plugin/folder.php';

    return $template;
}

私は完全にポストタイプアーカイブビットをテストしていません、あなたはそれが関連するカスタム分類アーカイブで動作するようにするためにis_tax( $taxonomies )を使ったチェックを含める必要があるかもしれません。

6
sanchothefat