WordPress

rozwój motywu — Jak przenieść pliki szablonów stron, takie jak page-{slug}.php do podkatalogu?

  • 22 sierpnia, 2018
  • 6 min read
rozwój motywu — Jak przenieść pliki szablonów stron, takie jak page-{slug}.php do podkatalogu?


Jak ładowane są szablony stron:

Zgodnie z domyślną hierarchią szablonów WordPress, a page request ładuje szablon w oparciu o priorytet i nazewnictwo, jak podano poniżej:

  1. Custom Page Template: jeśli zdefiniowano w edytorze stron.
  2. page-{slug}.php
  3. page-{url-encoded-slug}.php: tylko dla znaków wielobajtowych.
  4. page-{id}.php
  5. page.php
  6. singular.php
  7. index.php

Wśród nich, singular.php I index.php Czy nie właściwie szablony stron. singular.php jest szablonem zastępczym dla dowolnych typów pojedynczych postów i index.php to najlepszy szablon zastępczy dla wszystkiego, co ma ładować szablon WordPress. Zatem pierwszych pięć to szablony stron.

Jak wstrzyknąć pliki szablonów z podkatalogu w hierarchii:

Podstawowa funkcja WordPressa get_page_template() generuje niezbędne page tablicę hierarchii szablonów i tuż przed podjęciem decyzji, który plik szablonu ma zostać załadowany z hierarchii, WordPress uruchamia funkcję page_template_hierarchy hak do filtra. Najlepszym więc sposobem jest dodanie podkatalogu, w którym WordPress będzie szukać page-{slug}.php templates automatycznie, polega na użyciu tego filtra i wstrzyknięciu odpowiednich nazw plików w odniesieniu do tego podkatalogu w tablicy hierarchii szablonów stron.

Notatka: oryginalny zaczep filtra jest zaczepem filtra dynamicznego zdefiniowanym jako {$type}_template_hierarchyktóry znajduje się w wp-includes/template.php plik. Kiedy więc $type Jest pagehak filtra staje się page_template_hierarchy.

Teraz dla naszych celów wstrzykniemy plik sub-directory/page-{slug}.php nazwa pliku tuż przed page-{slug}.php w tablicy hierarchii szablonów przekazanej do funkcji wywołania zwrotnego hooków. W ten sposób WordPress się załaduje sub-directory/page-{slug}.php plik, jeśli istnieje, w przeciwnym razie będzie przestrzegał normalnej hierarchii ładowania szablonów strony. Oczywiście dla zachowania konsekwencji nadal będziemy dawać Custom Page Template wyższy priorytet w porównaniu do naszego sub-directory/page-{slug}.php plik. Zatem zmodyfikowana hierarchia szablonów stron będzie wyglądać następująco:

  1. Custom Page Template: jeśli zdefiniowano w edytorze stron.
  2. sub-directory/page-{slug}.php
  3. sub-directory/page-{url-encoded-slug}.php: tylko dla znaków wielobajtowych.
  4. page-{slug}.php
  5. page-{url-encoded-slug}.php: tylko dla znaków wielobajtowych.
  6. page-{id}.php
  7. page.php

Próbka functions.php KOD:

Jeśli planujesz dokonać tej zmiany tylko w jednym motywie, możesz użyć następującego KODU w aktywnym motywie functions.php plik:

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

Przykładowa wtyczka:

Jeśli chcesz zastosować tę samą organizację plików szablonów w wielu motywach, najlepiej jest zachować tę funkcję oddzielnie od motywu. W takim przypadku zamiast modyfikować motyw functions.php plik z powyższym przykładowym KODEM, będziesz musiał stworzyć prostą wtyczkę z tym samym przykładowym KODEM.

Warto przeczytać!  personalizacja - Niestandardowa lista komentarzy, odpowiednia głębokość

Zapisz następujący KOD z nazwą pliku, np page-slug-template-subdir.php w Twoim WordPressie plugins informator:

<?php
/*
Plugin Name:  WPSE Page Template page-slug.php to Sub Directory
Plugin URI:   
Description:  Page Template with page-{slug}.php to a Sub Directory
Version:      1.0.0
Author:       Fayaz Ahmed
Author URI:   
*/

// 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;
}
// the original filter hook is {$type}_template_hierarchy,
// which is located in wp-includes/template.php file
add_filter( 'page_template_hierarchy', 'wpse312159_page_template_add_subdir' );

Stosowanie:

Dzięki któremukolwiek z powyższych KODÓW WordPress rozpozna page-{slug}.php pliki szablonów wewnątrz page-templates katalog Twojego motywu automatycznie.

Powiedzmy na przykład, że masz about strona. Jeśli więc nie ma custom page template set z edytora, następnie WordPress będzie szukać THEME/page-templates/page-about.php szablon, a jeśli taki nie istnieje, WordPress będzie go szukać THEME/page-about.php plik szablonu i tak dalej (tj. domyślna hierarchia szablonów stron).


Źródło

Warto przeczytać!  php — Wordpress zwraca stronę błędu „Łącze, z którego korzystałeś, wygasło” za każdym razem, gdy dodaję nową witrynę, dodaję użytkownika itp.