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

10

Ich möchte Seitenvorlagendateien wie page-{slug}.phpin ein Unterverzeichnis innerhalb meines Themas verschieben, so dass WordPress sie automatisch erkennt. Wenn die Seitenvorlagen dieses Formulars nicht im Unterverzeichnis vorhanden sind, sollte WordPress auf die Standardregeln zum Laden von Vorlagen zurückgreifen. Wie kann ich das erreichen?

Hinweis 1: Diese Frage und die entsprechenden Antworten gelten 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 für eine übersichtlichere Dateiorganisation in ein Unterverzeichnis verschieben.

Manifestator
quelle
2
Vielleicht lohnt es sich, sie in Seitenvorlagen anstelle von page-slug.php zu ändern? Core unterstützt das Vorhandensein von
Seitenvorlagen

Antworten:

12

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:

  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 singular.phpund index.phpsind eigentlich keine Seitenvorlagen. singular.phpist die Fallback-Vorlage für einzelne Beitragstypen und index.phpdie 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 pageArray für die Vorlagenhierarchie. Kurz bevor Sie genau entscheiden, welche Vorlagendatei aus der Hierarchie geladen werden soll, löst WordPress den page_template_hierarchyFilter-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_hierarchyist und sich in derwp-includes/template.phpDatei befindet. Wenn diesder Fall$typeistpage, wird der Filterhakenpage_template_hierarchy .

Für unseren Zweck fügen wir nun den sub-directory/page-{slug}.phpDateinamen unmittelbar zuvor page-{slug}.phpin das Vorlagenhierarchie-Array ein, das an die Hooks-Rückruffunktion übergeben wird. Auf diese Weise lädt WordPress sub-directory/page-{slug}.phpDateien, falls vorhanden, andernfalls folgt es der normalen Hierarchie zum Laden von Seitenvorlagen. Um die Konsistenz aufrechtzuerhalten, geben wir natürlich immer noch Custom Page Templateeine höhere Priorität als unseresub-directory/page-{slug}.php Datei. Die geänderte Seitenvorlagenhierarchie wird also wie folgt:

  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

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.phpDatei 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.phpin Ihrem WordPress- pluginsVerzeichnis:

<?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}.phpVorlagendateienpage-templates automatisch Verzeichnis Ihres Themas.

Angenommen, Sie haben eine aboutSeite. Wenn es also keinen custom page templateSatz aus dem Editor gibt, sucht WordPress nach THEME/page-templates/page-about.phpVorlagendateien. Wenn dies nicht vorhanden ist, sucht WordPress nach THEME/page-about.phpVorlagendateien usw. (dh der Standardhierarchie der Seitenvorlagen).

Fayaz
quelle