É possível sobrescrever o resultado de get_template_part ()?

11

Eu estou trabalhando em um tema filho, eu prefiro não substituir os principais arquivos de modelo, a fim de manter a simplicidade do tema filho, bem como minimizar a quantidade de código e manutenção ao longo do tempo.

No loop, o modelo index.php no tema pai usa: get_template_part( 'content' );

que trará content.php , eu quero que ele se comporte mais como get_template_part( 'content', get_post_format() ); ou similar para trazer modelos diferentes como content-aside.php , etc, sem criar um index.php no tema filho para sobrescrever o pai para uma única mudança de linha.

get_template_part() consiste em:

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

Portanto, há uma ação disponível, no meu caso chamada get_template_part_content

Eu posso ligar a ação com 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);
    }
}

Isso obviamente resulta em pós duplicação, uma da minha função hooked, que pode exibir o template desejado, e a outra da chamada locate_template normal em get_template_part()

Estou com dificuldades para encontrar uma maneira de realizar isso sem duplicação ou sem terminar a renderização da página logo após exibir minha parte do modelo fazendo algo estúpido, como break ou exit

    
por TomHarrigan 08.07.2014 / 20:07

4 respostas

3

Não há gancho para fazer isso. Copie o index.php para o tema filho e faça a mudança de linha única. Além disso, diga ao autor do tema pai que eles devem fazer a mesma alteração em seu tema, para flexibilidade.

    
por Otto 08.07.2014 / 21:19
6

Eu acho que não é exatamente possível do jeito que você quer alcançar. É muito chato não conseguir um filtro lá para alterar nomes de arquivos de template: (

Eu tenho uma solução nele embora. Vamos usar content.php para a comparação.

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

Eu não usei o segundo argumento da função get_template_part , mas passei o sufixo no primeiro argumento para evitar chamadas infinitivas no arquivo content.php se não houver nenhum arquivo 'content-'. $format .

    
por Shazzad 08.07.2014 / 20:50
2

Bem, existe SOLUÇÃO :

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...
    }
}

mas pense bem, em qual gancho você deve inserir essa ação ... para obter manualmente a localização, use, por exemplo, locate_template('content-header.php', false);

    
por T.Todua 28.04.2015 / 15:51
0

Se você quer puxar um arquivo chamado content-aside.php, você chama a função assim:

get_template_part( 'content', 'aside' );

O segundo parâmetro é o nome do arquivador após o hífen. Se o seu arquivo estiver em um subdiretório (templates / content-aside.php):

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

É isso que você quer fazer?

    
por Justin R 08.07.2014 / 20:18