So werden Seitenvorlagen geladen:
Nach dem Standard WordPress-Vorlagenhierarchiepage
lädt eine Anforderung eine Vorlage basierend auf der Priorität und der Benennung wie folgt:
Custom Page Template
: falls im Seiteneditor definiert.
page-{slug}.php
page-{url-encoded-slug}.php
: nur für Multi-Byte-Zeichen.
page-{id}.php
page.php
singular.php
index.php
Unter diesen singular.php
und index.php
sind eigentlich keine Seitenvorlagen. singular.php
ist die Fallback-Vorlage für einzelne Beitragstypen und index.php
die ultimative Fallback-Vorlage für alles, was eine WordPress-Vorlage laden soll. Die ersten fünf sind also Seitenvorlagen.
So fügen Sie Vorlagendateien aus einem Unterverzeichnis innerhalb der Hierarchie ein:
Die WordPress-Kernfunktion get_page_template()
generiert das erforderliche page
Array für die Vorlagenhierarchie. Kurz bevor Sie genau entscheiden, welche Vorlagendatei aus der Hierarchie geladen werden soll, löst WordPress den page_template_hierarchy
Filter-Hook aus. Der beste Weg, um ein Unterverzeichnis hinzuzufügen, nach dem WordPress suchen wirdpage-{slug}.php
automatisch Vorlagen , besteht darin, diesen Filter zu verwenden und die richtigen Dateinamen relativ zu diesem Unterverzeichnis in das Array der Seitenvorlagenhierarchie einzufügen.
Hinweis: Der ursprüngliche Filter-Hook ist ein dynamischer Filter-Hook, der als definiert{$type}_template_hierarchy
ist und sich in derwp-includes/template.php
Datei befindet. Wenn diesder Fall$type
istpage
, wird der Filterhakenpage_template_hierarchy
.
Für unseren Zweck fügen wir nun den sub-directory/page-{slug}.php
Dateinamen unmittelbar zuvor page-{slug}.php
in das Vorlagenhierarchie-Array ein, das an die Hooks-Rückruffunktion übergeben wird. Auf diese Weise lädt WordPress sub-directory/page-{slug}.php
Dateien, falls vorhanden, andernfalls folgt es der normalen Hierarchie zum Laden von Seitenvorlagen. Um die Konsistenz aufrechtzuerhalten, geben wir natürlich immer noch Custom Page Template
eine höhere Priorität als unseresub-directory/page-{slug}.php
Datei. Die geänderte Seitenvorlagenhierarchie wird also wie folgt:
Custom Page Template
: falls im Seiteneditor definiert.
sub-directory/page-{slug}.php
sub-directory/page-{url-encoded-slug}.php
: nur für Multi-Byte-Zeichen.
page-{slug}.php
page-{url-encoded-slug}.php
: nur für Multi-Byte-Zeichen.
page-{id}.php
page.php
Stichprobe functions.php
:
Wenn Sie diese Änderung nur für ein einzelnes Thema vornehmen möchten, können Sie den folgenden CODE in der functions.php
Datei Ihres aktiven Themas verwenden:
// 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' );
Beispiel-Plugin:
Wenn Sie dieselbe Organisation von Vorlagendateien in mehreren Themen verfolgen möchten, sollten Sie diese Funktion von Ihrem Thema trennen. In diesem Fall, anstatt das Thema zu ändernfunctions.php
Datei mit dem obigen Beispiel-CODE zu ändern, ein einfaches Plugin mit demselben Beispiel-CODE erstellen.
Speichern Sie den folgenden CODE mit einem Dateinamen, z. B. page-slug-template-subdir.php
in Ihrem WordPress- plugins
Verzeichnis:
<?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' );
Verwendungszweck:
Mit einem der oben genannten CODES erkennt WordPress darin enthaltene page-{slug}.php
Vorlagendateienpage-templates
automatisch Verzeichnis Ihres Themas.
Angenommen, Sie haben eine about
Seite. Wenn es also keinen custom page template
Satz aus dem Editor gibt, sucht WordPress nach THEME/page-templates/page-about.php
Vorlagendateien. Wenn dies nicht vorhanden ist, sucht WordPress nach THEME/page-about.php
Vorlagendateien usw. (dh der Standardhierarchie der Seitenvorlagen).