Как изменить выбор шаблона страницы по умолчанию?
Нажмите "Страницы" -> Нажмите "Добавить новую"
На экране добавления новой страницы шаблоном по умолчанию выбран "Шаблон по умолчанию". Есть ли способ изменить опцию по умолчанию, например, на "Мой другой шаблон"? Чтобы при нажатии "Добавить новую" всегда был выбран "Мой другой шаблон"? Это нужно сделать до сохранения страницы. Я могу сделать это с помощью JS. Есть ли такая опция в WordPress?
ОБНОВЛЕНИЕ:
Вот пример:
Варианты шаблонов:
- Шаблон по умолчанию (выбирается автоматически)
- Мой шаблон 1
- Мой шаблон 2
Есть ли способ в WordPress изменить на:
- Шаблон по умолчанию
- Мой шаблон 1 (выбирается автоматически)
- Мой шаблон 2
Я думал, может быть это можно сделать с помощью функции:
if (некое_условие_выполнено)
default_template = Мой шаблон 1
endif
Я знаю, как работает иерархия шаблонов. Я знаю, как сделать так, чтобы мой шаблон всегда использовался для определенных страниц. Но это не тот вопрос. Я просто пытаюсь упростить работу конечному пользователю, чтобы при определенных условиях можно было предварительно выбрать шаблон, который должен использоваться для группы страниц, но при этом оставить пользователю возможность переключиться на другой шаблон при необходимости.
Использование template_include
(как предложил Брэд Далтон) изменяет шаблон страницы только на фронтенде, но не в админке при редактировании страницы.
С другой стороны, изменение значения в объекте записи перед отрисовкой метабокса, как предложил czerspalace, действительно работает! Я добавил проверку, чтобы это применялось только когда $post->page_template
не установлен, вот так:
function wpse196289_default_page_template() {
global $post;
if ( 'page' == $post->post_type
&& 0 != count( get_page_templates( $post ) )
&& get_option( 'page_for_posts' ) != $post->ID // Не страница для отображения записей
&& '' == $post->page_template // Только когда page_template не установлен
) {
$post->page_template = "page-mytemplate.php";
}
}
add_action('add_meta_boxes', 'wpse196289_default_page_template', 1);

Приведенный выше код должен работать в файле functions.php вашей темы (или в пользовательском плагине). Вам нужно заменить строку page-mytemplate.php
на имя, соответствующее желаемому шаблону страницы в вашей теме.

Вы вдохновили меня сделать это в новом блоковом редакторе (Gutenberg) с использованием хука фильтра "rest_prepare_{$post_type}".

Я не тестировал этот код, но он может работать. Шаблон выбирается на основе значения в глобальном объекте поста, поэтому нам нужно изменить это значение в объекте поста перед отображением метабокса. Код, который выбирает значение по умолчанию в выпадающем списке, находится здесь: https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/meta-boxes.php#L751
add_action('add_meta_boxes', 'wpse196289_default_page_template', 1);
function wpse196289_default_page_template() {
global $post;
if ( 'page' == $post->post_type && 0 != count( get_page_templates( $post ) ) && get_option( 'page_for_posts' ) != $post->ID ) {
if( $my_conditions )
$post->page_template = "page-mytemplate.php";
}
}

Самый простой способ, который я нашел, без взлома кода — это создать отдельный файл page.php (отдельно от ваших файлов page_template-name.php) и использовать get_template_part() для перенаправления к вашему шаблону. Это обеспечивает шаблон по умолчанию для всего сайта, а также сохраняет шаблон как отдельную опцию.
<?php get_template_part('page_template-name'); ?>
Это всё, что нужно поместить в ваш файл page.php. Он просто загружает ваш шаблон по умолчанию. Если вы хотите изменить шаблон для всего сайта, вы можете просто изменить слаг. Любая страница, у которой выбран вариант по умолчанию, изменится. Любая страница, для которой явно установлен другой шаблон (например, template-1 вместо default), не изменится.

Мне удалось реализовать это в новом блоковом редакторе (Гутенберг).
Для решения задачи потребовался хук в ответ REST API.
Условия я взял из ответа Эдриана.
foreach ( array( 'page', 'post' ) as $post_type ) :
add_filter( "rest_prepare_{$post_type}", 'wpse196289_rest_set_default_page_template', 1, 2 );
endforeach;
function wpse196289_rest_set_default_page_template( $data, $post ) {
if ( 0 != count( get_page_templates( $post ) ) && get_option( 'page_for_posts' ) != $post->ID && '' == $data->data['template'] ) :
$data->data['template'] = 'page-mytemplate.php';
endif;
return $data;
}

Когда я реализовал этот код, редактор устанавливал мой шаблон в указанный мною шаблон, однако при попытке обновления я получал сообщения "Ошибка обновления".

Используйте фильтр template_include
в файле functions.php вместе с условным тегом.
add_filter( 'template_include', 'default_page_template', 99 );
function default_page_template( $template ) {
if ( is_singular( 'page' ) ) {
$default_template = locate_template( array( 'default-page-template.php' ) );
if ( '' != $default_template ) {
return $default_template ;
}
}
return $template;
}

Для меня это успех:
function wpse196289_default_page_template() {
global $post;
if ( 'page' == $post->post_type
&& 0 != count( get_page_templates( $post ) )
&& get_option( 'page_for_posts' ) != $post->ID // Не страница для записей
&& '' == $post->page_template // Только когда шаблон страницы не задан
) {
//print_r(get_page_templates( $post )); получить список шаблонов
//Array([Elementor Canvas] => elementor_canvas [Elementor Full Width] => elementor_header_footer [Theme] => elementor_theme)
$post->page_template = "elementor_header_footer"; // установить нужный шаблон
}
}
add_action('add_meta_boxes', 'wpse196289_default_page_template', 1);
