Comment les modèles de page sont chargés:
Selon la hiérarchie de modèles WordPress par défaut , une page
demande charge un modèle en fonction de la priorité et du nom, comme indiqué ci-dessous:
Custom Page Template
: si défini dans l'éditeur de page.
page-{slug}.php
page-{url-encoded-slug}.php
: uniquement pour les caractères multi-octets.
page-{id}.php
page.php
singular.php
index.php
Parmi ceux-ci, singular.php
et neindex.php
sont pas réellement des modèles de page. singular.php
est le modèle de secours pour tous les types de publication et index.php
le modèle de secours ultime pour tout ce qu'un modèle WordPress est censé charger. Les cinq premiers sont donc des modèles de page.
Comment injecter des fichiers de modèle à partir d'un sous-répertoire de la hiérarchie:
La fonction principale de WordPress get_page_template()
génère le page
tableau de hiérarchie de modèles nécessaire et juste avant de décider exactement quel fichier de modèle à charger à partir de la hiérarchie, WordPress déclenche le page_template_hierarchy
crochet du filtre. Donc, la meilleure façon d'ajouter un sous-répertoire, où WordPress recherchera page-{slug}.php
automatiquement les modèles, est d'utiliser ce filtre et d'injecter les noms de fichiers appropriés par rapport à ce sous-répertoire dans le tableau de hiérarchie des modèles de page.
Remarque: le crochet de filtre d'origine est un crochet de filtre dynamique défini comme{$type}_template_hierarchy
, qui se trouve dans lewp-includes/template.php
fichier. Ainsi, lorsque le$type
estpage
, le crochet du filtre devientpage_template_hierarchy
.
Maintenant, pour notre objectif, nous allons injecter le sub-directory/page-{slug}.php
nom de fichier juste avant page-{slug}.php
dans le tableau de hiérarchie de modèles passé à la fonction de rappel des hooks. De cette façon, WordPress chargera le sub-directory/page-{slug}.php
fichier s'il existe, sinon il suivra la hiérarchie de chargement de modèle de page normale. Bien sûr, pour maintenir la cohérence, nous donnerons toujours Custom Page Template
une priorité plus élevée par rapport à notre sub-directory/page-{slug}.php
fichier. Ainsi, la hiérarchie de modèle de page modifiée deviendra:
Custom Page Template
: si défini dans l'éditeur de page.
sub-directory/page-{slug}.php
sub-directory/page-{url-encoded-slug}.php
: uniquement pour les caractères multi-octets.
page-{slug}.php
page-{url-encoded-slug}.php
: uniquement pour les caractères multi-octets.
page-{id}.php
page.php
Exemple de functions.php
CODE:
Si vous prévoyez d'effectuer cette modification uniquement sur un seul thème, vous pouvez utiliser le CODE suivant dans le functions.php
fichier de votre thème actif :
// 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' );
Exemple de plugin:
Si vous souhaitez suivre la même organisation de fichiers de modèle dans plusieurs thèmes, il est préférable de garder cette fonctionnalité distincte de votre thème. Dans ce cas, au lieu de modifier le functions.php
fichier du thème avec l'exemple de CODE ci-dessus, vous devrez créer un plugin simple avec le même exemple de CODE.
Enregistrez le CODE suivant avec un nom de fichier, par exemple page-slug-template-subdir.php
dans votre plugins
répertoire WordPress :
<?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' );
Usage:
Avec l'un des codes ci-dessus, WordPress reconnaîtra automatiquement page-{slug}.php
les fichiers de modèle dans le page-templates
répertoire de votre thème.
Disons par exemple que vous avez une about
page. Donc, s'il n'a pas de custom page template
jeu depuis l'éditeur, WordPress recherchera le THEME/page-templates/page-about.php
fichier de modèle et s'il n'existe pas, WordPress recherchera le THEME/page-about.php
fichier de modèle et ainsi de suite (c'est-à-dire la hiérarchie de modèle de page par défaut).