get_template_part vs action hooks în teme

18 oct. 2010, 11:34:26
Vizualizări: 4.12K
Voturi: 17

Mi se pare că ambele metode oferă posibilitatea utilizatorului final de a modifica o temă fără a edita fișierele temei (prin teme copil).

Întrebarea mea este: există vreo metodă preferată față de cealaltă?

De exemplu, ia tema la care lucrez acum. Încerc să decid dacă să folosesc părți de șablon sau hook-uri.

<?php get_template_part('before_sitecontainer' ); ?>
<div id="sitecontainer" class="sitecontainer" <?php //închis în 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><!-- sfârșit div topcontainer -->
<?php get_template_part( 'after_topcontainer' ); ?>

Codul de mai sus permite utilizatorului temei să înlocuiască orice secțiune a codului existent prin simpla creare a unui fișier cu numele corespunzător în folderul temei copil, precum și să adauge cod nou înainte/după fiecare secțiune preexistentă prin aceeași metodă - fișierele before/after pentru părțile de șablon nu există în tema părinte și sunt acolo doar pentru a le permite să insereze cod - iar această metodă nu necesită să înțeleagă hook-uri/filtre pentru a realiza acest lucru.

Desigur, aș putea obține același lucru folosind hook-uri și filtre.

Există vreun avantaj în folosirea hook-urilor/filtrelor în schimb? Ținând cont de faptul că publicul țintă care va folosi această temă este cu siguranță nu priceput la cod. Le pot oferi instrucțiuni relativ simple pe care le pot urma pentru a utiliza metoda cu șabloane, dar cu siguranță i-aș confunda groaznic cu hook-uri.

Sau există situații în care una dintre metode ar fi mai bună decât cealaltă în cadrul aceleiași teme?

0
Toate răspunsurile la întrebare 3
1
10

Prefer cârlige (hooks), deoarece sunt mai flexibile: poți să le atașezi funcții din fișierul functions.php al temei tale, dar și din plugin-uri. Încerc să pun cât mai multă logică în plugin-uri, astfel încât temele să conțină în principal aspecte legate de aspectul vizual.

Dacă folosești un cârlig de acțiune (action hook), este totuși posibil să utilizezi get_template_part() în gestionarul acelui cârlig. Astfel obții cele mai bune caracteristici din ambele abordări. Ai putea chiar să creezi un cârlig implicit care să apeleze get_template_part(), astfel încât persoanele care nu au prea multă experiență în codare să poată adăuga fișiere suplimentare, iar alții să poată elimina acest cârlig dacă nu doresc să-l folosească.

În ceea ce privește performanța: get_template_part() folosește (în locate_template()) funcția file_exists() o dată, de două ori sau de patru ori (în funcție de cum o apelezi). Se pare că file_exists() este foarte rapidă, și folosește caching în PHP și poate chiar la nivel de sistem de operare. Deci probabil nu este o problemă.

19 oct. 2010 09:48:00
Comentarii

Asta are sens. O parte din abordarea mea de design a fost să elimin necesitatea pluginurilor în majoritatea situațiilor comune, păstrând totuși posibilitatea de a le folosi pentru cei care doresc. Clientul meu țintă știe foarte puțin despre WordPress sau pluginuri, nu este calificat să distingă pluginurile bune de cele rele (principalul punct slab al pluginurilor, după părerea mea) și nu dorește să se ocupe de actualizarea și gestionarea multiplelor componente software. Așadar, trebuie să integrez multă funcționalitate direct în teme pentru a oferi ceea ce doresc ei: o soluție simplă de utilizat, simplu de întreținut, totul într-un singur loc.

Lemon Bacon Lemon Bacon
19 oct. 2010 10:44:16
1

Aș spune că principala diferență este lizibilitatea. Dacă vezi mai multe părți de șablon bine denumite, poți înțelege ușor ce se întâmplă. Dacă vezi doar un hook, va trebui să cauți prin restul temei pentru a stabili ce este atașat la acel hook.

18 oct. 2010 12:28:17
Comentarii

Da, are sens și face parte din ceea ce încercam să realizez cu codul exemplu.

Lemon Bacon Lemon Bacon
18 oct. 2010 12:39:46
5

Este (relativ) ușor să elimini o funcție dintr-un hook într-un temă copil, dar mult mai greu să faci să ignore un template nedorit din tema părinte.

În esență, lucrul cu hook-uri este mai apropiat de partea de PHP, iar lucrul cu template-uri este mai apropiat de partea de HTML. Folosesc tema părinte Hybrid, care este foarte orientată pe hook-uri. Este o binecuvântare până când trebuie să scapi de un template din tema părinte.

Pentru utilizatorii care nu sunt tehnici, niciuna dintre opțiuni nu este prea plăcută. De ce ar trebui să se amestece în astfel de detalii interne ale temei?

PS: de asemenea, ține cont de problemele de performanță. Lucrurile cu hook-uri se întâmplă în memorie, iar lucrurile cu template-uri necesită multe accesări pe disc. Mai ales dacă scrii ceva ca în exemplul tău.

PPS: nu este preferința tuturor... dar în loc să scrii o temă părinte de la zero, de ce să nu iei o temă părinte existentă și să oferi utilizatorului o temă copil simplă?

18 oct. 2010 12:41:14
Comentarii

Ignorarea unui template părinte ar fi la fel de ușoară precum crearea unui fișier de template gol pentru a-l înlocui, aș fi crezut. Mult mai ușor decât să te complici cu hook-uri (și deci PHP) pentru utilizatorul nepasionat de tehnologie. Deși pentru cineva cu experiență, hook-urile ar fi mult mai ușoare. În ceea ce privește motivul, există întotdeauna cei care doresc să personalizeze, chiar tu ai recunoscut că o faci. În ceea ce privește motivul pentru care creez o temă, aceasta este direcția în care doresc să îmi duc afacerea. Construirea în jurul afacerii altcuiva nu pare foarte sigură pentru viitor, de asemenea pentru că, IMO, majoritatea temelor existente lasă de dorit. Cred că pot face mai bine.

Lemon Bacon Lemon Bacon
18 oct. 2010 13:25:50

Argumente bune în ceea ce privește problemele de performanță. Totuși, deoarece WordPress a fost conceput să funcționeze cu get_template_part, aș fi crezut că nu ar fi o problemă atât de mare de performanță. Are cineva benchmark-uri pentru asta?

Lemon Bacon Lemon Bacon
18 oct. 2010 13:27:44

Înțeleg ce vrei să spui despre ignorarea unei părți de template. Nu este atât de ușor pe cât am crezut

Lemon Bacon Lemon Bacon
18 oct. 2010 13:36:59

De fapt, este la fel de simplu ca și plasarea unui fișier de șablon gol în folderul child, atâta timp cât acesta se află în rădăcina folderului. Dificultatea apare atunci când fișierele de șablon se află în subfoldere ale folderului temei părinte/child.

Lemon Bacon Lemon Bacon
18 oct. 2010 13:40:43

De fapt, nici subfolderele nu reprezintă o problemă. Pur și simplu am denumit folderul greșit (un semn clar că lucrez prea târziu, LOL). Pentru a suprascrie o parte a șablonului, este nevoie doar de un fișier cu același nume și în aceeași cale în child tema, ca în tema părinte.

Lemon Bacon Lemon Bacon
18 oct. 2010 14:00:42