¿Hay alguna manera de usar get_template_part() con carpetas?
Me pregunto si hay alguna manera de usar get_template_part() con carpetas. Mi carpeta principal tiene muchos archivos ahora porque puse cada elemento reutilizable en un archivo separado. Me gustaría ponerlos en carpetas entonces.
No hay información sobre esto en el Codex: http://codex.wordpress.org/Function_Reference/get_template_part

De hecho puedes hacerlo, tengo una carpeta en mi directorio de temas llamada /partials/
y en esa carpeta tengo archivos como latest-articles.php
, latest-news.php
y latest-statements.php
y cargo estos archivos usando get_template_part()
así:
get_template_part('partials/latest', 'news');
get_template_part('partials/latest', 'articles');
get_template_part('partials/latest', 'statements');
Solo no olvides omitir la extensión .php
del nombre del archivo.

¡Gracias! Es tan simple que es una pena que no lo descubriera antes. Estaba convencido de que no era posible porque el Codex no lo menciona. Esta pregunta trajo respuestas más interesantes, pero esta es la más simple, por lo que probablemente sea la más útil para la persona promedio :) (así que déjenla marcada con el tick verde).

Afortunadamente es posible editar el Codex, así que la próxima persona no tendrá el mismo problema. :-)

Me temo que no. Si en el codex no encuentras lo que necesitas, intenta seguir el enlace al código fuente y échale un vistazo tú mismo al código para intentar entenderlo.
He revisado y la función get_template_part está definida así:
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);
}
De esto puedes deducir que la función get_template_part simplemente genera un nombre de archivo php y llama a la función locate_template. Esto no es útil, así que también revisé la función 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;
}
La función locate_template busca el archivo php especificado desde get_template_part. Pero puedes llamar a locate_template directamente desde tu código. Y esto sí es útil.
Prueba este código en lugar de la función get_template_part('loop-sigle.php') (tu archivo está ubicado en mydir dentro de tu tema):
locate_template( 'mydir/loop-single.php', true, true );

Atajo interesante, me pregunto si tendrá alguna consecuencia negativa en la secuencia de carga o en el contenido de los archivos.

Las notas de la función get_template_part()
dicen:
Notas
- Usa: locate_template()
- Usa: do_action() Llama a la acción 'get_template_part_{$slug}'.
Lo que te permite hacer uso de locate_template()
, que dice:
Busca primero en STYLESHEETPATH antes que TEMPLATEPATH para que los temas que heredan de un tema padre puedan sobrescribir un solo archivo.
Si defines TEMPLATEPATH
con el subdirectorio que deseas usar, get_template_part()
buscará los archivos en tu subdirectorio.
