it-swarm.com.de

Wie verschiebe ich Seitenvorlagen in einen benutzerdefinierten Ordner?

Ich habe Seitenvorlagen erstellt, die den Seitenblock verwenden, z. B. page-contact.php, page-gallery.php usw. oder die Seiten-ID, z. B. page-2.php, page-11.php usw.

Wie kann ich diese Vorlagen in einen Unterordner verschieben, zum Beispiel /mytheme/pages/?

5
Den

/ YOUR_THEME/page-templates/funktioniert nur für benutzerdefinierte Seitenvorlagen, die auf dem Bearbeitungsbildschirm der Verwaltungsseite zugewiesen wurden, nicht für Vorlagen mit dem Namen page- $ slug oder page- $ id.

Meiner Ansicht nach lautet der richtige Filterhook page_template, aber Sie möchten (ich nehme an!) Keine anderen möglichen Vorlagen für Ihre Seiten herausgeben, nicht zuletzt, weil Sie verpflichtet sind, einige Seiten auf Ihrer Site zu haben, für die Sie einen Port haben Es wurde keine /my-sub-dir/page-$slug.php-Vorlagendatei erstellt.

Der Filter-Hook page_template wird aufgerufen, nachdem WP eine Vorlage für die Seite unter Verwendung der Standardvorlagenhierarchie gefunden hat. Es wäre praktisch, wenn es einen Filter gäbe, mit dem Sie Ihre zusätzliche Vorlage in den rechten Teil der Vorlagenhierarchie einfügen könnten. Andernfalls müssen wir die Suche nach Seitenvorlagen über die WordPress-eigene Funktion get_page_template () replizieren. gefunden in /wp-includes/template.php:

function get_page_template() {
    $id = get_queried_object_id();
    $template = get_page_template_slug();
    $pagename = get_query_var('pagename');

    if ( ! $pagename && $id ) {
        // If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object
        $post = get_queried_object();
        if ( $post )
            $pagename = $post->post_name;
    }

    $templates = array();
    if ( $template && 0 === validate_file( $template ) )
        $templates[] = $template;
    if ( $pagename )
        $templates[] = "page-$pagename.php";
    if ( $id )
        $templates[] = "page-$id.php";
    $templates[] = 'page.php';

    return get_query_template( 'page', $templates );
}

Diese Funktion erstellt ein Array möglicher Vorlagen für Pages. get_query_template () verwendet dann locate_template (), um das Array zu durchlaufen und den Dateinamen der ersten gefundenen Vorlage zurückzugeben.

Da wir uns der Liste der vorgeschlagenen Vorlagen nicht anschließen können, müssen wir leider einige dieser Arbeiten duplizieren.

Hier ist unsere eigene Funktion:

function tbdn_get_page_template() {
    $id = get_queried_object_id();
    $template = get_page_template_slug();
    $pagename = get_query_var('pagename');

    if ( ! $pagename && $id ) {
        // If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object
        $post = get_queried_object();
        if ( $post )
            $pagename = $post->post_name;
    }

    $templates = array();

    if ( $template && 0 === validate_file( $template ) )
        $templates[] = $template;
    // if there's a custom template then still give that priority

    if ( $pagename )
        $templates[] = "our-sub-dir/page-$pagename.php";
    // change the default search for the page-$slug template to use our directory
    // you could also look in the theme root directory either before or after this

    if ( $id )
        $templates[] = "our-sub-dir/page-$id.php";
    $templates[] = 'page.php';

    /* Don't call get_query_template again!!!
       // return get_query_template( 'page', $templates );
       We also reproduce the key code of get_query_template() - we don't want to call it or we'll get stuck in a loop .
       We can remove lines of code that we know won't apply for pages, leaving us with...
    */

    $template = locate_template( $templates );

    return $template;
}

add_filter( 'page_template', 'tbdn_get_page_template' );

Vorsichtsmaßnahmen:

1 - Ich habe dies nicht getestet, aber wenn Sie mit der Vorlagenhierarchie herumspielen wollen, sollten Sie auf jeden Fall in der Lage sein, meinen Code, der meistens von WP kopiert wird, zu testen und anzupassen.

2 - Wenn zukünftiger Kerncode jemals die Vorlagenhierarchie für Seiten ändert, ist der obige Code nicht mehr aktuell.

4

Ich habe die Details auf diese Antwort gepostet. Hier wird der CODE basierend auf zwei spezifischen Unterschieden dieser Frage angepasst:

  1. Verschieben Sie Seitenvorlagen in ein Unterverzeichnis, ohne darauf zurückzugreifen. Zum Beispiel wird THEME/sub-directory/page-{slug}.php geprüft, aber es wird nicht THEME/page-{slug}.php geprüft, weil das OP danach gefragt hat. Die Option mit Fallback in der anderen Antwort ist jedoch besser, insbesondere bei untergeordneten Themen (da das übergeordnete Thema möglicherweise vom Fallback abhängt).

  2. Es werden sowohl page-{slug}.php als auch page-{id}.php in das Unterverzeichnis verschoben.


Zu verwendender Filterhaken:

Der beste Weg, um Seitenvorlagen in ein Unterverzeichnis zu verschieben, beispielsweise /THEME/page-templates/, ist die Verwendung despage_template_hierarchyFilter-Hooks.

Hinweis:der ursprüngliche Filter-Hook ist{$ type} _template_hierarchy, der zu page_template_hierarchy wird, wenn $typepage ist.

Beispielcode:

<?php
/*
Plugin Name:  WPSE Page Template move to Sub Directory
Plugin URI:   https://wordpress.stackexchange.com/a/227006/110572
Description:  WPSE Page Template move 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 wpse227006_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;
    $cnt = count( $templates );
    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;
    }

    // the last one in $templates is page.php, so
    // all but the last one in $templates starting from $page_tpl_idx will be moved to sub-directory
    for( $i = $page_tpl_idx; $i < $cnt - 1; $i++ ) {
        $templates[$i] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$i];
    }

    return $templates;
}
// the original filter hook is {$type}_template_hierarchy,
// wihch is located in wp-includes/template.php file
add_filter( 'page_template_hierarchy', 'wpse227006_page_template_add_subdir' );
1
Fayaz

WordPress erkennt Vorlagendateien in/YOUR_THEME/page-templates /: https://developer.wordpress.org/themes/basics/organizing-theme-files/#page-templates-folder

0