テンプレートエンジンを使用してWordPressテーマを開発しています。私のコードがWPコア機能と可能な限り互換性があることを望みます。
最初にいくつかのコンテキスト
最初の問題は、WPクエリからテンプレートを解決する方法を見つけることでした。私は自分のライブラリBrain \ Hierarchyを使用してその問題を解決しました。
get_template_part()
や他の負荷のパーシャルが好きなことを機能get_header()
、get_footer()
および同様、それはテンプレートエンジン部分的機能への書き込みラッパーにはかなり簡単でした。
問題
私の問題は、コメントテンプレートを読み込む方法です。
WordPress関数comments_template()
は、多くのことを行う〜200行の関数であり、コアの互換性を最大限に高めるためにも実行したいと思います。
ただし、を呼び出すとすぐcomments_template()
に、ファイルはrequire
dになり、次のいずれかになります。
- 定数のファイル(
COMMENTS_TEMPLATE
定義されている場合) comments.php
見つかった場合は、テーマフォルダー内/theme-compat/comments.php
WPには、最後の手段としてのフォルダーが含まれています
つまり、単純にを使用するのではなくテンプレートをレンダリングする必要があるため、関数がPHPファイルをロードするのを防ぐ方法はありませんrequire
。
現在のソリューション
現時点では、空のcomments.php
ファイルを出荷'comments_template'
していて、WordPressがロードするテンプレートを確認するためにフィルターフックを使用し、テンプレートエンジンの機能を使用してテンプレートをロードしています。
このようなもの:
function engineCommentsTemplate($myEngine) {
$toLoad = null; // this will hold the template path
$tmplGetter = function($tmpl) use(&$toLoad) {
$toLoad = $tmpl;
return $tmpl;
};
// late priority to allow filters attached here to do their job
add_filter('comments_template', $tmplGetter, PHP_INT_MAX);
// this will load an empty comments.php file I ship in my theme
comments_template();
remove_filter('comments_template', $tmplGetter, PHP_INT_MAX);
if (is_file($toLoad) && is_readable($toLoad)) {
return $myEngine->render($toLoad);
}
return '';
}
質問
これは機能しますが、コア互換ですが、空を出荷することなく機能させる方法はありますcomments.php
か?
嫌いだから。
comments_template
フィルターまたはCOMMENTS_TEMPLATE
定数を使用するすべての試みを壊します。これは極めて重要なことではありませんが、前述したように、コアとの互換性を可能な限り維持したいと考えていました。