( "Page Template"とは、 "Template Name"ヘッダ を持つテーマファイルで、管理ページの "Template"ドロップダウンフィールドで選択できます。)
複数のインスタンスで、私はthe_contentやpre_get_posts、あるいはそれに似たものにフックすることによって達成されたかもしれないページテンプレートを構築しました。テーマファイル自体を作成せずに、選択可能なテーマテンプレートをfunctions.php
またはプラグインに「登録」する方法があるかどうか疑問に思います。
私がこれをしたい理由は:
私の場合は、カスタムメタボックスやショートコードを使用して(そうでなければテンプレートに保持されているコンテンツを挿入する)、いくつかの回避策を考えることができます。私もこれを行うことができるかもしれません(私はちょうど考えたがまだテストしていません):
/*
Template Name: My Template
*/
get_template_part( 'page' );
しかし、結局、私はこの考えに戻り続けているので、誰かがそれを行う方法を知っているかどうか私は興味があります。あなたがそれが恐ろしい考えであると思うならば、私はその意見にも興味があります。
=======
更新:私はそれを追加する必要があります:
$templates
配列があることを私は知っています。これは基本的に私がやりたいことの反対をしています。_wp_page_template
があることを私は知っています。テンプレート配列とカスタムフィールドがどのように連携して機能するのかを理解する必要があると思います(そして、隠されたカスタムメタフィールドがどのように機能するかについてもあいまいです)。
=======
UPDATE II:10/8/12この質問がされて以来、テーマのバックエンドは大幅に作り直され、上記の$ templates配列はもう存在しません。
私はまだこの種のことをしたいという願望に遭遇し、私がOPで提案した2つの理由で好む次の解決策を決心しました:
カスタムマークアップが不要な場合は、テンプレートファイル全体がここにあります。 /wp-content/themes/my-theme/templates/my-template.php
にあるとしましょう
<?php
/**
* Template Name: My Template
*/
get_template_part( 'page' );
これで、あらゆることを行うための2つの「フック」が得られます。
.page-template-my-template
のボディクラス。if( is_page_template( 'templates/my-template.php' ) ) {...
を使う能力#1を使用してレイアウト、色などを変更し、#2を使用してthe_content()
のフィルタリング、post_class
esの追加、ACFを使用したカスタムフィールドの設定などを行いました。時々私はサイドバーをまだ必要とする全角テンプレートのようなもののためにそれらを組み合わせて使用します。それは非常に強力でありながら、非常に簡単に設定でき、自分で設定しなかったかどうかを理解するのに非常に簡単です。
これはまだテーマに限定されています(あなたはプラグインでそれを行うことができませんでした)、しかし私の質問の目的のために、これは私にとって良い答えでした。
ページは一般的にかなり柔軟性がないと言っている、あなたはカスタム投稿タイプを使うことをお勧めします。また、実際のページテンプレートのドロップダウンにフックすることは非常に問題が多いでしょう(私はそれが深刻なハッキングなしでうまくいくとは思わない)。あなた自身のメタボックスドロップダウンを書くだけの方が得策です。
get_template_part
であなたは正しい方向に進んでいると思います。それは簡単で、柔軟で、そして複雑な出力を構造化するのを本当に助けます、そして両方のパラメータを使うことは助けます。大量のコードをテンプレートにコピーして貼り付けてから、あらゆる種類の機能を作成する方がはるかに簡単です。また、他の人やコードを見直すときにはもっと理にかなっています。
もう1つの選択肢は、template_redirect
アクションを使用した、機能レベルの似たような人です。
独自のテンプレートをロードするメタ選択に基づいた機能を持つことができます。実際には、それをget_template_part
と組み合わせることができると思います。以下のコードはテストされていません。
何かのようなもの:
function my_special_template() {
//page "contact" for example, make this your meta dropdown selection
if (is_page('Contact')){
get_template_part( 'special-chunk' ); //file named special-chunk.php
}
}
add_action('template_redirect', 'my_special_template');
一日の終わりには、まだあなたはまだある種の.phpファイルをつかんでいます。
このようなtheme_page_templates
フィルタを使用して、ファイルレステンプレートを登録するつもりかどうかと思います。
/**
* Add a file-less page template to the page template dropdown
*/
add_filter( 'theme_page_templates', function( $page_templates, $wp_theme, $post )
{
// Edit this to your needs
$fileless_theme_slug = 'my_fileless_page_template';
$fileless_theme_label = esc_html__( 'My File-Less Page Template', 'my-domain' );
// Append if it doesn't already exists
if( ! isset( $page_templates[$fileless_theme_slug] ) )
$page_templates[$fileless_theme_slug] = $fileless_theme_label ;
return $page_templates;
}, PHP_INT_MAX, 3 );
バックエンドにこのように表示されます。
そしてその出力を次のように修正します。
/**
* OUtput for our file-less page template
*/
add_action( 'template_redirect', function()
{
// Target pages with out custom template
if( is_page_template( 'my_fileless_page_template' ) )
{
// Stop the default page template to be displayed
add_filter( 'template_include', '__return_null', PHP_INT_MAX );
// Custom output
my_fileless_page_template_output();
}
}, PHP_INT_MAX );
ここではmy_fileless_page_template_output()
を自分のニーズに合わせて定義します。テーマのヘッダーとフッター、メインのクエリーループ、さらにはテンプレート部分も含まれます。最後にexit
を飛ばしても大丈夫だと思います。