Ich möchte Seitenvorlagendateien wie page-{slug}.php
in ein Unterverzeichnis innerhalb meines Themas verschieben, sodass WordPress sie automatisch erkennt. Wenn die Seitenvorlagen des genannten Formulars nicht im Unterverzeichnis vorhanden sind, sollte WordPress auf die Standardregeln zum Laden von Vorlagen zurückgreifen. Wie kann ich das erreichen?
Anmerkung-1: Diese Frage und die entsprechenden Antworten sind allgemeiner für Seitenvorlagen und dieser Link erwähnt template-parts/page
, was nicht dasselbe ist.
Hinweis-2: Ich habe mehrere page-{slug}.php
ähnliche Seitenvorlagendateien, daher möchte ich sie in ein Unterverzeichnis verschieben, um die Organisation der Dateien zu vereinfachen.
Gemäß der standardmäßigen WordPress-Vorlagenhierarchie lädt eine page
-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 sind singular.php
und index.php
nicht Seitenvorlagen. singular.php
ist die Fallback-Vorlage für einzelne Beitragstypen und index.php
ist die ultimative Fallback-Vorlage für alles, was eine WordPress-Vorlage laden soll. Die ersten fünf sind also Seitenvorlagen.
Die WordPress-Kernfunktion get_page_template()
generiert das erforderliche page
Template-Hierarchie-Array und kurz vor der Entscheidung, welche Template-Datei aus der Hierarchie geladen werden soll, löst WordPress denpage_template_hierarchy
Filter-Hook aus. Der beste Weg, um ein Unterverzeichnis hinzuzufügen, in dem WordPress automatisch nach page-{slug}.php
-Vorlagen sucht, 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
{$type}_template_hierarchy
definiert ist und sich in der Dateiwp-includes/template.php
befindet. Wenn also der$type
page
ist, wird der Filter-Hook zupage_template_hierarchy
.
Zu unserem Zweck fügen wir jetzt den Dateinamen sub-directory/page-{slug}.php
kurz vor page-{slug}.php
in das Array der Vorlagenhierarchie ein, das an die Hooks-Rückruffunktion übergeben wird. Auf diese Weise lädt WordPress die sub-directory/page-{slug}.php
-Datei, falls vorhanden, ansonsten folgt es der normalen Hierarchie beim Laden von Seitenvorlagen. Aus Gründen der Konsistenz wird Custom Page Template
natürlich weiterhin eine höhere Priorität als unsere sub-directory/page-{slug}.php
-Datei zugewiesen. Die modifizierte Seitenvorlagenhierarchie wird also:
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
functions.php
CODE:Wenn Sie diese Änderung nur für ein einziges 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' );
Wenn Sie dieselbe Organisation von Vorlagendateien in mehreren Themen verfolgen möchten, sollten Sie diese Funktion von Ihrem Thema trennen. In diesem Fall müssen Sie, anstatt die functions.php
-Datei des Themas mit dem obigen Beispiel-CODE zu ändern, ein einfaches Plugin mit demselben Beispiel-CODE erstellen.
Speichern Sie den folgenden CODE unter einem Dateinamen, z. page-slug-template-subdir.php
in deinem 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' );
Mit einem der obigen Codes erkennt WordPress
page-{slug}.php
Vorlagendateien impage-templates
Verzeichnis Ihres Themas automatisch.Angenommen, Sie haben eine
about
Seite. Wenn im Editor keincustom page template
festgelegt ist, sucht WordPress nachTHEME/page-templates/page-about.php
-Vorlagendateien. Wenn dies nicht der Fall ist, sucht WordPress nachTHEME/page-about.php
-Vorlagendateien usw. (dh nach der Standard-Seitenvorlagenhierarchie). .