get_template_part vs ganchos de ação em temas

15

Parece-me que ambos oferecem a oportunidade para o usuário final modificar um tema sem realmente editar os arquivos de temas (via temas filhos).

Minha pergunta é: é um método preferido em relação ao outro.

Por exemplo, pegue um tema em que estou trabalhando agora. Estou tentando decidir se deve ir com partes do modelo de ganchos.

<?php get_template_part('before_sitecontainer' ); ?>
<div id="sitecontainer" class="sitecontainer" <?php //closed in footer ?>>

<?php get_template_part( 'before_topcontainer' ); ?>
<div id="topcontainer ">

    <?php get_template_part( 'before_topedge_navigation' ); ?>
    <?php get_template_part( 'topedge_navigation' ); ?>

    <?php get_template_part( 'before_site_header' ); ?>
    <?php get_template_part( 'site_header' ); ?>

    <?php get_template_part( 'before_second_navigation' ); ?>
    <?php get_template_part( 'second_navigation' ); ?>

    <?php get_template_part( 'after_second_navigation' ); ?>

</div><!-- end topcontainer div -->
<?php get_template_part( 'after_topcontainer' ); ?>

O item acima permite que o usuário do tema substitua qualquer seção do código existente, simplesmente criando um arquivo com nome apropriado na pasta do tema filho, além de adicionar um novo código antes / depois de cada seção pré-existente pelo mesmo método - o modelo antes / depois os arquivos de peça não existem no tema pai e existem apenas para permitir a inserção de código - e esse método não exige que eles entendam ganchos / filtros para fazer isso.

É claro que eu poderia conseguir o mesmo usando ganchos e filtros.

Existe uma vantagem em usar ganchos / filtros? Tendo em mente que o público-alvo que usará isso não é decididamente esclarecido por código. Posso dar-lhes instruções relativamente básicas que podem seguir para usar o método de modelo, mas quase certamente confundirei o diabo com ganchos.

Ou há situações em que uma seria melhor que a outra dentro do mesmo tema?

Ashley G
fonte

Respostas:

8

Prefiro hooks, pois eles são mais flexíveis: você pode conectá-los a partir do functions.phparquivo do seu tema , mas também a partir de plugins. Eu tento colocar tanta lógica nos plugins, para que os temas contenham principalmente itens de layout.

Se você usar um gancho de ação, ainda será possível usá get_template_part() -lo . Isso oferece o melhor dos dois mundos. Você provavelmente pode até criar um gancho padrão que chama get_template_part(), para que as pessoas que não têm muita experiência com codificação possam adicionar arquivos extras e outras pessoas possam removê-lo, se não quiserem.

Quanto ao desempenho: get_template_part()usa ( inlocate_template() ) file_exists()uma, duas ou quatro vezes (dependendo de como você o chama). Parece file_exists()ser muito rápido e usa cache no PHP e talvez até no sistema operacional. Portanto, isso provavelmente não é um problema.

Jan Fabry
fonte
Isso faz sentido. Parte do meu impulso de design foi eliminar a necessidade de plug-ins nas situações de uso mais comuns, preservando a capacidade de usá-los para aqueles que desejam. Meu cliente-alvo sabe muito pouco sobre WordPress ou plug-ins, não está qualificado para diferenciar bons plug-ins dos ruins (a principal fraqueza dos plug-ins IMO) e não quer ter que lidar com a atualização e o gerenciamento de vários softwares. Então, eu tenho que criar muita funcionalidade diretamente nos temas, a fim de oferecer o que eles querem: uma solução simples de usar, simples de manter e única.
Ashley G
4

Eu diria que a principal diferença é a legibilidade. Se você vir várias peças de modelo bem nomeadas, poderá entender o que está acontecendo com facilidade. Se você vir apenas um gancho, precisará pesquisar o restante do tema para estabelecer o que está anexado ao gancho.

Fuzz leve
fonte
1
Sim, isso faz sentido e faz parte do que eu estava tentando alcançar com o código de exemplo.
Ashley G
4

É (relativamente) fácil remover a função do gancho no tema filho, mas é muito mais difícil ignorar o modelo pai indesejado.

Trabalhar essencialmente com hooks está mais próximo do lado do PHP e trabalhar com modelos está mais próximo do lado do HTML. Eu uso o tema pai híbrido, que é muito orientado a ganchos. É uma felicidade até você precisar se livrar do modelo de alguns dos pais.

Para usuários que não são conhecedores de tecnologia, também não é uma opção muito boa. Por que eles precisariam mexer com esses temas internos de qualquer maneira?

O PS também observa problemas de desempenho. Coisas com ganchos acontecem na memória, coisas com modelos exigem muitas pesquisas de disco. Especialmente se você estiver escrevendo algo como no seu exemplo.

PPS nem a preferência de todos ... mas, em vez de escrever o tema pai a partir do zero, por que não usar o tema pai existente e fornecer um tema filho simples ao usuário?

Rarst
fonte
Ignorar um modelo pai seria tão fácil quanto criar um arquivo de modelo em branco para substituí-lo, eu teria pensado. Muito mais fácil do que mexer com ganchos (e, portanto, PHP) para o usuário mais experiente em tecnologia. Embora para alguém com experiência ganchos seria muito mais fácil. Quanto ao porquê, sempre há quem quer personalizar, você até admitiu que sim. Quanto ao motivo pelo qual estou criando um tema, é nessa direção que desejo levar meus negócios. Construir em torno de negócios de outras pessoas não me parece uma prova muito futura, também porque a maioria dos temas existentes da IMO deixa muito a desejar. Eu acho que posso fazer melhor.
Ashley G
Porém, bons pontos sobre os problemas de desempenho. Embora, como o wordpress foi projetado para funcionar com get_template_part, eu pensaria que não seria tanto um desempenho atingido. Alguém tem alguma referência sobre isso?
Ashley G
Entendo o que você quer dizer com ignorar uma parte do modelo. Não é tão fácil como eu pensava
Ashley G
Na verdade, é tão fácil quanto colocar um arquivo de modelo em branco na pasta filho, desde que esteja na raiz da pasta. Onde se torna difícil é quando os arquivos de modelo estão em subpastas da pasta do tema pai / filho
Ashley G
Na verdade, até as subpastas não são problema. Acabei de ter a pasta com o nome errado (um sinal claro de que estou trabalhando tarde demais). Para substituir uma parte do modelo, é necessário apenas um arquivo com o mesmo nome no mesmo caminho no filho que estava no pai
Ashley G