¿Hay alguna manera de usar get_template_part() con carpetas?

6 feb 2013, 09:47:07
Vistas: 34.4K
Votos: 33

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

0
Todas las respuestas a la pregunta 3
3
52

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.

6 feb 2013 10:18:20
Comentarios

¡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).

Atadj Atadj
6 feb 2013 15:30:12

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

Dalton Rooney Dalton Rooney
13 feb 2013 19:34:32

@Sebastien De hecho puedes hacer ex:

<?php get_template_part('partials/file'); ?>

HauntedSmores HauntedSmores
16 may 2019 02:00:53
2

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 );
6 feb 2013 10:00:39
Comentarios

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

lowtechsun lowtechsun
30 sept 2017 03:42:10

get_template_part establece $require_once en false por una razón: OP quiere usar la función para llamar partes reutilizables...

Isaac Lubow Isaac Lubow
2 jun 2020 10:06:11
0

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.

6 feb 2013 09:58:32