Как использовать 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'))
Таким образом можно передавать переменные. Я нашел это здесь ссылка. Это чрезвычайно полезно!

При таком подходе также нужно будет изменить это условие. Вот так if ( false === include(locate_template( 'loop-mycustomposttype.php')) )

Не все циклы, а именно главный цикл. ;-) Неважно, смотрите ли вы на главную страницу, категорию или что-то ещё — у вас всегда будет главный цикл. Содержимое этого цикла определяется запросом, который выполняется до того, как ваш шаблон вообще будет вызван.
Шаблон 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
.
