Come vengono caricati i modelli di pagina:
Secondo la Gerarchia dei modelli di WordPress predefinita , una page
richiesta carica un modello in base alla priorità e alla denominazione come indicato di seguito:
Custom Page Template
: se definito nell'editor di pagine.
page-{slug}.php
page-{url-encoded-slug}.php
: solo per caratteri multibyte.
page-{id}.php
page.php
singular.php
index.php
Tra questi, singular.php
e in realtà nonindex.php
sono modelli di pagina. è il modello di fallback per ogni singolo tipo di post ed è il modello di fallback definitivo per tutto ciò che un modello di WordPress dovrebbe caricare. Quindi i primi cinque sono modelli di pagina.singular.php
index.php
Come iniettare file modello da una sottodirectory all'interno della gerarchia:
La funzione principale di WordPress get_page_template()
genera l' page
array gerarchico di template necessario e poco prima di decidere esattamente quale file template caricare dalla gerarchia, WordPress attiva l' page_template_hierarchy
hook del filtro. Quindi il modo migliore per aggiungere una sottodirectory, in cui WordPress cercherà page-{slug}.php
automaticamente i modelli, è utilizzare questo filtro e iniettare i nomi di file appropriati relativi a quella sottodirectory all'interno dell'array gerarchico dei modelli di pagina.
Nota: l'hook filtro originale è un hook di filtro dinamico definito come{$type}_template_hierarchy
, che si trova nelwp-includes/template.php
file. Quindi, quando lo$type
èpage
, il gancio del filtro diventapage_template_hierarchy
.
Ora, per il nostro scopo, inietteremo il sub-directory/page-{slug}.php
nome del file poco prima page-{slug}.php
all'interno dell'array della gerarchia dei modelli passato alla funzione di callback degli hook. In questo modo, WordPress caricherà il sub-directory/page-{slug}.php
file se esiste, altrimenti seguirà la normale gerarchia di caricamento del modello di pagina. Naturalmente, per mantenere la coerenza, daremo comunque Custom Page Template
una priorità più alta rispetto al nostro sub-directory/page-{slug}.php
file. Quindi la gerarchia del modello di pagina modificata diventerà:
Custom Page Template
: se definito nell'editor di pagine.
sub-directory/page-{slug}.php
sub-directory/page-{url-encoded-slug}.php
: solo per caratteri multibyte.
page-{slug}.php
page-{url-encoded-slug}.php
: solo per caratteri multibyte.
page-{id}.php
page.php
functions.php
CODICE di esempio :
Se prevedi di apportare questa modifica solo su un singolo tema, puoi utilizzare il seguente CODICE nel functions.php
file del tema attivo :
// 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 di esempio:
Se vuoi seguire la stessa organizzazione di file modello in più temi, allora è meglio mantenere questa funzione separata dal tuo tema. In tal caso, invece di modificare il functions.php
file del tema con il CODICE di esempio sopra riportato, dovrai creare un semplice plugin con lo stesso CODICE di esempio.
Salvare il seguente CODICE con un nome file, ad es. Nella directory di page-slug-template-subdir.php
WordPress plugins
:
<?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' );
Uso:
Con uno dei codici sopra indicati, WordPress riconoscerà automaticamente i page-{slug}.php
file modello all'interno della page-templates
directory del tema.
Ad esempio, hai una about
pagina. Quindi, se non ha un custom page template
set dall'editor, WordPress cercherà il THEME/page-templates/page-about.php
file modello e se ciò non esiste, WordPress cercherà il THEME/page-about.php
file modello e così via (cioè la gerarchia predefinita del modello di pagina).