¿Es posible anular el resultado de get_template_part ()?

11

Estoy trabajando en un tema infantil. Prefiero no reemplazar los archivos de la plantilla principal para mantener la simplicidad del tema infantil y minimizar la cantidad de código y mantenimiento a lo largo del tiempo.

En el bucle, la plantilla index.php en el tema principal utiliza: get_template_part( 'content' );

que traerá content.php , estoy buscando que se comporte más como get_template_part( 'content', get_post_format() ); o similar para traer diferentes plantillas como content-aside.php , etc., sin crear un index.php en el tema secundario para sobrescribir al padre para un solo cambio de línea.

get_template_part() consiste en:

function get_template_part( $slug, $name = null ) {

    do_action( "get_template_part_{$slug}", $slug, $name );
    $templates = array();
    $name = (string) $name;
    if ( '' !== $name )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";
    locate_template($templates, true, false);
}

Así que hay una acción disponible, en mi caso llamada get_template_part_content

Puedo conectarme a la acción con algo como:

add_action( 'get_template_part_content', 'child_post_styles', 10, 2 );

function child_post_styles ( $slug, $name ) {
    if( false == $name ){
        $name = get_post_format();
        $templates = array();
        if ( '' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";
        locate_template($templates, true, false);
    }
}

Esto obviamente produce una duplicación de la publicación, una de mi función enganchada, que puede mostrar la plantilla deseada, y la otra de la llamada normal locate_template en get_template_part()

Estoy teniendo problemas para encontrar una manera de lograr esto sin duplicación, o sin finalizar el procesamiento de la página justo después de servir la parte de mi plantilla haciendo algo estúpido, como break o exit

    
pregunta TomHarrigan 08.07.2014 - 20:07

4 respuestas

3

No hay gancho para hacer esto. Copie el index.php en el tema secundario y realice el cambio de una sola línea. Además, dígale al autor del tema principal que deben hacer el mismo cambio en su tema, para mayor flexibilidad.

    
respondido por el Otto 08.07.2014 - 21:19
6

Creo que no es exactamente posible la forma en que quieres lograrlo. Es realmente molesto no tener un filtro allí para modificar los nombres de los archivos de plantilla :(

Aunque tengo una solución alternativa. Deje usar content.php para la comparación.

// content.php file 
$format = get_post_format();
if( '' != $format ){
    get_template_part( 'content-'. $format );
}
else{
    get_template_part( 'content-default' );
}

No he usado el segundo argumento de la función get_template_part , sino que pasé el sufijo en el primer argumento para evitar llamadas infinitivas en el archivo content.php si no hay un archivo 'content-'. $format .

    
respondido por el Shazzad 08.07.2014 - 20:50
2

Bueno, hay SOLUCIÓN :

add_action('init', function(){ remove_all_actions('get_template_part_content'); });
add_action('get_template_part_content', 'yourFunc', 99, 2 );
function yourFunc ( $slug, $name ) {

    .........any codes here.............
    if ($name == 'header'){
       //but this will be executed before loading template... At this moment, Wordpress doesnt support any hooks for before/after LOAD_TEMPLATE...
    }
}

pero piensa con cuidado, en qué gancho debes insertar esa acción ... para obtener la ubicación manualmente, utilice, es decir, locate_template('content-header.php', false);

    
respondido por el T.Todua 28.04.2015 - 15:51
0

Si desea obtener un archivo llamado content-aside.php, debe llamar a la función de esta forma:

get_template_part( 'content', 'aside' );

El segundo parámetro es el nombre del archivador después del guión. Si su archivo está en un subdirectorio (templates / content-aside.php):

get_template_part( 'templates/content', 'aside' );

¿Es eso lo que estás buscando hacer?

    
respondido por el Justin R 08.07.2014 - 20:18

Lea otras preguntas en las etiquetas