web-dev-qa-db-ja.com

テーマのget_template_partとactionフォーク

私にはこれらの両方がエンドユーザーがテーマファイルを実際に編集することなくテーマを変更する機会を与えているように思えます(子テーマを通して)。

私の質問は、他の方法よりも好ましい方法です。

例えば、今取り組んでいるテーマを考えてみましょう。私はフックのテンプレート部分を使うかどうかを決めようとしています。

<?php get_template_part('before_sitecontainer' ); ?>
<div id="sitecontainer" class="sitecontainer" <?php //closed in footer ?>>

<?php get_template_part( 'before_topcontainer' ); ?>
<div id="topcontainer ">

    <?php get_template_part( 'before_topedge_navigation' ); ?>
    <?php get_template_part( 'topedge_navigation' ); ?>

    <?php get_template_part( 'before_site_header' ); ?>
    <?php get_template_part( 'site_header' ); ?>

    <?php get_template_part( 'before_second_navigation' ); ?>
    <?php get_template_part( 'second_navigation' ); ?>

    <?php get_template_part( 'after_second_navigation' ); ?>

</div><!-- end topcontainer div -->
<?php get_template_part( 'after_topcontainer' ); ?>

上記では、テーマのユーザーは、子テーマフォルダに適切な名前のファイルを作成するだけでなく、既存の各セクションの前後に同じ方法で新しいコードを追加することで既存のコードの任意のセクションを置き換えることができますパートファイルは、親テーマにはまったく存在せず、単にコードを挿入できるようにするためのものです - この方法では、これを実現するためにフックやフィルタを理解する必要はありません。

もちろんフックとフィルターを使っても同じことができます。

代わりにフック/フィルタを使用する利点はありますか?これを使用する予定の対象読者を念頭に置いておくことは、明らかにnot codeに精通していることです。私は彼らがテンプレートメソッドを使用するために従うことができる比較的基本的な指示を彼らに与えることができますが、ほとんど間違いなくフックでそれらから悪魔を混乱させるでしょう。

それとも、同じテーマの中で、一方が他方より優れているような状況はありますか。

14
Ashley G

私はフックがより柔軟であるので、私はフックを好みます:あなたはあなたのテーマのfunctions.phpファイルからでもそれにプラグインからでもフックすることができます。私はプラグインにできるだけ多くのロジックを入れようとしているので、テーマはほとんどレイアウトのものを含んでいます。

アクションフックを使用している場合でも、get_template_part()そのフックハンドラ内を使用することは可能です。これにより、両方の長所が得られます。 get_template_part()を呼び出すデフォルトのフックを作成して、コーディングの経験があまりない人は追加のファイルを追加できます。そうしたくない場合は他の人がこのフックを削除できます。

パフォーマンスに関して:get_template_part()は( locate_template() の中で)file_exists()を1、2または4回使います(呼び出し方法によります)。 file_exists()は非常に高速です 、そして はPHP そしておそらくOSでもキャッシングを使用します。だからそれはおそらく問題ではありません。

8
Jan Fabry

主な違いは読みやすさです。よく名前が付けられているテンプレートパーツがいくつかある場合は、何が起きているのか簡単に把握できます。あなたがフックを見ただけであれば、フックにアタッチされているものを確立するためにテーマの残りを検索する必要があります。

4
Mild Fuzz

子テーマでフックから関数を削除するのは(比較的)簡単ですが、不要な親テンプレートを無視させるのははるかに困難です。

本質的にフックを扱うことはPHPサイドに近く、テンプレートを扱うことはHTMLサイドに近いです。私は非常にフック指向のハイブリッド親テーマを使います。あなたがいくつかの親のテンプレートを取り除く必要があるまで、それは至福です。

技術に精通していないユーザーにとっては、どちらも非常に良い選択肢ではありません。どうして彼らはそのようなテーマの内部構造を台無しにする必要があるのでしょうか。

PSはパフォーマンスの問題にも注目しています。フック付きのものはメモリ内で発生し、テンプレート付きのものは多くのディスク検索を必要とします。あなたがあなたの例のように何かを書いている場合は特に。

PPS全員の好みではありません...しかし、最初から親テーマを書く代わりに、既存の親テーマを利用して単純な子テーマをユーザーに提供しないのはなぜでしょうか。

4
Rarst