Intereting Posts
Файлы JavaScript, зарегистрированные в родительской теме, не будут загружаться при вызове wp_enqueue_script () в дочерней теме? Возврат одной персонализированной почты из нескольких мета-запросов Пользовательский тип поиска по типу с использованием $ _SESSION и pre_get_posts Маленькое введение перед последними сообщениями в блоге in_widget_form обнаруживает идентификатор боковой панели Плагин для редактирования параметров в многопользовательском режиме? Обновление групповой категории не обновляется Удалить строку из базы данных Создайте точку изображения для размещения URL-адреса вместо страницы вложения Ошибка: переназначение контента другому пользователю не поддерживается на многопользовательском API настроек – получение имени скрытого ввода / отправки Следующая и предыдущая ссылка перерывает код на последнем сообщении WordPress как веб-приложение – всегда автоматическое сохранение сообщений и метаданных Многоузловая ошибка? – Восстановить настройки сети. Как сделать событие, когда любой пользователь обновляет свой профиль?

Как создать дочернюю систему, как отключить шаблоны родителей?

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

С уважением

Solutions Collecting From Web of "Как создать дочернюю систему, как отключить шаблоны родителей?"

Как сказал @toscho, это сложно. Но это выполнимо.

В основном вам нужно найти крючки действий, вызываемые до и после выпадающего шаблона, и вызвать ob_start() чтобы инициировать буферизацию вывода и ob_get_clean() чтобы захватить буферный HTML. Для 'submitpage_box' будут работать крючки 'submitpage_box' и 'edit_page_form' соответственно.

После того, как вы захватили буферный HTML, вам нужно получить список шаблонов дочерних страниц, которые, к сожалению, требуют дублирования большого количества кода из WordPress, потому что ядро ​​не делает код повторно используемым, чтобы получить список шаблонов страниц только для дочернего шаблон. Вы можете найти код, необходимый в методе get_child_page_templates() в приведенном ниже коде, который почти полностью представляет собой состав нужного кода из ядра WordPress.

После того как у вас есть буферный HTML-код, вам нужно получить список шаблонов дочерних страниц, необходимых для удаления <options> s из <select> , которые не являются шаблонами страниц из дочерней темы, но обязательно 'default' опцию 'default' . Вы можете сделать это через сложную пару регулярных выражений, функции preg_match() и preg_match_all() и цикл foreach() вы добавляете только HTML для шаблонов дочерней темы в свой список, а затем объединяете их обратно в HTML, появился до и после списка <option> s

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

Вот исходный код для моего класса Omit_Parent_Theme_Page_Templates который вам нужен:

 <?php class Omit_Parent_Theme_Page_Templates { function __construct() { add_action( 'submitpage_box', array( $this, '_submitpage_box' ) ); add_action( 'edit_page_form', array( $this, '_edit_page_form' ) ); } function _submitpage_box() { ob_start(); } function _edit_page_form() { $html = ob_get_clean(); $select_regex = '<select\s*name="page_template"\s*id="page_template".*?>'; preg_match( "#^(.*{$select_regex})(.*?)(</select>.*)$#sm", $html, $outer_match ); preg_match_all( "#(<option\s*value='([^']+)'.*?>(.*?)</option>)#sm", $outer_match[2], $inner_matches, PREG_SET_ORDER ); $child_page_templates = $this->_get_child_page_templates(); foreach( $inner_matches as $index => $matches ) if ( isset( $child_page_templates[$matches[2]] ) ) $child_page_templates[$matches[2]] = $inner_matches[$index][0]; $html = $outer_match[1] . implode( "\n", $child_page_templates ). $outer_match[3]; echo $html; } private function _get_child_page_templates() { $child_page_templates = array( 'default' => true ); $files = wp_get_theme()->get_files( 'php', 1 ); foreach ( $files as $file => $full_path ) { if ( ! preg_match( '|[^]]Template Name:(.*)$|mi', file_get_contents( $full_path ), $header ) ) continue; $child_page_templates[ $file ] = true; } return $child_page_templates; } } new Omit_Parent_Theme_Page_Templates(); 

