Bagaimana Templat Halaman dimuat:
Menurut Hierarki Templat WordPress default , page
permintaan memuat templat berdasarkan prioritas dan penamaan seperti yang dinyatakan di bawah ini:
Custom Page Template
: jika didefinisikan dalam editor halaman.
page-{slug}.php
page-{url-encoded-slug}.php
: hanya untuk karakter multi-byte.
page-{id}.php
page.php
singular.php
index.php
Di antaranya, singular.php
dan index.php
yang tidak benar-benar halaman template. singular.php
adalah template fallback untuk semua jenis posting tunggal dan index.php
merupakan template fallback utama untuk apa pun yang seharusnya dimuat oleh template WordPress. Jadi lima yang pertama adalah templat halaman.
Cara menyuntikkan file template dari sub-direktori dalam hierarki:
Fungsi inti WordPress get_page_template()
menghasilkan page
larik hierarki templat yang diperlukan dan tepat sebelum memutuskan dengan tepat file templat mana yang akan dimuat dari hierarki, WordPress mengaktifkan page_template_hierarchy
kait filter. Jadi cara terbaik untuk menambahkan sub-direktori, di mana WordPress akan mencari page-{slug}.php
templat secara otomatis, adalah dengan menggunakan filter ini dan menyuntikkan nama file yang tepat relatif terhadap sub-direktori dalam array hierarki templat halaman.
Catatan: kait filter asli adalah kait filter dinamis yang didefinisikan sebagai{$type}_template_hierarchy
, yang terletak diwp-includes/template.php
file. Jadi ketika$type
itupage
, hook filter menjadipage_template_hierarchy
.
Sekarang, untuk tujuan kami, kami akan menyuntikkan sub-directory/page-{slug}.php
nama file tepat sebelum page-{slug}.php
dalam array hierarki template yang diteruskan ke fungsi panggilan balik kait. Dengan begitu, WordPress akan memuat sub-directory/page-{slug}.php
file jika ada, jika tidak maka akan mengikuti hierarki pemuatan templat laman normal. Tentu saja, untuk menjaga konsistensi, kami akan tetap memberikan Custom Page Template
prioritas yang lebih tinggi dibandingkan dengan sub-directory/page-{slug}.php
file kami . Jadi hierarki templat halaman yang diubah akan menjadi:
Custom Page Template
: jika didefinisikan dalam editor halaman.
sub-directory/page-{slug}.php
sub-directory/page-{url-encoded-slug}.php
: hanya untuk karakter multi-byte.
page-{slug}.php
page-{url-encoded-slug}.php
: hanya untuk karakter multi-byte.
page-{id}.php
page.php
Contoh functions.php
KODE:
Jika Anda berencana untuk melakukan perubahan ini hanya pada satu tema, maka Anda dapat menggunakan KODE berikut dalam functions.php
file tema aktif Anda :
// defining the sub-directory so that it can be easily accessed from elsewhere as well.
define( 'WPSE_PAGE_TEMPLATE_SUB_DIR', 'page-templates' );
function wpse312159_page_template_add_subdir( $templates = array() ) {
// Generally this doesn't happen, unless another plugin / theme does modifications
// of their own. In that case, it's better not to mess with it again with our code.
if( empty( $templates ) || ! is_array( $templates ) || count( $templates ) < 3 )
return $templates;
$page_tpl_idx = 0;
if( $templates[0] === get_page_template_slug() ) {
// if there is custom template, then our page-{slug}.php template is at the next index
$page_tpl_idx = 1;
}
$page_tpls = array( WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx] );
// As of WordPress 4.7, the URL decoded page-{$slug}.php template file is included in the
// page template hierarchy just before the URL encoded page-{$slug}.php template file.
// Also, WordPress always keeps the page id different from page slug. So page-{slug}.php will
// always be different from page-{id}.php, even if you try to input the {id} as {slug}.
// So this check will work for WordPress versions prior to 4.7 as well.
if( $templates[$page_tpl_idx] === urldecode( $templates[$page_tpl_idx + 1] ) ) {
$page_tpls[] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx + 1];
}
array_splice( $templates, $page_tpl_idx, 0, $page_tpls );
return $templates;
}
add_filter( 'page_template_hierarchy', 'wpse312159_page_template_add_subdir' );
Plugin Contoh:
Jika Anda ingin mengikuti organisasi file templat yang sama dalam beberapa tema, maka sebaiknya memisahkan fitur ini dari tema Anda. Dalam hal ini, alih-alih memodifikasi file tema functions.php
dengan KODE sampel di atas, Anda harus membuat plugin sederhana dengan KODE sampel yang sama.
Simpan KODE berikut dengan nama file misalnya page-slug-template-subdir.php
dalam plugins
direktori WordPress Anda :
<?php
/*
Plugin Name: WPSE Page Template page-slug.php to Sub Directory
Plugin URI: https://wordpress.stackexchange.com/a/312159/110572
Description: Page Template with page-{slug}.php to a Sub Directory
Version: 1.0.0
Author: Fayaz Ahmed
Author URI: https://www.fayazmiraz.com/
*/
// defining the sub-directory so that it can be easily accessed from elsewhere as well.
define( 'WPSE_PAGE_TEMPLATE_SUB_DIR', 'page-templates' );
function wpse312159_page_template_add_subdir( $templates = array() ) {
// Generally this doesn't happen, unless another plugin / theme does modifications
// of their own. In that case, it's better not to mess with it again with our code.
if( empty( $templates ) || ! is_array( $templates ) || count( $templates ) < 3 )
return $templates;
$page_tpl_idx = 0;
if( $templates[0] === get_page_template_slug() ) {
// if there is custom template, then our page-{slug}.php template is at the next index
$page_tpl_idx = 1;
}
$page_tpls = array( WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx] );
uded in the
// page template hierarchy just before the URL encoded page-{$slug}.php template file.
// Also, WordPress always keeps the page id different from page slug. So page-{slug}.php will
// always be different from page-{id}.php, even if you try to input the {id} as {slug}.
// So this check will work for WordPress versions prior to 4.7 as well.
if( $templates[$page_tpl_idx] === urldecode( $templates[$page_tpl_idx + 1] ) ) {
$page_tpls[] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx + 1];
}
array_splice( $templates, $page_tpl_idx, 0, $page_tpls );
return $templates;
}
// the original filter hook is {$type}_template_hierarchy,
// wihch is located in wp-includes/template.php file
add_filter( 'page_template_hierarchy', 'wpse312159_page_template_add_subdir' );
Pemakaian:
Dengan salah satu dari KODE di atas, WordPress akan mengenali page-{slug}.php
file template dalam page-templates
direktori tema Anda secara otomatis.
Katakan misalnya, Anda memiliki about
halaman. Jadi, jika tidak memiliki custom page template
set dari editor, maka WordPress akan mencari THEME/page-templates/page-about.php
file template dan jika itu tidak ada, maka WordPress akan mencari THEME/page-about.php
file template dan sebagainya (yaitu hierarki templat halaman default).