Unde să pun codul: în plugin sau functions.php?
Există o schemă ușor de înțeles pentru a decide ce tip de cod aparține unui plugin sau fișierului functions.php
al temei?
Există multe cazuri și multe dezbateri pe această temă, în principal din cauza unor concepții greșite despre funcționarea internă a WordPress. Caut un răspuns bazat pe fapte, nu pe opinii.
Ar trebui să explice cum să gestionăm următoarele puncte (și probabil mai multe):
- tipuri de postări personalizate și taxonomii
- formulare de contact
- shortcode-uri
- widget-uri personalizate
add_theme_support( 'automatic-feed-links' );
- funcții SEO precum elemente
meta
personalizate - schimbarea temei
Există adesea argumente pro și contra pentru ambele părți. Cea mai populară întrebare a noastră Cea mai bună colecție de cod pentru fișierul functions.php a primit multe fragmente de cod ca răspunsuri care sunt cel puțin discutabile.
Avem nevoie de criterii pe care un începător să le poată înțelege, poate o listă de verificare - cu motive.
Vezi și întrebarea conexă a lui Chip Bennett de pe site-ul nostru meta: Întrebări care solicită specific o soluție "fără plugin"
Conexe: Unde pun fragmentele de cod pe care le-am găsit aici sau în altă parte pe web?
Voi începe cu această întrebare: Funcționalitatea este legată de prezentarea conținutului, sau de generarea/gestionarea conținutului, a site-ului sau a identității utilizatorului?
Dacă funcționalitatea nu este legată specific de prezentarea conținutului, atunci se încadrează clar în Teritoriul Plugin-urilor. Această listă este lungă:
- Modificarea filtrelor de bază din WP (
wp_head
conținut, cum ar fi link-urile canonice, generatorul și alte meta-uri HTML, etc.) - Favicon-ul site-ului
- Shortcode-uri pentru conținutul postărilor
- Link-uri de partajare a postărilor
- Scripturi din footer pentru Google Analytics (și similare)
- Instrumente/controale SEO
- etc.
Dacă funcționalitatea este legată de prezentarea conținutului, atunci este un candidat pentru a fi inclusă în Temă. În acest moment, aș reveni la criteriul de schimbare a Temelor al lui @Raf912: ți-ar lipsi funcționalitatea atunci când schimbi Tema? Dacă răspunsul la această întrebare este nu, atunci funcționalitatea aparține Temelor. Câteva exemple:
- Eliminarea/înlocuirea CSS-ului de bază al Galeriei din WP
- Filtrarea lungimii fragmentului din postări, textul "citește mai mult", etc.
- Orice implementat prin
add_theme_support()
(presupun că acesta ar trebui să fie evident) - CSS personalizat
În mod normal, aceste două întrebări vor oferi o linie de diferențiere destul de clară; totuși, există excepții.
Tipuri Personalizate de Postări (CPT)
Tipurile Personalizate de Postări, de exemplu, sunt un hibrid unic între generarea și prezentarea conținutului, având în vedere modul în care funcționează Ierarhia de Șabloane pentru paginile de arhivă și paginile individuale de postări. Aspectul de generare a conținutului al CPT-urilor le-ar plasa în mod normal în Teritoriul Plugin-urilor; totuși, Plugin-urile nu pot defini pagini de șablon care să se integreze în mod inerent în designul/layout-ul/stilul oricărei Temă (mai ales dacă CPT-ul afișează alte elemente decât Titlul/Conținutul/Meta-urile obișnuite sau are taxonomii personalizate asociate).
Pe termen lung, soluția la această discrepanță, după părerea mea, este să existe o convenție/consens standard pentru definirea CPT-urilor pentru anumite tipuri de conținut (anunțuri imobiliare, evenimente de calendar, produse e-commerce, intrări în biblioteca de cărți/media, etc.). În acest fel, conținutul generat de utilizatori ar rămâne portabil între Temele care implementează definiția standard/convențională a unui CPT dat, în timp ce dezvoltatorii de Teme păstrează flexibilitatea de a defini designul/layout-ul/stilul acelui CPT în fișierele de șablon ale Temelor.
Link-uri de Social Media
În mod similar, aș spune în mod normal că link-urile de profil de social media, care au devenit aproape omniprezente în Temele actuale, aparțin Teritoriului Plugin-urilor, deoarece nu au nicio legătură cu prezentarea conținutului. Cea mai bună soluție ar fi ca aceste profiluri să fie definite undeva în nucleu; totuși, în prezent nu există o metodă standard/consensuală de a defini aceste link-uri. Sunt ele cel mai bine definite la nivel de setări ale site-ului sau pe bază de utilizator? Dacă pe bază de utilizator, care meta-date ale utilizatorului sunt expuse în șablon? etc.
Așadar, din nou, pe termen lung, soluția la această discrepanță este fie ca nucleul să definească unde sunt definite aceste link-uri, fie ca comunitatea de dezvoltatori de Teme să dezvolte propriul consens. Între timp, nu prea există altceva de făcut decât să le păstrăm definite în fiecare Temă.

