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

11

Estou trabalhando em um tema filho. Prefiro não substituir os arquivos principais de modelo para manter a simplicidade do tema filho e 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á o content.php , pretendo que ele se comporte de maneira semelhante get_template_part( 'content', get_post_format() );ou semelhante a fim de trazer modelos diferentes, como content-apart.php , etc, sem criar um index.php no tema filho para substituir 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 me conectar à 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);
    }
}

Obviamente, isso resulta em pós-duplicação, uma da minha função conectada, que pode exibir o modelo desejado e a outra da locate_templatechamada normal emget_template_part()

Estou tendo problemas para encontrar uma maneira de fazer isso sem duplicação ou sem renderizar a página final logo após servir a parte do meu modelo, fazendo algo estúpido, como um breakouexit

TomHarrigan
fonte
Confira este post
Pieter Goosen
3
Bem-vindo à vida miserável sem herança de modelo. :)
Rarst

Respostas:

3

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

Otto
fonte
Isso é falso agora, consulte a resposta t-toudua aqui #
Ivan Castellanos
Sua resposta não é uma solução, porque a parte do modelo ainda carrega e inclui. O gancho de ação não pode substituir isso.
Otto
É verdade, mas você pode usá- ob_startlo dentro dele e ob_endem algum momento posterior para que seja executado, mas nunca ecoado, o que geralmente é bom o suficiente. Ou você pode usar exit () para forçar o encerramento do PHP (depois de adicionar manualmente tudo o que ainda está faltando: rodapé, etc.)
Ivan Castellanos
E isso ainda não é uma solução. Suprimir saída não é o mesmo que substituir coisas.
Otto
Sair não suprime a saída; efetivamente interrompe a execução nesse ponto.
Ivan Castellanos
6

Eu acho que não é exatamente possível da maneira que você deseja alcançar. É realmente irritante não conseguir um filtro para alterar os nomes dos arquivos de modelo :(

Eu tenho uma solução alternativa sobre isso. Vamos usar content.phppara 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 get_template_partfunção, mas passei o sufixo no primeiro argumento para evitar chamadas infinitas no content.phparquivo, se não houver nenhum 'content-'. $formatarquivo.

Shazzad
fonte
Eu acho que essa é uma boa maneira de fazer isso. Não tenho certeza por que ele não é aceito :)
Anh Tran
Questões de reputação, talvez :)
Shazzad
Desculpe @Shazzad, dei uma resposta positiva à sua resposta, pois é muito inteligente :) Se eu pudesse aceitar duas, aceitaria.
TomHarrigan
3

Bem, há 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 com cuidado: em qual gancho você deve inserir essa ação ... para obter manualmente a localização, o uso, ou seja, locate_template('content-header.php', false);

T.Todua
fonte
0

Se você deseja extrair um arquivo chamado content-apart.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-side.php):

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

É isso que você está procurando fazer?

Justin R
fonte
Obrigado, eu entendo isso. Eu estou olhando para não ter que criar um index.php no tema filho para substituir os temas pai index.php para uma única mudança de linha. Ele adiciona mais manutenção ao tema filho. Na esperança de realizar através de um gancho, se possível.
21413 TomHarrigan