Как использовать получить часть шаблона()?


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

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

Author: Amit Erandole, 2011-02-21

3 answers

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

В принципе, 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 в их теме.

 29
Author: goldenapples, 2012-02-08 17:13:15

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

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

Если вы посмотрите на двадцать десять loop.php , вы можете видеть, что тогда двадцать десять диверсифицирует в пределах этого одного файла шаблона.

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

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

 5
Author: wyrfel, 2011-02-21 16:38:39

Из кодекса get_template_part:

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

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

Так эффективно это будет работать, как если бы вам требовался другой php-файл.

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

 4
Author: icc97, 2012-02-08 14:16:13