Come utilizzare get_template_part()?
Qualcuno potrebbe spiegarmi come funziona questa funzione? So cosa fa ma quando guardo il codice sorgente nel template twenty_ten, non capisco come tutti i loop vengano raccolti in un singolo loop.php (ho visto anche quel file).
Quindi come posso ad esempio astrarre una certa parte comune del template e poi riutilizzarla in altri template?

Alcune risposte introduttive molto valide qui.
Fondamentalmente, get_template_part()
consente agli sviluppatori di temi di impostare un ordine di specificità dei file template. Pensatela in modo simile alla specificità applicata ai selettori CSS. Quando si progetta qualcosa, si vuole iniziare con il minimo indispensabile di specificità, in modo che possa essere facilmente sovrascritto nelle parti del design che necessitano di attenzioni individuali.
Ad esempio, stai stilizzando un blog e crei un file loop.php che funziona bene per il markup dei post. Ma pianifichi in anticipo e lo richiami nei tuoi file template in seguito con ulteriori specificatori di contesto - ad esempio, nella pagina indice, richiami get_template_part( 'loop', 'index' );
, nel template singolo, richiami get_template_part( 'loop', 'single' );
, nelle pagine archivio, richiami get_template_part( 'loop', 'archive' );
, e così via. Questo rende molto semplice in seguito, quando decidi di differenziare il markup del loop nelle tue pagine archivio rispetto alla home page: basta creare un template loop-archive.php e verrà utilizzato al posto del generico loop.php.
Ma la magia dietro get_template_part()
è nella funzione locate_template()
, che controlla prima la directory del tema, poi la directory genitore (se esiste) per il file nominato. Questo è molto utile per lo sviluppo di plugin. In uno dei miei plugin, definisco un tipo di post personalizzato e creo un file template di loop per quel tipo di post personalizzato nella mia directory del plugin. Ma... voglio consentire ai temi che utilizzano il mio plugin di sovrascrivere il mio markup se lo desiderano. È qui che locate_template()
funziona davvero meraviglie.
locate_template($template_names, $load = false, $require_once = true )
cercherà ciascuno dei nomi nell'array $template_names nella directory del foglio di stile, poi nella directory del template. Passare 'true' come argomento $load significa che richiederà il primo file trovato e restituirà una stringa vuota se nessun file template è stato trovato. Quindi posso fare qualcosa del genere nel mio plugin:
if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
include( 'loop-mycustomposttype.php' );
...il che dovrebbe rendere molto semplice per gli sviluppatori di temi personalizzare il mio plugin semplicemente includendo un file chiamato loop-mycustomposttype.php nel loro tema.

Sostituisci locate_template con questo, per favore.
include(locate_template( 'loop-mycustomposttype.php'))
In questo modo è possibile passare variabili. L'ho trovato qui link. È estremamente utile!

Facendo così sarà necessario cambiare anche questo if. In questo modo if ( false === include(locate_template( 'loop-mycustomposttype.php')) )

Non tutti i loop, solo il loop principale. ;-) Non importa se stai guardando la tua homepage, una categoria o chissà cos'altro, avrai sempre un loop principale. Il contenuto di quel loop principale è determinato dalla query che è stata eseguita prima che il tuo template venisse chiamato.
Il template loop.php semplicemente scorre gli elementi nel loop e li formatta. Vedi la documentazione sul Codex.
Se guardi il loop.php di Twenty-Ten, puoi vedere che Twenty-Ten poi diversifica all'interno di quel singolo file template.
get_template_part()
si limita a caricare una parte di template e a eseguirla. Potresti altrettanto bene estrarre parti del tuo loop.php in file separati e sostituirle con chiamate come get_template_part('loop', 'category')
e così via.
Oppure potresti avere una parte di template per ogni singolo post nel loop e far sì che il tuo loop.php chiami solo get_template_part('loop','post');
all'interno della clausola while...
. Tutto dipende da te.

Dal codex di get_template_part:
<?php get_template_part( 'loop', 'index' ); ?>
eseguirà un require() PHP per il primo file che esiste...
Quindi funzionerà effettivamente come se stessi includendo un altro file php.
Aggiornamento: C'è una leggera differenza rispetto a 'require' - È racchiuso all'interno di una funzione, quindi devi usare global
se vuoi passare delle variabili dal tuo template alla parte di template.
