Существует ли файл шаблона по умолчанию для дочерних страниц / подстраниц?
Это кажется очень простым вопросом. Я ищу что-то вроде sub-page.php или page-child.php, где я мог бы делать различные вещи на дочерних страницах моей темы.
Они достаточно отличаются по дизайну и содержанию, поэтому мне приходится использовать много PHP или CSS-класс .page-child для выполнения всей черновой работы. Я ищу более простой метод.
Одно условие - я хотел бы, чтобы это происходило автоматически, чтобы мне не приходилось говорить клиенту "убедитесь, что вы всегда выбираете шаблон 'subpage' при создании подстраницы!", что довольно ненадежно.

Это на самом деле очень просто, добавьте следующий код в ваш файл 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

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

Специального шаблона для дочерних страниц не существует, но вы можете легко реализовать это с помощью функции 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.

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

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

Моя модификация решения 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' );

Я назначил конкретный шаблон для дочерней страницы, используя Шаблоны страниц.
У меня есть такой корневой путь: 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
*/ ?>
После назначения шаблона нужной странице