Поскольку WordPress не предоставляет перехваты для того, что вы хотите, этот код намного сложнее, чем хотелось бы. Он использует технику – модификацию HTML, записанную в выходном буфере, – это, как правило, «взлом». Но учитывая природу того, что мы меняем, я не думаю, что это может сильно разорваться, если WordPress не изменит атрибуты id или name <select> или в корне не изменит, как работают шаблоны страниц, ни одна из которых очень вероятна.

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

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

ОБНОВИТЬ:

Ах, черт возьми. Решил превратить это в плагин и опубликовать его в репозитории плагинов WordPress, нажмите здесь, чтобы открыть его. Наверное, я не беспокоился, чтобы не публиковать его. 🙂

Начиная с версии 3.9, вы можете сделать это легко, используя фильтр theme_page_templates .

Вам просто нужно использовать что-то вроде этого:

 add_filter( 'theme_page_templates', 'my_remove_page_template' ); function my_remove_page_template( $pages_templates ) { unset( $pages_templates['onecolumn-page.php'] ); return $pages_templates; } 

Дальнейшее чтение:

Чтобы сгенерировать раскрывающийся список, WordPress вызывает page_template_dropdown() , который вызывает get_page_templates() , который (по крайней мере, с WP 3.4) вызывает wp_get_theme()->get_page_templates() (т.е. WP:Theme::get_page_templates() для активной темы).

Последний метод проходит через фактические файлы .php темы, чтобы найти любой файл с заголовком Template Name: и кэширует результат. Пока никаких действий или фильтров не предоставляется.

В качестве альтернативы ответа Майка мы могли бы изменить кеш. Менее хакерское, чем регулярное выражение, но все равно взломано. Позволяет подключить его к admin_head-post.php , поэтому он запускается только при показе редактора сообщений.

В приведенном ниже примере шаблон page-home.php удален из списка.

 add_action("admin_head-post.php", "my_admin_head_post"); function my_admin_head_post() { // Run template fetching once so the template list is cached. $templates = wp_get_theme()->get_page_templates(); // Generate cache hash, just like WP_Theme::__construct() does. $cache_hash = md5(WP_CONTENT_DIR."/themes/".get_stylesheet()); $cache_key = "page_templates-".$cache_hash; // Remove unwanted templates from the list and save changes. unset($templates['page-home.php']); wp_cache_replace($cache_key, $templates, "themes", 1800); } не add_action("admin_head-post.php", "my_admin_head_post"); function my_admin_head_post() { // Run template fetching once so the template list is cached. $templates = wp_get_theme()->get_page_templates(); // Generate cache hash, just like WP_Theme::__construct() does. $cache_hash = md5(WP_CONTENT_DIR."/themes/".get_stylesheet()); $cache_key = "page_templates-".$cache_hash; // Remove unwanted templates from the list and save changes. unset($templates['page-home.php']); wp_cache_replace($cache_key, $templates, "themes", 1800); } 

Для вашей конкретной проблемы, когда вы хотите удалить шаблоны родительской темы из списка, к счастью, существует открытый метод WP_Theme::parent() который WP_Theme::parent() объект в качестве другого объекта WP_Theme . Следующий (непроверенный) код должен сделать трюк:

 function my_admin_head_post() { $theme = wp_get_theme(); $parent = $theme->parent(); if(!is_a($parent, "WP_Theme")) return; $templates = $theme->get_page_templates(); $parent_templates = $parent->get_page_templates(); $cache_hash = md5(WP_CONTENT_DIR."/themes/".get_stylesheet()); $cache_key = "page_templates-".$cache_hash; foreach($templates as $id => $template) { if(isset($parent_templates[$id])) unset($templates[$id]); } wp_cache_replace($cache_key, $templates, "themes", 1800); } не function my_admin_head_post() { $theme = wp_get_theme(); $parent = $theme->parent(); if(!is_a($parent, "WP_Theme")) return; $templates = $theme->get_page_templates(); $parent_templates = $parent->get_page_templates(); $cache_hash = md5(WP_CONTENT_DIR."/themes/".get_stylesheet()); $cache_key = "page_templates-".$cache_hash; foreach($templates as $id => $template) { if(isset($parent_templates[$id])) unset($templates[$id]); } wp_cache_replace($cache_key, $templates, "themes", 1800); } 

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