Como usar get_template_part ()?

25

Alguém poderia me explicar como essa função funciona? Eu sei o que ele faz, mas quando olho para o código-fonte no modelo twenty_ten, não entendo como todos os loops estão sendo coletados em um único loop.php (vi esse arquivo também).

Então, como, por exemplo, abstraia uma determinada parte comum do modelo e a reutiliza em outros modelos?

Amit Erandole
fonte

Respostas:

25

Algumas respostas introdutórias muito boas aqui.

Basicamente, get_template_part()permite que os desenvolvedores de temas configurem uma ordem de especificidade dos arquivos de modelo. Pense nisso da mesma forma que a especificidade que se aplica aos seletores de CSS. Ao projetar algo, você deseja começar com o mínimo de especificidade, para que possa ser facilmente substituído em partes de um design que precisam de atenção individual.

Por exemplo, você cria um blog e cria um arquivo loop.php que funciona bem para marcar postagens. Mas você planeja com antecedência e os chama nos arquivos de modelo mais tarde, com especificadores de contexto adicionais - digamos, na página de índice, você chama get_template_part( 'loop', 'index' );, no modelo único, você chama get_template_part( 'loop', 'single' );, nas páginas de arquivo, você chama get_template_part( 'loop', 'archive' );e assim por diante. Isso facilita muito quando você decide marcar o loop em suas páginas de arquivo de maneira diferente da página inicial: basta criar um modelo loop-archive.php e ele será usado em vez do loop.php genérico .

Mas a mágica por trás get_template_part()está na função locate_template(), que verifica primeiro o diretório do tema, depois o diretório pai (se existir) para o arquivo nomeado. Isso é muito útil para o desenvolvimento de plugins. Em um dos meus plug-ins, defino um tipo de postagem personalizado e criei um arquivo de modelo de loop para esse tipo de postagem personalizado no diretório do meu plugin. Mas ... quero permitir que os temas usando o meu plug-in substituam minha marcação, se assim o desejarem. É aqui que locate_template()realmente funciona maravilhas.

locate_template($template_names, $load = false, $require_once = true )

procurará cada um dos nomes na matriz $ template_names no diretório da folha de estilo e depois no diretório do modelo. Passar 'true' como o argumento $ load significa que ele exigirá o primeiro arquivo encontrado e retornará uma string vazia se nenhum arquivo de modelo estiver localizado. Para que eu possa fazer algo assim no meu plugin:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

... o que deve facilitar a personalização do meu plugin para desenvolvedores de temas, incluindo um arquivo chamado loop-mycustomposttype.php em seu tema.

maçãs douradas
fonte
2
Substitua o location_template por isso, por favor. include(locate_template( 'loop-mycustomposttype.php')) Desta forma é possível passar variáveis. Encontrei este link aqui . É extremamente útil!
Pablo SG Pacheco
11
Ao fazer isso, será necessário alterar isso, se também. Assimif ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo SG Pacheco
11
Oh, bom argumento. Com a fórmula que eu dei, a chamada requireou require_once(de locate_template) está dentro de uma função e, portanto, não tem acesso ao escopo atual.
goldenapples
5

Nem todos os loops, o loop principal. ;-) Não importa se você olha para a sua página inicial ou uma categoria ou quem sabe o que, você sempre terá um loop principal. O conteúdo desse loop principal é determinado pela consulta executada antes da chamada do seu modelo.

O modelo loop.php simplesmente passa por cima dos itens no loop e os formata. Veja a documentação no Codex .

Se você olhar para loop.php de Twenty-Ten, você pode ver que Vinte e dez, em seguida, diversifica dentro desse único arquivo de modelo.

get_template_part()apenas carrega uma parte do modelo e a percorre. Você também pode extrair partes do seu loop.php em arquivos separados e substituí-los por uma get_template_part('loop', 'category')e outras chamadas.

Ou você pode ter um modelo de peça para cada postagem individual no loop e fazer com que seu loop.php chame apenas get_template_part('loop','post');dentro da while...cláusula. Tudo depende de você.

Wyrfel
fonte
3

Desde o codex get_template_part :

<?php get_template_part( 'loop', 'index' ); ?>

fará um PHP require () para o primeiro arquivo que existe ...

Tão efetivamente funcionará como se você estivesse exigindo outro arquivo php.

Atualização : Há uma pequena diferença em 'exigir' - ele está dentro de uma função, portanto você deve globalpassar se quiser passar variáveis ​​do modelo para a parte do modelo.

icc97
fonte