Как использовать get_template_part()?
Не могли бы вы объяснить, как работает эта функция? Я знаю, что она делает, но когда я смотрю исходный код в шаблоне twenty_ten, я не понимаю, как все циклы собираются в одном файле loop.php (я видел этот файл тоже).
Так как, например, вынести определенную общую часть шаблона и затем повторно использовать ее в других шаблонах?
Здесь приведены очень хорошие вводные ответы.
По сути, функция get_template_part() позволяет разработчикам тем устанавливать порядок специфичности файлов шаблонов. Думайте об этом аналогично специфичности, как она применяется к CSS-селекторам. При проектировании чего-либо вы хотите начать с минимальной специфичности, чтобы её можно было легко переопределить в частях дизайна, требующих индивидуального подхода.
Например, вы стилизуете блог и создаёте файл loop.php, который хорошо подходит для разметки записей. Но вы заранее планируете и вызываете его в своих файлах шаблонов с дополнительными спецификаторами контекста — скажем, на главной странице вы вызываете get_template_part( 'loop', 'index' );, в шаблоне одиночной записи вы вызываете get_template_part( 'loop', 'single' );, на страницах архивов вы вызываете get_template_part( 'loop', 'archive' );, и так далее. Это значительно упрощает работу в будущем, когда вы решите разметить цикл на страницах архивов иначе, чем на главной странице: просто создайте шаблон loop-archive.php, и он будет использоваться вместо общего loop.php.
Но магия функции get_template_part() заключается в функции locate_template(), которая сначала проверяет директорию темы, а затем родительскую директорию (если она существует) на наличие указанного файла. Это очень полезно для разработки плагинов. В одном из своих плагинов я определяю пользовательский тип записи и создаю файл шаблона цикла для этого типа записи в директории плагина. Но... я хочу позволить темам, использующим мой плагин, переопределять мою разметку, если они захотят. Вот где locate_template() действительно творит чудеса.
locate_template($template_names, $load = false, $require_once = true )
будет искать каждый из имён в массиве $template_names в директории стилей, затем в директории шаблона. Передача 'true' в качестве аргумента $load означает, что она подключит первый найденный файл и вернёт пустую строку, если файл шаблона не был найден. Таким образом, я могу сделать что-то вроде этого в своём плагине:
if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
include( 'loop-mycustomposttype.php' );
...что, надеюсь, должно значительно упростить кастомизацию моего плагина для разработчиков тем — достаточно просто добавить файл с именем loop-mycustomposttype.php в свою тему.
Замените locate_template на это, пожалуйста.
include(locate_template( 'loop-mycustomposttype.php'))
Таким образом можно передавать переменные. Я нашел это здесь ссылка. Это чрезвычайно полезно!
Pablo S G Pacheco
При таком подходе также нужно будет изменить это условие. Вот так if ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo S G Pacheco
Не все циклы, а именно главный цикл. ;-) Неважно, смотрите ли вы на главную страницу, категорию или что-то ещё — у вас всегда будет главный цикл. Содержимое этого цикла определяется запросом, который выполняется до того, как ваш шаблон вообще будет вызван.
Шаблон loop.php просто проходит по элементам цикла и форматирует их. Подробнее в документации Codex.
Если посмотреть на loop.php в Twenty-Ten, можно заметить, что Twenty-Ten затем разветвляется внутри этого единственного файла шаблона.
get_template_part() просто загружает часть шаблона и обрабатывает её. Вы также можете вынести части вашего loop.php в отдельные файлы и заменить их вызовами типа get_template_part('loop', 'category') и так далее.
Или можно создать частичные шаблоны для каждого отдельного поста в цикле и сделать так, чтобы ваш loop.php вызывал только get_template_part('loop','post'); внутри условия while.... Всё зависит от ваших предпочтений.
<?php get_template_part( 'loop', 'index' ); ?>выполнит PHP require() для первого существующего файла...
Фактически это работает так, как если бы вы подключали другой PHP-файл.
Обновление: Есть небольшое отличие от 'require' - код обернут в функцию, поэтому для передачи переменных из шаблона в подключаемую часть нужно использовать global.