rozwój motywu — Jak przenieść pliki szablonów stron, takie jak page-{slug}.php do podkatalogu?
Jak ładowane są szablony stron:
Zgodnie z domyślną hierarchią szablonów WordPress, a page
request ładuje szablon w oparciu o priorytet i nazewnictwo, jak podano poniżej:
Custom Page Template
: jeśli zdefiniowano w edytorze stron.page-{slug}.php
page-{url-encoded-slug}.php
: tylko dla znaków wielobajtowych.page-{id}.php
page.php
singular.php
index.php
Wśród nich, singular.php
I index.php
Czy nie właściwie szablony stron. singular.php
jest szablonem zastępczym dla dowolnych typów pojedynczych postów i index.php
to najlepszy szablon zastępczy dla wszystkiego, co ma ładować szablon WordPress. Zatem pierwszych pięć to szablony stron.
Jak wstrzyknąć pliki szablonów z podkatalogu w hierarchii:
Podstawowa funkcja WordPressa get_page_template()
generuje niezbędne page
tablicę hierarchii szablonów i tuż przed podjęciem decyzji, który plik szablonu ma zostać załadowany z hierarchii, WordPress uruchamia funkcję page_template_hierarchy
hak do filtra. Najlepszym więc sposobem jest dodanie podkatalogu, w którym WordPress będzie szukać page-{slug}.php
templates automatycznie, polega na użyciu tego filtra i wstrzyknięciu odpowiednich nazw plików w odniesieniu do tego podkatalogu w tablicy hierarchii szablonów stron.
Notatka: oryginalny zaczep filtra jest zaczepem filtra dynamicznego zdefiniowanym jako
{$type}_template_hierarchy
który znajduje się wwp-includes/template.php
plik. Kiedy więc$type
Jestpage
hak filtra staje siępage_template_hierarchy
.
Teraz dla naszych celów wstrzykniemy plik sub-directory/page-{slug}.php
nazwa pliku tuż przed page-{slug}.php
w tablicy hierarchii szablonów przekazanej do funkcji wywołania zwrotnego hooków. W ten sposób WordPress się załaduje sub-directory/page-{slug}.php
plik, jeśli istnieje, w przeciwnym razie będzie przestrzegał normalnej hierarchii ładowania szablonów strony. Oczywiście dla zachowania konsekwencji nadal będziemy dawać Custom Page Template
wyższy priorytet w porównaniu do naszego sub-directory/page-{slug}.php
plik. Zatem zmodyfikowana hierarchia szablonów stron będzie wyglądać następująco:
Custom Page Template
: jeśli zdefiniowano w edytorze stron.sub-directory/page-{slug}.php
sub-directory/page-{url-encoded-slug}.php
: tylko dla znaków wielobajtowych.page-{slug}.php
page-{url-encoded-slug}.php
: tylko dla znaków wielobajtowych.page-{id}.php
page.php
Próbka functions.php
KOD:
Jeśli planujesz dokonać tej zmiany tylko w jednym motywie, możesz użyć następującego KODU w aktywnym motywie functions.php
plik:
// 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' );
Przykładowa wtyczka:
Jeśli chcesz zastosować tę samą organizację plików szablonów w wielu motywach, najlepiej jest zachować tę funkcję oddzielnie od motywu. W takim przypadku zamiast modyfikować motyw functions.php
plik z powyższym przykładowym KODEM, będziesz musiał stworzyć prostą wtyczkę z tym samym przykładowym KODEM.
Zapisz następujący KOD z nazwą pliku, np page-slug-template-subdir.php
w Twoim WordPressie plugins
informator:
<?php
/*
Plugin Name: WPSE Page Template page-slug.php to Sub Directory
Plugin URI:
Description: Page Template with page-{slug}.php to a Sub Directory
Version: 1.0.0
Author: Fayaz Ahmed
Author URI:
*/
// 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;
}
// the original filter hook is {$type}_template_hierarchy,
// which is located in wp-includes/template.php file
add_filter( 'page_template_hierarchy', 'wpse312159_page_template_add_subdir' );
Stosowanie:
Dzięki któremukolwiek z powyższych KODÓW WordPress rozpozna
page-{slug}.php
pliki szablonów wewnątrzpage-templates
katalog Twojego motywu automatycznie.Powiedzmy na przykład, że masz
about
strona. Jeśli więc nie macustom page template
set z edytora, następnie WordPress będzie szukaćTHEME/page-templates/page-about.php
szablon, a jeśli taki nie istnieje, WordPress będzie go szukaćTHEME/page-about.php
plik szablonu i tak dalej (tj. domyślna hierarchia szablonów stron).