web-dev-qa-db-ja.com

Functions.phpで "ファイルなし"のページテンプレートを作成する

( "Page Template"とは、 "Template Name"ヘッダ を持つテーマファイルで、管理ページの "Template"ドロップダウンフィールドで選択できます。)

複数のインスタンスで、私はthe_contentやpre_get_posts、あるいはそれに似たものにフックすることによって達成されたかもしれないページテンプレートを構築しました。テーマファイル自体を作成せずに、選択可能なテーマテンプレートをfunctions.phpまたはプラグインに「登録」する方法があるかどうか疑問に思います。

私がこれをしたい理由は:

  • 私が考えているシナリオでは、私は通常page.phpをほとんど逐語的にコピーするだけです。それはpage.phpへの将来の変更が二度なされる必要があることを意味します。これは、子供のテーマを更新したときの、さらに面倒な作業です。
  • 私は "Template"フィールドのUIが好きです。私が考えることができるいくつかの選択肢(下記参照)以上に私のクライアントには理にかなっています。

私の場合は、カスタムメタボックスやショートコードを使用して(そうでなければテンプレートに保持されているコンテンツを挿入する)、いくつかの回避策を考えることができます。私もこれを行うことができるかもしれません(私はちょうど考えたがまだテストしていません):

/*
Template Name: My Template
*/

get_template_part( 'page' );

しかし、結局、私はこの考えに戻り続けているので、誰かがそれを行う方法を知っているかどうか私は興味があります。あなたがそれが恐ろしい考えであると思うならば、私はその意見にも興味があります。

=======

更新:私はそれを追加する必要があります:

  • このサポートフォーラムのスレッド から各テーマ用の$templates配列があることを私は知っています。これは基本的に私がやりたいことの反対をしています。
  • this WPSE thread から隠されたカスタムフィールド_wp_page_templateがあることを私は知っています。

テンプレート配列とカスタムフィールドがどのように連携して機能するのかを理解する必要があると思います(そして、隠されたカスタムメタフィールドがどのように機能するかについてもあいまいです)。

=======

UPDATE II:10/8/12この質問がされて以来、テーマのバックエンドは大幅に作り直され、上記の$ templates配列はもう存在しません。

6
mrwweb

私はまだこの種のことをしたいという願望に遭遇し、私がOPで提案した2つの理由で好む次の解決策を決心しました:

  1. それは非常に透明であり、テーマのロジックを維持することと一致しています。
  2. 必要に応じて後でテンプレートをカスタマイズするのはとても簡単です。

カスタムテンプレート

カスタムマークアップが不要な場合は、テンプレートファイル全体がここにあります。 /wp-content/themes/my-theme/templates/my-template.phpにあるとしましょう

<?php
/**
 * Template Name: My Template
 */
get_template_part( 'page' );

それを使う

これで、あらゆることを行うための2つの「フック」が得られます。

  1. CSSの.page-template-my-templateのボディクラス。
  2. if( is_page_template( 'templates/my-template.php' ) ) {...を使う能力

#1を使用してレイアウト、色などを変更し、#2を使用してthe_content()のフィルタリング、post_classesの追加、ACFを使用したカスタムフィールドの設定などを行いました。時々私はサイドバーをまだ必要とする全角テンプレートのようなもののためにそれらを組み合わせて使用​​します。それは非常に強力でありながら、非常に簡単に設定でき、自分で設定しなかったかどうかを理解するのに非常に簡単です。

これはまだテーマに限定されています(あなたはプラグインでそれを行うことができませんでした)、しかし私の質問の目的のために、これは私にとって良い答えでした。

1
mrwweb

ページは一般的にかなり柔軟性がないと言っている、あなたはカスタム投稿タイプを使うことをお勧めします。また、実際のページテンプレートのドロップダウンにフックすることは非常に問題が多いでしょう(私はそれが深刻なハッキングなしでうまくいくとは思わない)。あなた自身のメタボックスドロップダウンを書くだけの方が得策です。

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ファイルをつかんでいます。

2
Wyck

このような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 );

バックエンドにこのように表示されます。

file-less template

そしてその出力を次のように修正します。

/**
 * 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を飛ばしても大丈夫だと思います。

1
birgire