get_template_part vs action hooks nei temi WordPress
Mi sembra che entrambi questi metodi offrano la possibilità all'utente finale di modificare un tema senza dover effettivamente modificare i file del tema (tramite child theme).
La mia domanda è: un metodo è preferibile rispetto all'altro?
Ad esempio, prendiamo un tema su cui sto lavorando ora. Sto cercando di decidere se utilizzare template parts o hooks.
<?php get_template_part('before_sitecontainer' ); ?>
<div id="sitecontainer" class="sitecontainer" <?php //chiuso nel 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><!-- fine div topcontainer -->
<?php get_template_part( 'after_topcontainer' ); ?>
Il metodo sopra permette all'utente del tema di sostituire qualsiasi sezione del codice esistente semplicemente creando un file con il nome appropriato nella cartella del child theme, oltre ad aggiungere nuovo codice prima/dopo ogni sezione preesistente con lo stesso metodo - i file template part before/after non esistono nel tema genitore e sono presenti solo per permettere l'inserimento di codice. Questo metodo non richiede la comprensione di hooks/filters per essere utilizzato.
Potrei ovviamente ottenere lo stesso risultato usando hooks e filters.
C'è un vantaggio nell'usare hooks/filters invece? Tenendo presente che il pubblico target che utilizzerà questo tema non è assolutamente esperto di codice. Posso fornire loro istruzioni relativamente semplici da seguire per utilizzare il metodo dei template parts, ma quasi sicuramente li confonderei con gli hooks.
O ci sono situazioni in cui un metodo sarebbe migliore dell'altro all'interno dello stesso tema?

Preferisco gli hook, poiché sono più flessibili: puoi agganciarti ad essi dal file functions.php
del tuo tema, ma anche dai plugin. Cerco di inserire la maggior parte della logica nei plugin, in modo che i temi contengano principalmente elementi di layout.
Se utilizzi un action hook, è comunque possibile usare get_template_part()
in quel gestore di hook. Questo ti offre il meglio di entrambi i mondi. Potresti persino creare un hook predefinito che chiama get_template_part()
, così che chi non ha molta esperienza con il coding possa aggiungere file aggiuntivi, mentre altri possano rimuovere questo hook se non lo desiderano.
Per quanto riguarda le prestazioni: get_template_part()
utilizza (in locate_template()
) file_exists()
una, due o quattro volte (a seconda di come lo chiami). Sembra che file_exists()
sia molto veloce, e utilizzi la cache in PHP e forse anche a livello di sistema operativo. Quindi probabilmente non è un problema.

Ha senso. Parte della mia strategia di progettazione è stata quella di eliminare la necessità di plugin nelle situazioni d'uso più comuni, pur preservando la possibilità di utilizzarli per chi lo desidera. Il mio cliente tipo sa molto poco di WordPress o dei plugin, non è qualificato per distinguere i plugin buoni da quelli cattivi (la principale debolezza dei plugin secondo me) e non vuole dover gestire l'aggiornamento e la manutenzione di più software. Quindi devo integrare molte funzionalità direttamente nei temi per offrire ciò che desiderano: una soluzione semplice da usare, facile da mantenere e tutto in uno.

È (relativamente) facile rimuovere una funzione da un hook in un child theme, ma molto più difficile fargli ignorare un template indesiderato del genitore.
In sostanza, lavorare con gli hook è più vicino al lato PHP, mentre lavorare con i template è più vicino al lato HTML. Io uso il parent theme Hybrid, che è molto orientato agli hook. È una benedizione finché non hai bisogno di sbarazzarti di qualche template del genitore.
Per gli utenti che non sono esperti di tecnologia, nessuna delle due opzioni è particolarmente gradevole. Perché dovrebbero aver bisogno di pasticciare con questi dettagli interni del tema comunque?
PS: nota anche i problemi di prestazioni. Le cose con gli hook avvengono in memoria, mentre quelle con i template richiedono molte operazioni su disco. Specialmente se stai scrivendo qualcosa come nel tuo esempio.
PPS: non è la preferenza di tutti... ma invece di scrivere un parent theme da zero, perché non prendere un parent theme esistente e fornire all'utente un semplice child theme?

Ignorare un template genitore sarebbe semplice come creare un file di template vuoto per sostituirlo, avrei pensato. Molto più facile che pasticciare con gli hook (e quindi il PHP) per un utente non tecnico. Anche se per qualcuno con esperienza gli hook sarebbero molto più semplici. Per quanto riguarda il perché, ci sono sempre quelli che vogliono personalizzare, hai anche ammesso che lo fai tu. Per quanto riguarda il motivo per cui sto creando un tema, è la direzione in cui voglio portare la mia attività. Costruire attorno al business di qualcun altro non mi sembra molto futuro-proof, anche perché secondo me la maggior parte dei temi esistenti lascia molto a desiderare. Penso di poter fare di meglio.

Ottimi punti riguardo ai problemi di performance però. Anche se, dato che WordPress è stato progettato per funzionare con get_template_part, avrei pensato che non ci sarebbe stato un impatto così grande sulle prestazioni. Qualcuno ha dei benchmark su questo?

Capisco cosa intendi riguardo all'ignorare una parte del template. Non così semplice come pensavo

In realtà è semplice come inserire un file template vuoto nella cartella del child theme, purché sia nella cartella radice. La difficoltà sorge quando i file template si trovano nelle sottocartelle della cartella del tema genitore o del child theme

In realtà, nemmeno le sottocartelle sono un problema. Avevo semplicemente nominato la cartella in modo errato (segno sicuro che stavo lavorando fino a tardi LOL). Per sovrascrivere una parte del template basta avere un file con lo stesso nome e nello stesso percorso nel child theme rispetto a quello del parent
