Как добавить параметр в список шаблонов страниц из плагина?

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

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

Похоже, что эта функциональность будет выпущена в будущем обновлении, я прочитал немало билетов на trac об этом, и было некоторое обсуждение, но нет реального ответа (надеясь на 3.4). Здесь будут перечислены URL-адреса для отслеживания билетов.

Редактировать 3:

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

Фильтры? Кто угодно?

Там нет фильтра: page_template_dropdown($template); используется для создания выпадающего списка и не фильтруется.

Прокрасться в массив шаблонов?

Чтобы создать раскрывающееся содержимое, в мета-окне ядра используется get_page_templates() . Изнутри функция выглядит следующим образом:

 $themes = get_themes(); $theme = get_current_theme(); $templates = $themes[$theme]['Template Files']; 

Но при просмотре get_themes(); то там швы не могут перехватить список шаблонов. Более того, у нас есть проблема, что нет возможности получить шаблон из-за пределов каталога тем …

… Подделка темы!

Теория и недостатки …

Вы можете использовать register_theme_directory() чтобы добавить дополнительный каталог тем, где вы можете разместить шаблоны. Поэтому проще всего зарегистрировать ваш плагин в качестве папки тем:

 // Register during init hook: register_theme_directory( plugin_dir_path( __FILE__ ).'templates' ); 

Примечание. Здесь я не уверен, что это сработает .

Во время активации плагина: Затем вы должны поместить файл style.css.php внутри вашей папки templates . Это позволит вам добавлять переменные в ваш файл. Тогда эта переменная будет родительской. И родительская тема должна быть просто активной темой. Затем обновите свою активную тему в своем плагине.

Недостаток # 2: О «Внешний вид» «UI … Возможно, добавьте примечание о том, что эта« тема »не предназначена для использования в качестве фактической темы. Я оставляю остальную часть »Избегайте активировать эту тему« все до вашего воображения. Во всяком случае: он должен работать.

Недостаток # 2: этот трюк успешно предотвратит дочерние темы. Вам разрешено иметь одну родительскую тему. Больше ничего.

В качестве предложения для потенциальной работы вы рассмотрели использование файловой системы WordPress для записи файла шаблона страницы из вашего плагина в текущий активный каталог тем? В зависимости от того, какой контроль вы хотите в этом процессе, вы можете подключить свой плагин к файлу при активации и удалить его при удалении. В качестве альтернативы вы могли бы динамически создавать файлы шаблонов страниц из своего пользовательского интерфейса плагина, используя форму для передачи определенных значений, таких как имя шаблона страницы, которое должно появиться в раскрывающемся списке экрана редактирования сообщений. Вы также можете теоретически удалить шаблон страницы из своего пользовательского интерфейса для плагина одним нажатием кнопки и добавить несколько шаблонов для разных целей. Есть хорошая статья об использовании файловой системы в блоге Отто. У меня нет ссылки со мной сейчас, но вы можете ее искать.

Я надеюсь, что они выпустят то, что вы намеревались сделать, за счет крючка в следующем выпуске ядра.

Я просмотрел источник, и довольно шокирующе не кажется, что это способ сделать это! Моим предлагаемым взломом было бы добавить второй мета-ящик с раскрывающимся надзором темы / второй темы. Затем подключите этот фильтр:

 # wp-includes/theme.php line 751 in 3.3.1: return apply_filters( "{$type}_template", locate_template( $templates ) ); 

чтобы вернуть файл темы, если он был переопределен. Конечно, вы хотите только add_filter, если это сообщение, которое вы хотите.

Если вы хотите быть фантазией, вы можете отказаться от оригинальной коробки и заново ее создать (через фильтры, конечно, не изменяя код ядра).

Я также предлагаю добавить билет на трассу с запросом на эту функциональность (если ее еще нет).

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

Посмотрите на hook theme_page_templates , который используется функцией get_page_templates , добавлен фильтр с get_page_templates 3.9, обновленной в 4.4:

 apply_filters( 'theme_page_templates', $page_templates, $this, $post ); 

Результат поиска с помощью DuckDuckGo добавляет шаблон страницы WordPress, который отобрал ответ для меня на странице wpmu.org под названием WordPress Custom Template Tutorial .

По существу, внутри каталога тем, wp-content / themes / your-theme , скопируйте существующий шаблон страницы в новое имя файла php по вашему выбору. Отредактируйте новый файл, позаботившись изменить значение свойства «Имя шаблона:» в комментарии в верхней части файла.

Вот и все. Возможно, это функция, которая отправляет вопрос. Я использую WP 3.5 с темой двадцать_eleven.

Также возможно, что существуют более чистые способы расширения темы. Такие изменения могут быть перезаписаны обновлениями темы. Моя вина.