Как использовать get_template_part()?

21 февр. 2011 г., 18:17:19
Просмотры: 120K
Голосов: 33

Не могли бы вы объяснить, как работает эта функция? Я знаю, что она делает, но когда я смотрю исходный код в шаблоне twenty_ten, я не понимаю, как все циклы собираются в одном файле loop.php (я видел этот файл тоже).

Так как, например, вынести определенную общую часть шаблона и затем повторно использовать ее в других шаблонах?

1
Комментарии

Попробуйте посмотреть http://codex.wordpress.org/Function_Reference/get_template_part

wow wow
21 февр. 2011 г. 20:12:56
Все ответы на вопрос 3
3
32

Здесь приведены очень хорошие вводные ответы.

По сути, функция 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 в свою тему.

8 февр. 2012 г. 19:13:15
Комментарии

Замените locate_template на это, пожалуйста. include(locate_template( 'loop-mycustomposttype.php'))

Таким образом можно передавать переменные. Я нашел это здесь ссылка. Это чрезвычайно полезно!

Pablo S G Pacheco Pablo S G Pacheco
9 янв. 2014 г. 02:52:03

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

Pablo S G Pacheco Pablo S G Pacheco
9 янв. 2014 г. 03:03:47

О, хорошее замечание. С формулой, которую я дал, вызов require или require_once (из locate_template) находится внутри функции и поэтому не имеет доступа к текущей области видимости.

goldenapples goldenapples
10 янв. 2014 г. 18:53:15
0

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

Шаблон 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.... Всё зависит от ваших предпочтений.

21 февр. 2011 г. 18:38:39
0

Из кодекса get_template_part:

<?php get_template_part( 'loop', 'index' ); ?>

выполнит PHP require() для первого существующего файла...

Фактически это работает так, как если бы вы подключали другой PHP-файл.

Обновление: Есть небольшое отличие от 'require' - код обернут в функцию, поэтому для передачи переменных из шаблона в подключаемую часть нужно использовать global.

8 февр. 2012 г. 13:02:16