Существует ли файл шаблона по умолчанию для дочерних страниц / подстраниц?

15 июн. 2012 г., 05:47:55
Просмотры: 25K
Голосов: 6

Это кажется очень простым вопросом. Я ищу что-то вроде sub-page.php или page-child.php, где я мог бы делать различные вещи на дочерних страницах моей темы.

Они достаточно отличаются по дизайну и содержанию, поэтому мне приходится использовать много PHP или CSS-класс .page-child для выполнения всей черновой работы. Я ищу более простой метод.

Одно условие - я хотел бы, чтобы это происходило автоматически, чтобы мне не приходилось говорить клиенту "убедитесь, что вы всегда выбираете шаблон 'subpage' при создании подстраницы!", что довольно ненадежно.

0
Все ответы на вопрос 4
2
16

Это на самом деле очень просто, добавьте следующий код в ваш файл functions.php:

add_filter(
    'page_template',
    function ($template) {
        global $post;

        if ($post->post_parent) {

            // получаем родительскую страницу верхнего уровня
            $parent = get_post(
               reset(array_reverse(get_post_ancestors($post->ID)))
            );

            // или ...
            // если вам нужен ближайший родительский пост вместо этого
            // $parent = get_post($post->post_parent);

            $child_template = locate_template(
                [
                    $parent->post_name . '/page-' . $post->post_name . '.php',
                    $parent->post_name . '/page-' . $post->ID . '.php',
                    $parent->post_name . '/page.php',
                ]
            );

            if ($child_template) return $child_template;
        }
        return $template;
    }
);

Затем вы можете подготовить шаблоны по следующим шаблонам:

  • [slug-родительской-страницы]/page.php
  • [slug-родительской-страницы]/page-[slug-дочерней-страницы].php
  • [slug-родительской-страницы]/page-[ID-дочернего-поста].php
25 февр. 2016 г. 11:05:55
Комментарии

Это очень недооцененный ответ, он гораздо более универсален, чем принятое решение. +1 от меня и еще +1 за использование анонимной функции.

gbinflames gbinflames
7 нояб. 2018 г. 01:07:55

Будет ли это работать с отношениями родитель > дочерний > дочерний дочернего элемента, и если да, то как? Спасибо!

Drewdavid Drewdavid
24 нояб. 2019 г. 05:01:30
3
15

Специального шаблона для дочерних страниц не существует, но вы можете легко реализовать это с помощью функции get_template_part().

Сначала создайте файл с названием "content-child.php".

Затем создайте файл с названием "content.php".

Далее, внутри файла page.php, разместите следующий код:

if( $post->post_parent !== 0 ) {
    get_template_part('content', 'child');
} else {
    get_template_part('content');
}

Весь контент, который должен отображаться на дочерних страницах, размещайте в файле content-child.php. Контент для обычных (не дочерних) страниц размещайте в файле content.php.

15 июн. 2012 г. 06:42:18
Комментарии

Мне удалось заставить этот код работать. Оказалось, что не нужно было разделять его так сильно, как я думал, поэтому я просто адаптировал ваш код и использовал его в page.php в нескольких конкретных случаях. CSS-селектор 'page-child' помог сгладить углы. Спасибо!

timshutes timshutes
15 июн. 2012 г. 08:29:32

Отлично! Отличное решение. Как установить другой шаблон для Родительская > Дочерняя > Дочерняя? Спасибо!

Brightweb Brightweb
26 июл. 2012 г. 00:23:16

Тот же вопрос, что и у Brightweb...

Drewdavid Drewdavid
24 нояб. 2019 г. 05:00:11
1

Моя модификация решения OzzyCzech, представленного выше. Эта функция ищет в корневой директории темы файлы, имя которых содержит slug или ID родительской страницы.

  • /theme_root/child-PARENT_SLUG.php
  • /theme_root/child-PARENT_ID.php
function child_templates($template) {
    global $post;

    if ($post->post_parent) {
        // получаем страницу верхнего уровня (родителя)
        $parent = get_post(
            reset(array_reverse(get_post_ancestors($post->ID)))
        );

        // находим шаблон дочерней страницы по slug или ID родителя
        $child_template = locate_template(
            [
                'child-' . $parent->post_name . '.php',
                'child-' . $parent->ID . '.php',
                'child.php',
            ]
        );

        if ($child_template) return $child_template;
    }

    return $template;
}
add_filter( 'page_template', 'child_templates' );
7 мар. 2019 г. 18:44:06
Комментарии

Привет - Будет ли это работать с отношениями родитель > дочерний > дочерний для дочернего элемента, и если да, то как? Спасибо!

Drewdavid Drewdavid
24 нояб. 2019 г. 05:01:47
0

Я назначил конкретный шаблон для дочерней страницы, используя Шаблоны страниц.

У меня есть такой корневой путь: localhost:8001/my-custom-post-type/page-one/page-one-sub-child

Создайте шаблон страницы, как указано в документации.

В моем случае это файл page_panoramica.php, где я написал:

<?php /* 
  * Template Name: Page Panoramica
  * Template Post Type: my-custom-post-type
*/ ?>

После назначения шаблона нужной странице

Изображение назначения шаблона страницы

29 мар. 2023 г. 12:17:52