add_theme_support( 'automatic-feed-links' );
nu este prezentare. Dar este cerut de către ghidurile pentru teme. De ce este un risc necesar să pierzi această funcționalitate după schimbarea temei?

Orice este implementat prin intermediul add_theme_support()
poate fi implementat doar prin intermediul Temei. Folosirea add_theme_support( 'automatic-feed-links' )
în cadrul Temei asigură de fapt o experiență consistentă de la o Temă la alta, deoarece link-urile de feed generate vor fi aceleași.

Cred că denumirea este greșită: Link-urile de feed nu sunt prezentare. Dacă următoarea temă nu apelează acea funcție, utilizatorul va pierde link-urile de feed. Și poți adăuga asta printr-un plugin fără nicio problemă. De aceea sunt confuz în legătură cu asta. :)

Un test simplu pentru a determina unde este cel mai bine plasat codul:
- scrieți codul în functions.php
- schimbați tema
lipsește funcționalitatea, blogul nu funcționează corect sau au rămas fragmente din vechea temă (de ex. shortcode-uri)?
da: includeți-l într-un plugin
nu: lăsați-l în functions.php
Exemple: Scrieți un shortcode. După schimbarea temei, shortcode-urile brute rămân în articole. Deci, este mai bine să fie plasat într-un plugin.
Scrieți o funcție pentru a lista ultimele comentarii. După schimbarea temei, totul este în regulă, deoarece poate cealaltă temă are o funcție echivalentă.
Depinde cu adevărat de cod și de ceea ce face. Unele coduri influențează doar stilizarea sau conținutul temei, altele modifică articolele de blog.

Nu cred că există un răspuns simplu la această întrebare, dar sunt sigur că am putea crea o diagramă de flux pentru a ajuta la luarea deciziei. Iată o schiță generală a unei astfel de diagrame, care poate și ar trebui să fie extinsă. Lăsați sugestii în comentarii!
- Acest cod va fi găzduit pe o instalație WordPress single-site?
- Da - Schimbă tema site-ului doar la redesignuri majore sau schimbări de funcționalități?
- Da - Codul în discuție este specific acestui design curent?
- Da: functions.php
- Nu: Plugin
- Nu (se schimbă des sau la voia clientului) - Plugin
- Da - Codul în discuție este specific acestui design curent?
- Nu (Multisite) - Găzduiești tu instalația multisite SAU este o soluție multisite găzduită care permite pluginuri?
- Da: Funcționalitatea în discuție este specifică acestui site, sau poate/ar trebui să fie folosită de alte site-uri din rețea?
- Specifică acestui site: functions.php
- Partajată între mai multe site-uri - Vrei să o impui pe fiecare site?
- Da: Plugin, stocat în directorul mu-plugins sau activat la nivel de rețea
- Nu: Este aceasta o rețea de site-uri nelegate între ele? (ex. clienți diferiți)
- Da: Ar fi neplăcut sau neprofesionist dacă clientul A ar vedea sau activa pluginul scris pentru clienții B, C și D? (ex. ar putea strica site-ul sau cauza funcționalități nedorite)
- Da: functions.php
- Nu: Plugin
- Nu: Probabil plugin
- Da: Ar fi neplăcut sau neprofesionist dacă clientul A ar vedea sau activa pluginul scris pentru clienții B, C și D? (ex. ar putea strica site-ul sau cauza funcționalități nedorite)
- Nu (găzduit de un serviciu precum VIP care nu permite pluginuri): folosește functions.php
- Da: Funcționalitatea în discuție este specifică acestui site, sau poate/ar trebui să fie folosită de alte site-uri din rețea?
- Da - Schimbă tema site-ului doar la redesignuri majore sau schimbări de funcționalități?
- Teme părinte -- uneori pentru funcționalități partajate ar fi mai bine să creezi o temă părinte și să pui funcționalitatea în fișierul functions.php al temei părinte.
- Directoarele de pluginuri ale unor instalații multisite mari pot deveni rapid haotice, așa că uneori funcționalități partajate folosite de un procent mic de site-uri (ex. < 1%) ar fi mai bine duplicate în fișierele functions.php.

