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

31 июл. 2015 г., 20:53:14
Просмотры: 52.3K
Голосов: 8

Нажмите "Страницы" -> Нажмите "Добавить новую"

На экране добавления новой страницы шаблоном по умолчанию выбран "Шаблон по умолчанию". Есть ли способ изменить опцию по умолчанию, например, на "Мой другой шаблон"? Чтобы при нажатии "Добавить новую" всегда был выбран "Мой другой шаблон"? Это нужно сделать до сохранения страницы. Я могу сделать это с помощью JS. Есть ли такая опция в WordPress?

ОБНОВЛЕНИЕ:

Вот пример:

Варианты шаблонов:

  • Шаблон по умолчанию (выбирается автоматически)
  • Мой шаблон 1
  • Мой шаблон 2

Есть ли способ в WordPress изменить на:

  • Шаблон по умолчанию
  • Мой шаблон 1 (выбирается автоматически)
  • Мой шаблон 2

Я думал, может быть это можно сделать с помощью функции:

if (некое_условие_выполнено)
 default_template = Мой шаблон 1
endif

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

4
Комментарии

Я знаю, что это не отвечает на ваш вопрос, но почему бы просто не изменить шаблон? Таким образом, шаблон по умолчанию (page.php или другой) останется корректным и будет использовать нужный вам скрипт.

jdm2112 jdm2112
31 июл. 2015 г. 21:03:42

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

gdaniel gdaniel
31 июл. 2015 г. 21:08:01

Иерархия шаблонов WordPress предлагает несколько вариантов для рассмотрения. Возможно, вы найдете ответ там. https://developer.wordpress.org/themes/basics/template-hierarchy/

jdm2112 jdm2112
31 июл. 2015 г. 21:19:30

Я понимаю, как работает иерархия шаблонов. Мне просто интересно, существует ли вариант (кроме JavaScript) изменить шаблон, выбранный по умолчанию, на экране редактирования страницы (при создании новой страницы). Вот и всё. И поскольку суть вопроса игнорируется, полагаю, что такого варианта не существует.

gdaniel gdaniel
31 июл. 2015 г. 21:21:42
Все ответы на вопрос 6
4

Использование 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);
5 июл. 2016 г. 15:56:34
Комментарии

Но как это на самом деле реализовано?

JGallardo JGallardo
16 сент. 2017 г. 01:20:09

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

Adrian B Adrian B
18 сент. 2017 г. 15:47:46

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

Przemek Maczewski Przemek Maczewski
10 февр. 2019 г. 13:36:11

Хотя значение текста изменится, вам нужно будет нажать сохранить, чтобы ACF (например) сработал и показал соответствующие поля и т.д.

Jacob Raccuia Jacob Raccuia
30 янв. 2022 г. 20:30:33
0

Я не тестировал этот код, но он может работать. Шаблон выбирается на основе значения в глобальном объекте поста, поэтому нам нужно изменить это значение в объекте поста перед отображением метабокса. Код, который выбирает значение по умолчанию в выпадающем списке, находится здесь: 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";
    }
}
31 июл. 2015 г. 22:11:38
0

Самый простой способ, который я нашел, без взлома кода — это создать отдельный файл page.php (отдельно от ваших файлов page_template-name.php) и использовать get_template_part() для перенаправления к вашему шаблону. Это обеспечивает шаблон по умолчанию для всего сайта, а также сохраняет шаблон как отдельную опцию.

<?php get_template_part('page_template-name'); ?>

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

8 сент. 2017 г. 11:23:05
3

Мне удалось реализовать это в новом блоковом редакторе (Гутенберг).

Для решения задачи потребовался хук в ответ 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;
}
10 февр. 2019 г. 13:27:37
Комментарии

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

glass duo glass duo
24 мар. 2020 г. 21:51:31

Этот код сломает сайт, и вам потребуется его переустановить.

Elias Prado Elias Prado
13 дек. 2020 г. 05:35:29

У меня не работает. Шаблон вроде меняется, но в базе данных остается старое значение шаблона.

raftaar1191 raftaar1191
13 июн. 2023 г. 18:13:03
0

Используйте фильтр 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;
}
1 авг. 2015 г. 10:18:48
0

Для меня это успех:

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);
23 мар. 2023 г. 10:10:57