web-dev-qa-db-ja.com

プラグインでカスタムページテンプレートを作成しますか?

カスタムページテンプレートをプラグインから利用可能にすることは可能ですか?

52
jnthnclrk

get_page_template()page_templateフィルタで上書きできます。あなたのプラグインがそれらの中にファイルとしてテンプレートを含むディレクトリであるなら、それはこれらのファイルの名前を渡すことの問題です。それらを「オンザフライ」で作成したい場合(管理領域で編集してデータベースに保存しますか?)、それらをキャッシュディレクトリに書き込んで参照するか、または template_redirect にフックします。そして狂ったeval()ものをしなさい。

ある基準が当てはまる場合に、同じプラグインディレクトリ内のファイルに「リダイレクト」するプラグインの簡単な例:

add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'my-custom-page-slug' ) ) {
        $page_template = dirname( __FILE__ ) . '/custom-page-template.php';
    }
    return $page_template;
}
70
Jan Fabry

get_page_template()をオーバーライドすることは簡単なハックです。管理画面からテンプレートを選択することはできません。また、ページスラッグはプラグインにハードコードされているため、ユーザーはテンプレートの出所を知ることができません。

推奨される解決策 に従うことです - このチュートリアル あなたはプラグインからバックエンドにページテンプレートを登録することができます。その後、他のテンプレートと同じように機能します。

 /*
 * Initializes the plugin by setting filters and administration functions.
 */
private function __construct() {
        $this->templates = array();

        // Add a filter to the attributes metabox to inject template into the cache.
        add_filter('page_attributes_dropdown_pages_args',
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the save post to inject out template into the page cache
        add_filter('wp_insert_post_data', 
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the template include to determine if the page has our 
        // template assigned and return it's path
        add_filter('template_include', 
            array( $this, 'view_project_template') 
        );

        // Add your templates to this array.
        $this->templates = array(
                'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
        );
}
15
fireydude

はい、可能です。私はこの サンプルプラグインを見つけました とても役に立ちました。

私の頭に浮かぶもう一つのアプローチはテーマにテンプレートファイルを作成するために WP Filesystem API を使うことです。それが最善のアプローチであるかどうかはわかりませんが、うまくいくと確信しています。

5
KeepMove