De aici Teme VS Plugin-uri
Adaugă cod personalizat într-o temă copil (child theme), astfel încât atunci când actualizezi tema părinte, codul tău personalizat să nu se piardă.
De asemenea, poți crea un plugin specific site-ului care să conțină tot codul tău personalizat.
În ceea ce privește scrierea de cod versus plugin-uri, poți folosi plugin-uri și funcțiile, dar pentru majoritatea lucrurilor pe care le dorești, codarea manuală este cea mai bună variantă, deoarece este mai ușor de modificat, cu excepția unor cazuri precum cutiile meta (meta boxes), unde poți considera utilizarea unui plugin, dacă nu ești dezvoltator de teme.
function modify_contact_methods($profile_fields) {
// Adaugă câmpuri noi
$profile_fields['twitter'] = 'Nume utilizator Twitter';
$profile_fields['facebook'] = 'URL Facebook';
$profile_fields['gplus'] = 'URL Google+';
return $profile_fields;
}
add_filter('user_contactmethods', 'modify_contact_methods');
http://codex.wordpress.org/Plugin_API/Filter_Reference/user_contactmethods
- Adaugă un nou tip de postare personalizată (custom post type) - Cod
- Adaugă câmpuri noi la utilizatori - Codul de mai sus
- Adaugă widget-uri noi - Cod
- Adaugă legături permanente (permalinks) personalizate - Setări WordPress Permalink

Știu că acest subiect a fost dezbătut în repetate rânduri și că Chip l-a acoperit destul de bine, dar am vrut să adaug câteva gânduri proprii.
Dacă te câștigi existența din programare și te trezești lucrând la site-uri WordPress cu termene limită, vei descoperi că totul se rezumă la timp.
De cele mai multe ori, în special pentru cei care încep, este mult mai rapid și mai simplu să adaugi ceea ce ai nevoie direct în tema și să o consideri gata.
Cu toate acestea, dacă lucrezi cu WordPress într-o oarecare măsură, ar trebui să iei în serios următoarele recomandări:
- Creează un schelet pentru plugin-uri
Acesta ar trebui să includă tot ceea ce ai nevoie în mod obișnuit pentru un plugin, inclusiv activarea, dezactivarea, actualizarea versiunilor, crearea de panouri de administrare și dezinstalarea.
Dacă îți faci timp să faci asta, vei descoperi:
- Nu mai durează mult mai mult să adaugi funcționalități prin plugin-uri
- Poți începe să construiești o listă solidă de plugin-uri pe care să le poți refolosi în alte proiecte, ceea ce îți va economisi mult timp pe termen lung.
- Le poți face disponibile public dacă dorești mai multă vizibilitate
Acum poți construi lucrurile corect și să finalizezi proiectele viitoare mai rapid.
- Creează un schelet pentru teme
Acesta ar trebui să includă tot ceea ce este necesar în mod obișnuit într-o temă:
- Un fișier CSS de bază care să conțină stilurile pe care le folosești frecvent (resetări, etc.)
- Un fișier index.php corespunzător, care să gestioneze tot ceea ce ai nevoie pentru orice șablon
- Un fișier functions.php - nu-l vei folosi la fel de des, dar tot va fi util.
După ce ai finalizat acest lucru, creează un schelet pentru teme copil care să folosească tema ta principală.
- Adaugă fișierul de stiluri, referințându-te la tema părinte.
- Adaugă fișierul functions.php
După ce ai finalizat aceste două lucruri, crearea de site-uri noi pentru clienți devine mult mai rapidă.
Dacă faci cele menționate mai sus, poți apoi să te concentrezi pe următoarele:
- Folosește timpul pe care l-ai câștigat pentru a te familiariza mai bine cu PHP, WordPress, JavaScript, CSS și/sau MySQL ... cu cât înveți mai multe despre acestea, cu atât vei finaliza lucrurile mai repede.
- Actualizează scheletele de plugin-uri, teme și teme copil pe măsură ce descoperi lucruri care ar trebui îmbunătățite. Indiferent cât de bun ești, dacă continui să înveți, vei găsi mereu lucruri de îmbunătățit.
Și, dacă faci toate cele menționate mai sus, vei descoperi că răspunsul lui Chip nu va fi doar ideal, ci va deveni optim.

Răspunsul simplu este acesta..
Este codul dependent de orice funcționalitate încorporată într-o anumită temă? Dacă da, atunci puneți-l într-o temă.
Doriți ca acest cod să fie transferabil între site-uri și între teme? Dacă da, atunci puneți-l într-un plugin.
Dacă răspunsul este nu la ambele întrebări de mai sus, atunci imaginați-vă site-ul peste 5 ani, când va fi timpul pentru o reproiectare. Funcționalitatea codului pe care îl scrieți este ceva care va supraviețui următoarei actualizări de design? Dacă da, puneți-l într-un plugin.
De asemenea, dacă nu utilizați teme derivate și plănuiți să actualizați tema, aș sugera să folosiți un plugin.

Pentru a răspunde OP:
Tipuri de postări personalizate și taxonomii
Ar trebui să fie într-un plugin, deoarece definesc elemente la nivel structural/conceptual, nu la nivel de prezentare
Formulare de contact
Sunt legate de prezentare și ar trebui să fie în funcțiile temei
Shortcode-uri
În plugin, deoarece sunt structurale
Widget-uri personalizate
Sunt puternic legate de prezentare și ar trebui să fie în funcțiile temei
add_theme_support( 'automatic-feed-links' );
Suportul pentru teme merge în funcțiile temei
Funcții SEO precum elemente meta personalizate
Legate de prezentare, deci în funcții
