it-roy-ru.com

Как переместить шаблоны страниц в пользовательскую папку?

Я создал шаблоны страниц, которые используют слаг страницы, например, page-contact.php, page-gallery.php и т.д. Или идентификатор страницы, например, page-2.php, page-11.php и т.д.

Как я могу переместить эти шаблоны в подпапку, например /mytheme/pages/?

5
Den

/ YOUR_THEME/page-templates/будет работать только для пользовательских шаблонов страниц, назначенных на экране редактирования страницы администратора, но не для именованных шаблонов page- $ slug или page- $ id.

Правильный хук фильтра на мой взгляд - page_template, но вы (я полагаю!) Не хотите выбрасывать какие-либо другие возможные шаблоны для ваших страниц, не в последнюю очередь потому, что у вас обязательно есть несколько страниц на вашем сайте, для которых у вас нет не сделал файл шаблона /my-sub-dir/page-$slug.php.

Хук фильтра page_template вызывается сразу после того, как WP нашел шаблон для страницы, используя стандартную иерархию шаблонов. Было бы удобно, если бы существовал фильтр, позволяющий вам вставить ваш дополнительный шаблон в правую часть иерархии шаблонов, но в отсутствие этого нам нужно будет повторить поиск шаблонов страниц из собственной функции get_page_template () WordPress, находится в /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 );
}

Эта функция создает массив возможных шаблонов для страниц. Затем get_query_template () использует locate_template (), чтобы запустить массив и вернуть имя файла первого найденного шаблона.

Поскольку мы не можем подключиться к списку предлагаемых шаблонов, нам, к сожалению, придется дублировать некоторые из этих работ.

Вот наша собственная функция:

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

Предостережения:

1 - Я не проверял это, но если вы хотите поэкспериментировать с иерархией шаблонов, тогда вы наверняка сможете следить, тестировать и корректировать мой код, который в большинстве случаев скопирован из WP.

2 - Если будущий основной код когда-либо изменит иерархию шаблонов для страниц, приведенный выше код устареет.

4
Andy Macaulay-Brook

Я разместил детали на этот ответ . Здесь КОД корректируется на основе двух конкретных различий этого вопроса:

  1. Переместите шаблоны страниц в подкаталог, не отступая. Например, он будет проверять THEME/sub-directory/page-{slug}.php, но будет не проверять THEME/page-{slug}.php, потому что это то, что спросил OP. Однако вариант с запасным вариантом в другом ответе лучше, особенно в случае дочерней темы (поскольку родительская тема может зависеть от запасного варианта).

  2. Он переместит и page-{slug}.php, и page-{id}.php в подкаталог.


Фильтр Hook для использования:

Лучший способ переместить шаблоны страниц в подкаталог, скажем, /THEME/page-templates/, - это использоватьpage_template_hierarchyfilter hook.

Примечание:исходная ловушка фильтра -{$ type} _template_hierarchy, которая становится page_template_hierarchy, когда $type равен page.

Образец кода:

<?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 распознает файлы шаблонов в/YOUR_THEME/page-templates /: https://developer.wordpress.org/themes/basics/organizing-theme-files/#page-templates-folder

0
Landing on Jupiter