Можно ли использовать get_template_part() с папками?
Интересно, можно ли использовать get_template_part() с папками? В моей основной папке сейчас много файлов, потому что я поместил каждый повторно используемый элемент в отдельный файл. Я хотел бы распределить их по папкам.
В Codex нет информации об этом: http://codex.wordpress.org/Function_Reference/get_template_part

На самом деле это возможно. У меня есть папка в директории темы под названием /partials/
, и в этой папке находятся файлы, такие как latest-articles.php
, latest-news.php
и latest-statements.php
. Я загружаю эти файлы с помощью функции get_template_part()
следующим образом:
get_template_part('partials/latest', 'news');
get_template_part('partials/latest', 'articles');
get_template_part('partials/latest', 'statements');
Только не забудьте не указывать расширение .php
в имени файла.

Спасибо! Это настолько просто, что даже стыдно, что я сам до этого не додумался. Я был уверен, что это невозможно, потому что в Codex об этом не упоминается. Этот вопрос получил много интересных ответов, но данный — самый простой, поэтому, вероятно, он будет наиболее полезен для обычного пользователя :) (так что пусть он будет отмечен зеленой галочкой).

К счастью, Codex можно редактировать, так что следующий человек не столкнётся с той же проблемой. :-)

Боюсь, что нет. Если в кодексе нет того, что вы хотели бы узнать, попробуйте перейти по ссылке к исходному коду и изучить его самостоятельно, чтобы разобраться.
Я изучил и функция get_template_part определена следующим образом:
function get_template_part( $slug, $name = null ) {
do_action( "get_template_part_{$slug}", $slug, $name );
$templates = array();
if ( isset($name) )
$templates[] = "{$slug}-{$name}.php";
$templates[] = "{$slug}.php";
locate_template($templates, true, false);
}
Из этого видно, что функция get_template_part просто формирует имя php-файла и вызывает функцию locate_template. Это не очень информативно, поэтому я также изучил функцию locate_template:
function locate_template($template_names, $load = false, $require_once = true ) {
$located = '';
foreach ( (array) $template_names as $template_name ) {
if ( !$template_name )
continue;
if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
$located = STYLESHEETPATH . '/' . $template_name;
break;
} else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
$located = TEMPLATEPATH . '/' . $template_name;
break;
}
}
if ( $load && '' != $located )
load_template( $located, $require_once );
return $located;
}
Функция locate_template ищет php-файл, указанный в get_template_part. Но вы можете вызывать locate_template напрямую из своего кода. И это полезно.
Попробуйте этот код вместо функции get_template_part('loop-sigle.php') (если ваш файл находится в папке mydir внутри вашей темы):
locate_template( 'mydir/loop-single.php', true, true );

Интересный способ, интересно, есть ли у него негативные последствия для последовательности загрузки или содержимого файлов.

В примечаниях к функции get_template_part()
указано:
Примечания
- Использует: locate_template()
- Использует: do_action() Вызывает действие 'get_template_part_{$slug}'.
Что позволяет использовать locate_template()
, в описании которой сказано:
Поиск сначала выполняется в STYLESHEETPATH, затем в TEMPLATEPATH, чтобы темы, наследующие от родительской темы, могли просто переопределять файлы.
Если вы определите TEMPLATEPATH
с подкаталогом, который хотите использовать, get_template_part()
будет искать файлы в вашем подкаталоге.
