Определение настраиваемого шаблона страницы без собственного .php-файла

Есть ли способ определить шаблон страницы из какой-либо функции / filter / hook, без наличия .php-файла, содержащего комментарий в верхней части страницы, чтобы объявить имя шаблона?


Например, вместо этого:

некоторые-заказ страниц template.php

/** * Template Name: Some Custom Page Template */ 

другой обычай-страниц template.php

 /** * Template Name: Another Custom Page Template */ 

Интересно, могу ли я сделать что-то вроде:

functions.php

 wp_some_function_to_define_templates( 'Some Custom Page Template' ); wp_some_function_to_define_templates( 'Another Custom Page Template' ); 

EDIT : Я пишу сложную экспериментальную тему WP – это объектно-ориентированная, поскольку WP позволяет ей быть, у меня есть классы контроллера, чтобы решить, что отображать на каждой странице, классы DAO для извлечения данных из БД, Twig шаблоны для создания представлений и т. д. …

Я так много распространил код, что мои шаблоны страниц стали просто строкой кода, где я вызываю некоторый контроллер и позволяю ему выполнять задание, чтобы наконец создать шаблон Twig. Поэтому я решил переместить этот вызов контроллеру внутри фильтра template_include , так что мне даже не нужно вводить какой-либо код в шаблоны страниц …

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

Таким образом, у меня появилось около 15 PHP-файлов, содержащих только комментарии сверху с некоторым именем шаблона, чего я бы хотел избежать, указав эти шаблоны из некоторой функции …

Я пытаюсь изобрести колесо ? Может быть, в каком-то смысле, но я думаю, что это становится действительно крутой темой, очень поддающейся поддержке и модификацией …

Solutions Collecting From Web of "Определение настраиваемого шаблона страницы без собственного .php-файла"

WordPress читает шаблоны из заголовков файлов, а затем устанавливает их в кеш. используя wp_cache_set() над ключом, который получен из md5 имеет папку stylesheet.

Итак, просто переопределив этот кеш, мы можем отобразить нужные нам шаблоны. Чтобы переопределить этот кеш, нам нужно снова вызвать wp_cache_set() используя тот же ключ.

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

 function get_custom_page_templates() { $templates = array(); // maybe by options? --> $templates = get_option( 'custom_page_templates' ); // maybe by conf file? --> $templates = include 'custom_page_templates.php'; return apply_filters( 'custom_page_templates', $templates ); } 

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

Мы можем использовать крюк 'edit_form_after_editor' для первой области действия, 'load-post.php' и 'load-post.new' для второго:

 add_action( 'edit_form_after_editor', 'custom_page_templates_init' ); add_action( 'load-post.php', 'custom_page_templates_init_post' ); add_action( 'load-post-new.php', 'custom_page_templates_init_post' ); function custom_page_templates_init() { remove_action( current_filter(), __FUNCTION__ ); if ( is_admin() && get_current_screen()->post_type === 'page' ) { $templates = get_custom_page_templates(); // the function above if ( ! empty( $templates ) ) { set_custom_page_templates( $templates ); } } } function custom_page_templates_init_post() { remove_action( current_filter(), __FUNCTION__ ); $method = filter_input( INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_STRING ); if ( empty( $method ) || strtoupper( $method ) !== 'POST' ) return; if ( get_current_screen()->post_type === 'page' ) { custom_page_templates_init(); } } 

Последнее, что нам нужно сделать, написать set_custom_page_templates() которая отредактирует кеш, чтобы включить наши шаблоны, не забудьте объединить любые шаблоны, определенные заголовками файлов:

 function set_custom_page_templates( $templates = array() ) { if ( ! is_array( $templates ) || empty( $templates ) ) return; $core = array_flip( (array) get_page_templates() ); // templates defined by file $data = array_filter( array_merge( $core, $templates ) ); ksort( $data ); $stylesheet = get_stylesheet(); $hash = md5( get_theme_root( $stylesheet ) . '/' . $stylesheet ); $persistently = apply_filters( 'wp_cache_themes_persistently', false, 'WP_Theme' ); $exp = is_int( $persistently ) ? $persistently : 1800; wp_cache_set( 'page_templates-' . $hash, $data, 'themes', $exp ); } 

После запуска этого кода вы можете настроить пользовательские шаблоны только с помощью метода, который вы использовали в функции get_custom_page_templates() , здесь я использую фильтр:

 add_filter( 'custom_page_templates', function( $now_templates ) { $templates = array( 'some-custom-page-template' => 'Some Custom Page Template', 'another-custom-page-template' => 'Another Custom Page Template' , ); return array_merge( $now_templates, $templates ); } ); 

И вы сделали.

Если я понимаю вас, вы можете сделать это с помощью template_include hook. Например:

 add_filter( 'template_include', 'phpless_template'); function phpless_template( $template ) { get_header(); // some php get_footer(); die; } 

Я предлагаю вам более простой способ:

  1. В файле конфигурации / функций / индексах укажите конфигурационную переменную $config_template = false; (*)
  2. Создайте папку «include» (возможно, у вас ее уже есть)
  3. Поместите туда файлы-custom-page-template.php и еще один-custom-page-template.php
  4. В этих файлах просто присвойте значение $ config_template, а затем потребуйте страницу, которую вы используете для визуализации цикла – например: $config_template = 'some-custom-page'; require( "../index.php" ); $config_template = 'some-custom-page'; require( "../index.php" );
  5. В этом файле (index.php) вы можете хотеть, чтобы вы хотели, основываясь на значении $ config_template

Используя этот метод, вы не заставляете обычный рабочий процесс WP (это никогда не рекомендуется), но вы сохраняете свой проект достаточно чистым.

(*) Вероятно, вы уже используете какое-либо свойство объекта для управления вашими конфигурациями. Здесь вы поместите переменную $ config_template.