¿Es posible anular el resultado de get_template_part ()?

11

Estoy trabajando en un tema secundario, prefiero no anular los archivos de plantilla principales para mantener la simplicidad del tema secundario 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 usa: get_template_part( 'content' );

lo que traerá contenido.php , estoy buscando que se comporte más 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 el padre para un cambio de línea simple.

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);
}

Entonces 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);
    }
}

Obviamente, esto da como resultado una duplicación posterior, una de mi función enganchada, que puede mostrar la plantilla deseada, y la otra de la locate_templatellamada normal enget_template_part()

Tengo 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 mi parte de plantilla haciendo algo estúpido como un breakoexit

TomHarrigan
fuente
Mira esta publicación
Pieter Goosen
3
Bienvenido a la vida miserable sin herencia de plantillas. :)
Rarst

Respuestas:

3

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

Otón
fuente
Esto es falso ahora, mira @ t-toudua respuesta aquí
Ivan Castellanos
Su respuesta no es una solución, porque la parte de la plantilla aún se carga e incluye. El gancho de acción no puede anular eso.
Otto
Es cierto, pero podría usarlo ob_startdentro y luego ob_enden algún gancho para que se ejecute pero nunca repita, lo que generalmente es lo suficientemente bueno. O puede usar exit () para forzar la terminación de PHP (después de agregar manualmente todo lo que falta: pie de página, etc.)
Ivan Castellanos
Y eso todavía no es una solución. Suprimir la salida no es lo mismo que anular cosas.
Otto
Salir no suprime la salida; efectivamente detiene la ejecución en ese punto.
Ivan Castellanos
6

Creo que no es exactamente posible de la manera que quieres lograr. Es realmente molesto no tener un filtro allí para alterar los nombres de los archivos de plantilla :(

Sin embargo, tengo una solución al respecto. Deje uso content.phppara 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 get_template_partfunción, más bien pasé el sufijo en el primer argumento para evitar llamadas infinitas en el content.phparchivo si no hay 'content-'. $formatarchivo.

Shazzad
fuente
Creo que esta es una buena manera de hacerlo. No estoy seguro de por qué no se acepta :)
Anh Tran
La reputación importa, tal vez :)
Shazzad
Lo siento @Shazzad, aunque di una respuesta positiva, ya que es muy inteligente :) Si pudiera aceptar dos, lo haría.
TomHarrigan
3

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 piense detenidamente, en qué gancho debe insertar esa acción ... para obtener manualmente la ubicación, use locate_template('content-header.php', false);

T.Todua
fuente
0

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

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?

Justin R
fuente
Gracias, entiendo eso. Estoy buscando no tener que crear un index.php en el tema secundario para sobrescribir los temas principales index.php para un solo cambio de línea. Agrega más mantenimiento al tema hijo. Con la esperanza de lograr a través de un gancho si es posible.
TomHarrigan