Saya sedang mengembangkan tema WordPress menggunakan mesin template. Saya ingin kode saya menjadi kompatibel sebanyak mungkin dengan fungsionalitas WP core.
Beberapa konteks dulu
Masalah pertama saya adalah menemukan cara untuk menyelesaikan template mulai dari permintaan WP. Saya memecahkan yang menggunakan perpustakaan saya, Brain \ Hierarchy .
Mengenai get_template_part()
dan fungsi-fungsi lain yang memuat parsial suka get_header()
, get_footer()
dan serupa, itu cukup mudah untuk menulis wrapper ke templat fungsionalitas mesin parsial.
Masalah
Masalah saya sekarang adalah bagaimana memuat template komentar.
Fungsi WordPress comments_template()
adalah fungsi ~ 200 baris yang melakukan banyak hal, yang ingin saya lakukan juga untuk kompatibilitas inti maksimum.
Namun, begitu saya menelepon comments_template()
, file require
d, itu adalah yang pertama dari:
- file dalam konstanta
COMMENTS_TEMPLATE
, jika ditentukan comments.php
di folder tema, jika ditemukan/theme-compat/comments.php
di WP menyertakan folder sebagai fallback pilihan terakhir
Singkatnya, tidak ada cara untuk mencegah fungsi memuat file PHP, yang tidak diinginkan bagi saya, karena saya perlu membuat template saya dan tidak hanya menggunakan require
.
Solusi saat ini
Saat ini, saya mengirimkan comments.php
file kosong dan saya menggunakan 'comments_template'
hook filter, untuk mengetahui template yang ingin dimuat WordPress, dan menggunakan fitur dari mesin template saya untuk memuat template.
Sesuatu seperti ini:
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 '';
}
Pertanyaan
Ini berfungsi, apakah core kompatibel, tetapi ... adakah cara untuk membuatnya berfungsi tanpa harus mengirimkan yang kosong comments.php
?
Karena saya tidak suka itu.
comments_template
filter atauCOMMENTS_TEMPLATE
konstan untuk menyesuaikan template. Yang tidak penting, tetapi, seperti yang saya katakan, saya ingin tetap sebisa mungkin kompatibel dengan inti.