Последние пару часов я искал способ создать собственный шаблон страницы в плагине, но пока мне не повезло.
Что я конкретно пытаюсь сделать, это добавить опцию в список доступных шаблонов страниц при редактировании страницы, а не использовать какой-либо другой метод, такой какif( is_page( 'page-slug' ) ) { /* etc */ }
Есть ли глобальная переменная, которую я могу изменить, чтобы сделать это?
Редактировать:
В настоящее время я использую этот код, основываясь на ссылке, которую мне дал @ m0r7if3r в комментарии, проблема в том, что он будет запускать эту функцию при просмотре страницы, но не при редактировании страницы (для заполнения раскрывающегося списка шаблонами страниц) :
class JW_SiteGrader {
private static $instance;
private function __construct() {
add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );
}
public static function getInstance() {
// Return the class data in a Singleton fashion
if (self::$instance == null)
self::$instance = new JW_SiteGrader();
return self::$instance;
}
public function sitegrader_template_redirect() {
add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );
}
public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {
if ( !is_array( $template_names ) )
return '';
$located = '';
$this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );
foreach ( $template_names as $template_name ) {
if ( !$template_name )
continue;
if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {
$located = STYLESHEETPATH . '/' . $template_name;
break;
} else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {
$located = TEMPLATEPATH . '/' . $template_name;
break;
} else if ( file_exists( $this_plugin_dir . $template_name ) ) {
$located = $this_plugin_dir . $template_name;
break;
}
}
if ( $load && '' != $located )
load_template( $located, $require_once );
return $located;
}
public function sitegrader_page_template( $template ) {
$object = get_queried_object();
if ( 'page' == $object->post_type ) {
// New
$templates[] = "page-sitegrader.php";
// Like in core
$templates[] = "page-{$object->post_type}.php";
$templates[] = "page.php";
return locate_template( $templates );
}
// return apply_filters('page_template', $template);
return $template;
}
}
Изменить 2:
Похоже, что эта функциональность будет выпущена в будущем обновлении, я прочитал немало билетов об этом, и было некоторое обсуждение, но никакого реального ответа (в надежде на 3.4). Здесь будут перечислены URL-адреса trac tickets.
Изменить 3:
Приведенный выше код работает, НО, единственная проблема, с которой я столкнулся на данный момент, заключается в том, что при редактировании / добавлении новой страницы нет шаблона, добавляемого в раскрывающийся список. Я пробую несколько вещей и скоро обновлю свой вопрос.
page_template
хук, код выше в моем редактировании - то, что используется в настоящее время. Нужно ли использоватьtemplate_redirect
крючок, а затем добавитьpage_template
туда фильтр?Ответы:
Фильтры? Кто-нибудь?
Там нет фильтра, чтобы помочь:
page_template_dropdown($template);
используется для построения выпадающего списка, и он не фильтруется.Пробирается в массив шаблонов?
Для создания выпадающего содержимого используется основной мета-блок
get_page_templates()
. Изнутри функция выглядит следующим образом:Но при просмотре
get_themes();
тогда швов не будет возможности перехватить список шаблонов. Более того, у нас проблема в том, что нет возможности получить шаблон из-за пределов каталога тем…... Подделка темы!
Теория и ее недостатки…
Вы можете использовать
register_theme_directory()
для добавления дополнительного каталога тем, где вы можете разместить шаблоны. Так что проще всего было бы зарегистрировать свой плагин как папку с темами:Примечание: это где я не уверен, будет ли это работать .
Во время активации плагина: Затем вы должны поместить
style.css.php
файл в вашуtemplates
папку. Это позволит вам добавить переменные в ваш файл. Эта переменная будет родительской темой. И родительская тема должна быть просто активной в данный момент. Затем обновите вашу активную тему для вашего плагина.Недостаток № 2: Об интерфейсе »Внешний вид« UI… Возможно, добавьте примечание, что эта «Тема» не предназначена для использования в качестве актуальной Темы. Я оставляю остальную часть материала «Избегайте активации этой темы» на ваше воображение. Во всяком случае: это должно работать.
Недостаток № 2: Этот трюк успешно избегает дочерних тем. Вам разрешено иметь одну родительскую тему. Ничего больше.
источник
В качестве предложения для возможного обходного пути вы рассматривали возможность использования файловой системы WordPress для записи файла шаблона страницы из вашего плагина в каталог текущей активной темы? В зависимости от того, насколько вы хотите контролировать этот процесс, ваш плагин может записать файл при активации и удалить его при удалении. В качестве альтернативы вы можете динамически создавать файлы шаблонов страниц из пользовательского интерфейса плагина, используя форму для передачи определенных значений, таких как имя шаблона страницы, которое должно отображаться в раскрывающемся списке экрана редактирования поста. Теоретически можно также удалить шаблон страницы из пользовательского интерфейса плагина одним нажатием кнопки и аналогичным образом добавить несколько шаблонов для разных целей. В блоге Отто есть хороший пост об использовании файловой системы. У меня нет связи со мной сейчас, но вы можете найти ее.
Я надеюсь, что они выпустят то, что вы намеревались сделать, в следующем выпуске ядра.
источник
Я просмотрел источник, и довольно шокирующе, я не вижу способа сделать это! Я предложил бы добавить второй мета-блок с выпадающим списком переопределения темы / второй темы. Затем подключите этот фильтр:
вернуть файл темы, если он был переопределен. Конечно, вы можете добавить add_filter только в том случае, если вам нужен пост.
Если вы хотите проявить фантазию, вы можете удалить оригинальную коробку и воссоздать ее (конечно, через фильтры, не модифицируя основной код).
Я также предложил бы добавить trac-билет, запрашивающий эту функцию (если его там еще нет).
источник
Я достиг этого в прошлом, удалив метаблок шаблона страницы по умолчанию, а затем добавив свой собственный метабокс. У меня был новый метабокс, использующий встроенные get_page_templates, а затем добавил остальные, которые мне нужны программно. При сохранении он может обновить шаблон страницы так же, как это делает WordPress.
источник
Посмотрите на ловушку
theme_page_templates
, используемуюget_page_templates
функцией, фильтр добавлен с 3.9, обновлен в 4.4:источник
Результат поиска с DuckDuckGo, который добавил шаблон страницы WordPress, нашел ответ для меня на странице wpmu.org под названием Учебное пособие по шаблонам пользовательских страниц WordPress .
По сути, в каталоге темы, wp-content / themes / your-theme , скопируйте существующий шаблон страницы в новое имя php-файла по вашему выбору. Отредактируйте новый файл, следя за тем, чтобы изменить волшебное значение свойства «Имя шаблона:» в комментарии вверху файла.
Это было все, что было с этим. Возможно, это особенность, которая ставит вопрос позже. Я использую WP 3.5 с темой nine_eleven.
Также возможно, что есть более чистые способы расширения темы. Такие изменения могут быть перезаписаны обновлениями темы. Моя вина.
источник