web-dev-qa-db-ja.com

Get_template_part()の使い方

誰かがこの機能がどのように機能するのか私に説明してもらえますか?私はそれが何をするのか知っていますが、twenty_tenテンプレートのソースコードを見ると、すべてのループが1つのloop.phpに集められていることがわかりません(そのファイルも見ました)。

それでは例えばどのようにしてテンプレートの特定の共通部分を抽象化し、それから他のテンプレートでそれを再利用するのでしょうか。

25
Amit Erandole

ここにいくつかの非常に良い入門回答があります。

基本的に、get_template_part()はテーマ開発者がテンプレートファイルの特定の順序を設定することを可能にします。 CSSセレクターに適用されるので、それは特定性と同じように考えてください。何かをデザインするとき、あなたはそれが個々の注意を必要とするデザインの部分で簡単に無効にされることができるように最低限の特異性から始めることを望みます。

たとえば、ブログのスタイルを設定し、投稿のマークアップに適したloop.phpファイルを作成します。しかし、あなたは先を見越して、あなたは後で追加のコンテキスト指定子を使ってあなたのテンプレートファイルでそれを呼び出す - 例えば、あなたはget_template_part( 'loop', 'index' );を呼び出し、単一のテンプレートではget_template_part( 'loop', 'single' );を呼び出し、そしてget_template_part( 'loop', 'archive' );を呼び出します。ホームページとは違ってアーカイブページのループをマークアップすることにした場合、これは非常に簡単になります。単にloop-archive.phpテンプレートを作成してください。総称loop.php

しかしget_template_part()の背後にある魔法はlocate_template()という関数にあります。これは最初にテーマディレクトリをチェックし、次に親ディレクトリ(もしあれば)を指定されたファイルのためにチェックします。これはプラグイン開発に非常に役立ちます。私のプラグインの1つでは、カスタム投稿タイプを定義し、そのカスタム投稿タイプ用のループテンプレートファイルをプラグインディレクトリに作成しました。しかし... ...私が選択した場合、私のプラグインを使用するテーマが私のマークアップを上書きすることを許可したいです。これがlocate_template()が本当に不思議に働くところです。

locate_template($template_names, $load = false, $require_once = true )

スタイルシートディレクトリ内の$ template_names配列内の各名前を探し、次にテンプレートディレクトリ内を探します。 $ load引数として 'true'を渡すと、最初に見つかったファイルが require になり、テンプレートファイルが見つからなかった場合は空の文字列が返されます。だから私は私のプラグインでこのようなことをすることができます:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

...これは、テーマ開発者にとって、loop-mycustomposttype.phpというファイルをテーマに含めるだけで、プラグインを簡単にカスタマイズできるようにするためです。

23
goldenapples

すべてのループではなく、メインループ。 ;-)フロントページやカテゴリを見ても、誰が何を知っていても、常にメインループがあります。そのメインループの内容は、テンプレートがまったく呼び出される前に実行されたクエリによって決定されます。

Loop.phpテンプレートは、ループ内の項目を単に実行し、それらをフォーマットします。 Codexのドキュメント を参照してください。

Twenty-Tenのloop.phpを見ると、Twenty-Tenがその単一のテンプレートファイル内でwithin多様化していることがわかります。

get_template_part()は、単にテンプレートパーツをロードして、それを実行するだけです。同様に、loop.phpの一部を別のファイルに抽出し、get_template_part('loop', 'category')などの呼び出しで置き換えることができます。

または、ループ内の個々の投稿ごとにパートテンプレートを作成し、loop.phpでwhile...句内のget_template_part('loop','post');のみを呼び出すようにすることもできます。すべてあなた次第。

5
wyrfel

get_template_part codexから

<?php get_template_part( 'loop', 'index' ); ?>

存在する最初のファイルに対してPHP require()を実行します。

そう事実上あなたが別のphpファイルを必要としていたかのようにそれは働くでしょう。

更新 : 'require'には多少の違いがあります - 関数内にラップされているので、テンプレートからテンプレート部分に変数を渡す場合はglobalを使用する必要があります。

3
icc97