it-swarm.com.de

Wie verschiebe ich Seitenvorlagendateien wie page- {slug} .php in ein Unterverzeichnis?

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.

8
chevallier

So werden Seitenvorlagen geladen:

Gemäß der standardmäßigen WordPress-Vorlagenhierarchie lädt eine page-Anforderung eine Vorlage basierend auf der Priorität und der Benennung wie folgt:

  1. Custom Page Template: falls im Seiteneditor definiert.
  2. page-{slug}.php
  3. page-{url-encoded-slug}.php: nur für Multi-Byte-Zeichen.
  4. page-{id}.php
  5. page.php
  6. singular.php
  7. 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.

So fügen Sie Vorlagendateien aus einem Unterverzeichnis innerhalb der Hierarchie ein:

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_hierarchyFilter-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_hierarchydefiniert ist und sich in der Datei wp-includes/template.php befindet. Wenn also der $typepage ist, wird der Filter-Hook zu page_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:

  1. Custom Page Template: falls im Seiteneditor definiert.
  2. sub-directory/page-{slug}.php
  3. sub-directory/page-{url-encoded-slug}.php: nur für Multi-Byte-Zeichen.
  4. page-{slug}.php
  5. page-{url-encoded-slug}.php: nur für Multi-Byte-Zeichen.
  6. page-{id}.php
  7. page.php

Beispiel 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' );

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 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' );

Verwendungszweck:

Mit einem der obigen Codes erkennt WordPress page-{slug}.php Vorlagendateien im page-templates Verzeichnis Ihres Themas automatisch.

Angenommen, Sie haben eine about Seite. Wenn im Editor kein custom page template festgelegt ist, sucht WordPress nach THEME/page-templates/page-about.php-Vorlagendateien. Wenn dies nicht der Fall ist, sucht WordPress nach THEME/page-about.php-Vorlagendateien usw. (dh nach der Standard-Seitenvorlagenhierarchie). .

10
Fayaz