- Ещё раз о шаблонах
- load_template() – подключает PHP-файл с доступом к среде WordPress
- Параметры
- Пример 1. Подключаем файл из той же директории
- Пример 2. Подключаем файл и передаём в него параметры
- Способ 1. Передав новый аргумент в параметры запроса
- Способ 2. Используя массив $args
- Пример 3. Проверяем, что файл существует
- Миша
- load_template() │ WP 1.5.0
- Возвращает
- Использование
- Примеры
- #1 Подключение файла-шаблона в плагине, с возможностью его изменить в теме
- Заметки
- Список изменений
- Код load_template() load template WP 6.2.2
- Cвязанные функции
- Подключение файлов темы
Ещё раз о шаблонах
Рано или поздно девелоперу, создающему сайты статусом выше «сайт-визитка», приходится сталкиваться с таким понятием как «шаблоны» или «шаблонизация» визуального представления (не шаблоны проектирования). Что это такое? Механизм шаблонов позволяет отделять визуальное представление веб-приложения (по-скольку работаю только с веб-приложениями, то и рассуждать буду в этом контексте) от бизнес-логики таким образом, чтобы при изменении, например, внутренней логики попутно не приходилось переделывать всю html-верстку. На этом поприще уже давно существует несколько отдельно стоящих флагманских решений, позволяющих создавать довольно гибкие приложения в плане разделения труда дизайнеров-верстальщиков и программистов, а также предотвращать запутанность кода в больших приложениях. Описывать все их нет смысла. Это уже сделано до меня и не один раз. Помимо этого, почти каждая CMS и фрэймворк имеет собственные решения для отделения логики приложения от логики представления.
Конечно, когда речь идет о проекте в десятки тысяч строк кода, когда у заказчика есть возможность нанять и программиста, и верстальщика, то и функционал шаблонов будет только пользой для всех участников проекта. Но когда разработчик в простецкий сайт в 3 страницы начинает втуливать Smarty, это ИМХО уже перебор. В таких случаях я люблю вспоминать выражение Джорджа Шлоснейгла из его замечательной книги «Профессиональное программирование на PHP» – «попытка убить муху молтком».
Действительно, встраивая все тот же Smarty в весьма простой по функционалу сайт, разработчик попросту тратит время. А время, как известно, — деньги. Да и в большинстве случаев заказчику безразлично на каком шаблонизаторе будет работать его сайт. Заказчик больше печется о затраченном времени.
Что же делать, если сайт не «визитка», но и не второй Amazon? Лично я считаю, что в этом случае оптимальное решение проблемы — воспользоваться своей самописной системой шаблонов, весь функционал которой, заточен только для решения узкого круга задач, необходимых для текущего ресурса. Впоследствии вы, возможно, выведите свою «формулу» универсального шаблонизатора с неким минимальным набором функций, расширяемую по мере необходимости в отдельно взятом проекте.
Может показаться, что автор сей статьи весьма скептически относится к Smarty и другим шаблонизаторам. Это не так. Я довольно долго работал с проектом, в котором роль шаблонизатора выполнял все тот же Smarty. И хочу заметить, мне весьма понравилось использование этой системы шаблонов в контексте обширного по функционалу проекта.
- Возможность назначать переменные шаблону
- Отдельное пространство имен переменных для отдельно взятого html-шаблона
- Возможность использования одного шаблона для общего каркаса страницы во избежание повторения конструкций вида require ‘header.tpl’;… require ‘footer.tpl’; в каждом файле
- Проект является интернет-магазином или социальным сообществом
- 10-20 типов страниц. Подчеркиваю — НЕ страниц, а типов страниц. Например: страница описания товара. Т.е. html-шаблон для этого типа страниц будет один, но самих страниц, когда каталог заполнится контентом будет много
Рассмотрим простейший класс, который состоит всего из трех методов.
_tmpl = $filename; > public function assign($name, $value) < $this->_vars[$name] = $value; > public function render() < if (count($this->_vars) > 0) < extract($this->_vars); > $tmplPath ; if (file_exists($tmplPath)) < require $tmplPath; >else < throw new Exception("Шаблон _tmpl> не найден"); > > >
Давайте рассмотрим пример с применением этого класса. Создадим следующую структуру каталогов:
/wwwroot
|
— /classes
| — Template.php
— /templates
| — Main.tpl
| — Catalog.tpl
| — Product.tpl
| — Index.tpl
| — 404.tpl
|— index.php
Страница описания продукта №
Это главная страница сайта
/** * Буферизация вывода. * Все, что будет выводиться echo-м или print-ом, будет попадать в буфер, а не в браузер пользователю. */ ob_start(); // Подключаем шаблонизатор require dirname(__FILE__).'/classes/Template.php'; // Производим проверку маршрутизации и включаем необходимые шаблоны // Если не один из шаблонов не найден, отправляем клиенту код ошибки и показываем шаблон 404.tpl // Если маршрут не задан, выводим главную страницу if (isset($_GET['route']) && $_GET['route'] == 'catalog') < $tmpl = new Template('Catalog'); $tmpl->assign('ID', $_GET['ID']); $tmpl->render(); > else if ($_GET['route']) && $_GET['route'] == 'product') < $tmpl = new Template('Catalog'); $tmpl->assign('ID', $_GET['ID']); $tmpl->render(); > else if (!isset($_GET['route'])) < $tmpl = new Template('Index'); $tmpl->render(); > else < header("HTTP/1.0 404 Not Found"); $tmpl = new Template('404'); $tmpl->render(); > // Получаем содержимое буфера $content = ob_get_clean(); // Инициализируем шаблон каркаса страницы и выводим ранее сгенерированное содержимое $tmpl = new Template('Main'); $tmpl->assign('content', $content); $tmpl->render();
Как видно из примера, содержимое страниц catalog и product изменяется в зависимости от значения $_GET[‘ID’]. Т.о. мы получили два типа шаблонов и неограниченное количество страниц, генерируемых приложением из этих шаблонов.
Вывод: не стремитесь во всех проектах, которыми вы занимаетесь, использовать навороченные библиотеки шаблонизаторов, предоставляющих большое обилие всевозможных инструментов, в большинстве случаев не используемых в должном объеме. Лучше всего написать свое решение, которое поможет сэкономить время, системные ресурсы, а главное — нервы останутся в порядке.
load_template() – подключает PHP-файл с доступом к среде WordPress
Функция по сути подключает любой PHP-файл с доступной в нём средой WordPress, а также глобальными переменными $posts , $post , $wp_did_header , $wp_query , $wp_rewrite , $wpdb , $wp_version , $wp , $id , $comment , $user_ID .
Кроме того, массив $wp_query->query_vars , если существует, будет разобран на отдельные переменные php-функцией extract() . То есть $wp_query->query_vars[ ‘param1’ ] превратится в $param1 . Подробнее во втором примере. И ещё кое-что, параметр поиска $wp_query->query_vars[ ‘s’ ] также будет очищен функцией esc_attr().
Если вам интересно лучше разбираться, как устроены файлы тем в WordPress и как работает их иерархия, то рекомендую посмотреть этот видеоурок.
Функция сама по себе ничего не возвращает.
load_template( $_template_file, $require_once = true, $args = array() )
Параметры
- true – в этом случае файл будет подключаться PHP-функцией require_once() ,
- false – будет подключаться функцией require() .
Пример 1. Подключаем файл из той же директории
В этом примере предположим, что мы используем функцию load_template() в каком-либо файле, находщемся в папке с темой. И подключим другой файл, который находится в этой же папке.
load_template( dirname( __FILE__ ) . '/true-template.php' );
Попробуем сделать то же самое, но при помощи магической константы __DIR__ .
load_template( __DIR__ . '/true-template.php' );
Пробуем сделать то же самое, но при помощи функции get_stylesheet_directory().
load_template( get_stylesheet_directory() . '/true-template.php' );
Пример 2. Подключаем файл и передаём в него параметры
Способ 1. Передав новый аргумент в параметры запроса
В этом примере мы как раз-таки записываем произвольную переменную в массив $wp_query->query_vars , который при подключении файла будет разобран на отдельные переменные.
set_query_var( 'true_variable', 'Привет, файл' ); load_template( $template );
Вставляем этот код внутри подключаемого файла шаблона:
// выведет "Привет, файл" echo $true_variable; // элемент массива $wp_query->query_vars[ 'true_variable' ] превратился в переменную $true_variable
Способ 2. Используя массив $args
Этот аргумент функции появился только в версии WordPress 5.5, поэтому раньше приходилось довольствоваться первым способом.
load_template( $template, true, array( 'true_variable' => 'Привет, файл' ) );
Вставляем этот код внутри подключаемого файла шаблона:
// выведет "Привет, файл" echo $args[ 'true_variable' ];
Пример 3. Проверяем, что файл существует
Дело в том, что функция loa d_template() сразу же закидывает путь, который мы передаём в неё, в функции require() или require_once() , которые, в отключие от include() и include_once() будут выдавать PHP-ошибку 500 при попытке подключения несуществующего файла.
$template = __DIR__ . '/true-template.php'; if( file_exists( $template ) ) { load_template( $template ); }
Миша
Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.
Пишите, если нужна помощь с сайтом или разработка с нуля.
load_template() │ WP 1.5.0
Подключает указанный файл в PHP, с помощью require_once. Используется, чтобы быть уверенным, что среда WordPress уже установлена в момент подключения файла. Функция также устанавливает глобальные переменные: $posts , $post , $wp_did_header , $wp_query , $wp_rewrite , $wpdb , $wp_version , $wp , $id , $comment , $user_ID .
Хуки из функции
Возвращает
Использование
load_template( $_template_file, $require_once, $args );
$_template_file(cтрока) (обязательный) Серверный путь до файла, который нужно подключить. $require_once(логический) true — будет подключать файл с помощью require_once, false — с помощью require.
Если подключение файла происходит внутри цикла и этот параметр указан в true , то первый элемент цикла отобразиться корректно, а следующие элементы выведутся как копии 1 элемента.
По умолчанию: true $args(массив) (С WP 5.5) Дополнительные параметры для подключаемого файла. Используйте переменную $args в подключаемом файле.
По умолчанию: array()
Примеры
#1 Подключение файла-шаблона в плагине, с возможностью его изменить в теме
Предположим мы создаем плагин и в нем нам нужно указать файл шаблона, который будет использоваться в теме. Логично, что для разных тем файл шаблона будет разный и нам нужно оставить возможность изменять файл шаблона из темы. Для этого мы подключим нужный там файл, только в том случае, если он не определен в теме:
if ( $overridden_template = locate_template('some-template.php') ) < // locate_template() вернет путь до файла, если дочер. или родит. тема имеет такой файл load_template( $overridden_template ); >else < // если файл не найден в теме или доч. теме, загружаем файл из каталога 'templates' плагина load_template( dirname( __FILE__ ) . '/templates/some-template.php' ); >
Заметки
- Global. Массив. $posts
- Global. WP_Post. $post Global post object.
- Global. true|false. $wp_did_header
- Global. WP_Query. $wp_query WordPress Query object.
- Global. WP_Rewrite. $wp_rewrite WordPress rewrite component.
- Global. wpdb. $wpdb WordPress database abstraction object.
- Global. Строка. $wp_version
- Global. WP. $wp Current WordPress environment instance.
- Global. int. $id
- Global. WP_Comment. $comment Global comment object.
- Global. int. $user_ID
Список изменений
Код load_template() load template WP 6.2.2
function load_template( $_template_file, $load_once = true, $args = array() ) < global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID; if ( is_array( $wp_query->query_vars ) ) < /* * This use of extract() cannot be removed. There are many possible ways that * templates could depend on variables that it creates existing, and no way to * detect and deprecate it. * * Passing the EXTR_SKIP flag is the safest option, ensuring globals and * function variables cannot be overwritten. */ // phpcs:ignore WordPress.PHP.DontExtract.extract_extract extract( $wp_query->query_vars, EXTR_SKIP ); > if ( isset( $s ) ) < $s = esc_attr( $s ); >/** * Fires before a template file is loaded. * * @since 6.1.0 * * @param string $_template_file The full path to the template file. * @param bool $load_once Whether to require_once or require. * @param array $args Additional arguments passed to the template. */ do_action( 'wp_before_load_template', $_template_file, $load_once, $args ); if ( $load_once ) < require_once $_template_file; >else < require $_template_file; >/** * Fires after a template file is loaded. * * @since 6.1.0 * * @param string $_template_file The full path to the template file. * @param bool $load_once Whether to require_once or require. * @param array $args Additional arguments passed to the template. */ do_action( 'wp_after_load_template', $_template_file, $load_once, $args ); >
Cвязанные функции
Подключение файлов темы
- comments_template()
- get_footer()
- get_header()
- get_parent_theme_file_path()
- get_parent_theme_file_uri()
- get_search_form()
- get_sidebar()
- get_stylesheet_directory()
- get_stylesheet_directory_uri()
- get_stylesheet_uri()
- get_template_directory()
- get_template_directory_uri()
- get_template_part()
- get_theme_file_path()
- get_theme_file_uri()
- get_theme_root_uri()
- is_page_template()
- locate_template()