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

25

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

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

Амит Эрандол
источник
1
Попробуйте посмотреть на codex.wordpress.org/Function_Reference/get_template_part
вау

Ответы:

25

Некоторые очень хорошие вводные ответы здесь.

По сути, 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 .

goldenapples
источник
2
Замените locate_template этим, пожалуйста. include(locate_template( 'loop-mycustomposttype.php')) Таким способом можно передавать переменные. Я нашел эту ссылку здесь . Это чрезвычайно полезно!
Пабло С.Г. Пачеко
1
Для этого необходимо изменить это, если также. Как этоif ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Пабло С.Г. Пачеко
1
О, хорошая мысль. С формулой, которую я дал, вызов requireor require_once(from locate_template) находится внутри функции и поэтому не имеет доступа к текущей области.
золотые яблоки
5

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

Шаблон loop.php просто запускает элементы цикла и форматирует их. Смотрите документацию в Кодексе .

Если вы посмотрите на Twenty-Ten's loop.php, вы увидите, что Twenty-Ten затем диверсифицируется в пределах одного файла шаблона.

get_template_part()просто загружает часть шаблона и проходит через нее. Вы также можете извлечь части вашего loop.php в отдельные файлы и заменить их get_template_part('loop', 'category')вызовами a и т. Д.

Или вы могли бы иметь шаблон части для каждого отдельного сообщения в цикле и иметь только свой loop.php вызов get_template_part('loop','post');в while...предложении. Все зависит от вас.

wyrfel
источник
3

Из кодекса get_template_part :

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

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

Так эффективно это будет работать так, как будто вам нужен еще один php-файл.

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

icc97
источник