Cách tải trang mẫu:
Theo Phân cấp mẫu mặc định của WordPress , một page
yêu cầu tải một mẫu dựa trên mức độ ưu tiên và đặt tên như được nêu dưới đây:
Custom Page Template
: nếu được xác định trong trình chỉnh sửa trang.
page-{slug}.php
page-{url-encoded-slug}.php
: chỉ dành cho các ký tự nhiều byte.
page-{id}.php
page.php
singular.php
index.php
Trong số này, singular.php
và index.php
đang không thực sự trang mẫu. singular.php
là mẫu dự phòng cho bất kỳ loại bài đăng đơn lẻ nào và index.php
là mẫu dự phòng cuối cùng cho mọi thứ mà mẫu WordPress được yêu cầu tải. Vì vậy, năm đầu tiên là các mẫu trang.
Cách tiêm tệp mẫu từ thư mục con trong cấu trúc phân cấp:
Chức năng cốt lõi của WordPress get_page_template()
tạo ra page
mảng phân cấp mẫu cần thiết và ngay trước khi quyết định chính xác tệp mẫu nào sẽ tải từ cấu trúc phân cấp, WordPress kích hoạt page_template_hierarchy
hook bộ lọc. Vì vậy, cách tốt nhất để thêm thư mục con, trong đó WordPress sẽ page-{slug}.php
tự động tìm kiếm các mẫu, là sử dụng bộ lọc này và nhập tên tệp thích hợp liên quan đến thư mục con đó trong mảng phân cấp mẫu của trang.
Lưu ý: hook bộ lọc ban đầu là hook bộ lọc động được định nghĩa là{$type}_template_hierarchy
, nằm trongwp-includes/template.php
tệp. Vì vậy, khi$type
làpage
, móc lọc trở thànhpage_template_hierarchy
.
Bây giờ, với mục đích của chúng tôi, chúng tôi sẽ chèn sub-directory/page-{slug}.php
tên tệp ngay trước đó page-{slug}.php
trong mảng phân cấp mẫu được truyền cho hàm gọi lại hook. Bằng cách đó, WordPress sẽ tải sub-directory/page-{slug}.php
tệp nếu nó tồn tại, nếu không, nó sẽ tuân theo phân cấp tải mẫu trang bình thường. Tất nhiên, để duy trì tính nhất quán, chúng tôi vẫn sẽ Custom Page Template
ưu tiên cao hơn so với sub-directory/page-{slug}.php
tệp của chúng tôi . Vì vậy, hệ thống phân cấp mẫu trang đã sửa đổi sẽ trở thành:
Custom Page Template
: nếu được xác định trong trình chỉnh sửa trang.
sub-directory/page-{slug}.php
sub-directory/page-{url-encoded-slug}.php
: chỉ dành cho các ký tự nhiều byte.
page-{slug}.php
page-{url-encoded-slug}.php
: chỉ dành cho các ký tự nhiều byte.
page-{id}.php
page.php
functions.php
MÃ mẫu :
Nếu bạn dự định chỉ thực hiện thay đổi này trên một chủ đề, thì bạn có thể sử dụng CODE sau trong functions.php
tệp của chủ đề đang hoạt động :
// 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 mẫu:
Nếu bạn muốn theo cùng một tổ chức tệp mẫu trong nhiều chủ đề, thì tốt nhất nên tách tính năng này khỏi chủ đề của bạn. Trong trường hợp đó, thay vì sửa đổi functions.php
tệp của chủ đề bằng CODE mẫu ở trên, bạn sẽ cần tạo một plugin đơn giản với cùng CODE mẫu.
Lưu CODE sau với tên tệp, ví dụ page-slug-template-subdir.php
trong plugins
thư mục WordPress của bạn :
<?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' );
Sử dụng:
Với một trong các MÃ trên, WordPress sẽ tự động nhận ra page-{slug}.php
các tệp mẫu trong page-templates
thư mục của chủ đề của bạn.
Nói ví dụ, bạn có một about
trang. Vì vậy, nếu nó không có một custom page template
bộ từ trình chỉnh sửa, thì WordPress sẽ tìm THEME/page-templates/page-about.php
tệp mẫu và nếu nó không tồn tại, thì WordPress sẽ tìm THEME/page-about.php
tệp mẫu, v.v. (tức là phân cấp mẫu trang mặc định).