Scrierea unor API-uri mai bune și a unor biblioteci pentru WordPress

Se simte ca tot ce atingem este atent proiectat: site-uri web, telefoane, hărți de metrou și așa mai departe. Chiar și lucrurile pe care le obișnuisem să le acceptăm: termostatele, detectoarele de fum și tablourile de bord ale autovehiculelor primesc acum un tratament atent pentru utilizatori.

Designul nu are doar aspectul și simțul: este vorba despre a lua în considerare toate modalitățile pe care un utilizator trebuie să le interacționeze cu dispozitivul / instrumentul / ecranul / obiectul. 

Acest lucru este valabil și pentru programare.

(Un) programare proiectată

Limbile de programare sunt lumi mari, complicate. Chiar și PHP, despre care mulți snobi de programare cred că este prea "ușor", este de fapt un amestec destul de complicat de funcții și clase care se comportă în moduri foarte incoerente. 

Sintaxa, metodele și denumirea au evoluat de-a lungul multor ani în milioane de utilizatori și aplicații diferite. Cele mai multe tind să reflecte construcția de bază a internelor - nu neapărat cum ați dori să o utilizați.

Marile momente în designul API: jQuery

Când am început să scriu JavaScript înapoi în 2006, a fost o mizerie. Iată cum aș găsi o etichetă cu o anumită clasă și o mutați în DOM înapoi:

var uls = getElementsByTagName ("ul"); var classToSearch = "alimente"; pentru (var i = 0; i < uls.length; i++)  var classes = uls[i].getClasses(); for (var j = 0; j < classes.length; j++) if (classes[j] == classToSearch) myUL = uls[i];    var $li = document.createElement('li'); $li.innerHTML = 'Steak'; myUL.innerHTML += $li;

Terminat!

jQuery a făcut JavaScript distractiv din nou. La sfârșitul anilor 2000, efectul a fost atât de dramatic încât îmi amintesc că tatăl meu mi-a cerut "ceva jkwery" pe care a citit-o în Wall Street Journal. Dar, în ciuda efectului său deosebit, jQuery nu a adăugat JavaScript la funcții noi. A luat doar lucrurile pe care dezvoltatorii trebuia să le facă și le-au rupt în modele cu adevărat clare.

Mai degrabă decât să inventeze cum să găsească lucruri pe pagină, ei au valorificat ceea ce oamenii știau deja: selectorii CSS. Apoi a fost doar o chestiune de a colecta o mulțime de acțiuni comune și de a le organiza în câteva duzini de funcții. Să încercăm din nou exemplul anterior, acum cu jQuery:

var $ li = $ ('
  • Friptură
  • „); $ ( "Ul.foods") append ($ li).

    În 2006, am cumpărat o pagină de 680 de pagini pe Ajax. Cu API-ul excelent al jQuery, care a fost destul de mult înlocuit de acest lucru:

    $ .Post ();

    API-ul WordPress

    Deși API a ajuns să însemne "serviciu terță parte", înseamnă pur și simplu interfața de programare pentru a vorbi cu un sistem. La fel ca și un API Twitter sau un API Facebook, există un API WordPress. Nu faceți interogări de bază de date pentru a crea o postare, nu? Să utilizați wp_insert_post.

    Dar multe găuri de design creează API-ul WordPress. Puteti folosi get_the_title dar get_the_permalink generează o eroare, pe care o utilizați get_permalink. Hei, atunci când aveți un proiect de zeci de ani cu sursă deschisă care implică codul mii de oameni și milioane de utilizatori: veți obține niște quirks.

    Vă puteți salva o mulțime de timp prin mascarea acestor ciudățenii și scrierea obiceiurilor și comportamentelor programatorului pe care îl scrieți (care poate fi tu). Aici puteți crea interfața potrivită pentru a programa pluginurile și temele pe care le faceți în fiecare zi.


    Soluția

    Pentru a accelera munca noastră și a reduce sarcinile repetate, am creat biblioteci pentru a face față comenzilor și personalizărilor de care am nevoie tot timpul.

    1. Comenzi rapide pentru sarcinile obișnuite

    Luați, de exemplu, apucând sursa miniaturii postului. Se pare că nu există funcția WordPress încorporată pentru a apuca o miniatură bazată pe ID-ul unei postări (numai atașament ID). 

    Ceea ce înseamnă că adesea mă găsesc că fac asta:

    $ thumb_id = get_post_thumbnail_id (primiți_ID ()); $ src = wp_get_attachment_thumb_url ($ thumb_id); echo "„;

    Dar trebuie să fie o cale mai bună!

    funcția get_thumbnail_src ($ post) $ thumb_id = get_post_thumbnail_id ($ post); $ src = wp_get_attachment_thumb_url ($ thumb_id); retur $ src;  echo '„;

    2: Intrări imprevizibile, ieșire previzibilă

    Mult mai bine! De fapt, vă aflați prin folosirea ei tot timpul și apoi împărtășirea cu alți dezvoltatori la compania dvs.. 

    Prietenul tău are probleme cu el, așa că te cheamă să depanezi și tu vezi:

    echo "„;

    Se pare că a folosit-o accidental get_post in loc de get_the_ID. Tu țipi la el. Dar așteptați o secundă, de ce nu o face mai multă acceptare? 

    Poate că ne putem ajusta funcția astfel încât să se poată lua WP_Post obiect și tot dau utilizatorului ceea ce așteaptă. Să ne întoarcem la această funcție:

    funcția get_thumbnail_src ($ post) if (is_object ($ post) && isset ($ post-> ID)) $ post = $ post-> ID;  altfel dacă (is_array ($ post) && isset ($ post ['ID'])) $ post = $ post ['ID'];  $ thumb_id = get_post_thumbnail_id ($ post); $ src = wp_get_attachment_thumb_url ($ thumb_id); retur $ src; 

    Deci, dacă trimit a WP_Post obiect sau o funcție, funcția dvs. le va ajuta în continuare să obțină ceea ce au nevoie. Aceasta este o parte imensă a unui API de succes: ascunzând înfruntarea. Ai putea să faci funcții separate pentru get_thumbnail_src_by_post_id și get_thumbnail_src_by_wp_post_object. 

    De fapt, pentru transformări mai complicate ar putea fi de preferat, dar puteți simplifica interfața, având o singură rută de funcții la subrutina corectă. Indiferent de ce trimite utilizatorul, funcția returnează în mod consecvent un șir pentru sursa de imagine. 

    Să continuăm: Și dacă trimit nimic?

    3. Valori implicite sensibile

    funcția get_thumbnail_src ($ post = false) if (false === $ post) $ post = get_the_ID ();  altfel dacă (is_object ($ post) && isset ($ post-> ID)) $ post = $ post-> ID;  altfel dacă (is_array ($ post) && isset ($ post ['ID'])) $ post = $ post ['ID'];  $ thumb_id = get_post_thumbnail_id ($ post); $ src = wp_get_attachment_thumb_url ($ thumb_id); retur $ src; 

    Am simplificat încă o dată, astfel încât utilizatorul nu trebuie să trimită o postare sau chiar și un ID post. Când este în buclă, tot ce este necesar este:

    echo "„;

    Funcția noastră va fi implicit la ID-ul postului curent. Aceasta se transformă într-o funcție foarte valoroasă. Pentru a vă asigura că acest lucru se va juca frumos, să îl înfășurăm în interiorul unei clase astfel încât să nu polueze spațiul de nume global.

    / * Nume Plugin: JaredTools Descriere: Toolbox-ul meu pentru teme WordPress. Autor: Jared Novack Versiune: 0.1 Autor URI: http://upstatement.com/ * / clasa JaredsTools funcția statică publică get_thumbnail_src ($ post = false) if (false === $ post) $ post = get_the_ID ;  altfel dacă (is_object ($ post) && isset ($ post-> ID)) $ post = $ post-> ID;  altfel dacă (is_array ($ post) && isset ($ post ['ID'])) $ post = $ post ['ID'];  $ thumb_id = get_post_thumbnail_id ($ post); $ src = wp_get_attachment_thumb_url ($ thumb_id); retur $ src; 

    Și Vă rog nu vă prefixați clasa WP. Fac această funcție statică publică pentru că vreau să fie accesibilă peste tot și nu se schimbă: intrarea sau execuția nu schimbă funcția sau obiectul. 

    Apelul final la această funcție este:

    echo "„;

    Proiectați mai întâi, construiți mai târziu

    Să mergem într-o nevoie mai complicată. Când scriu plugin-uri mi se pare că trebuie să generez întotdeauna diferite tipuri de erori și / sau să actualizez mesaje. 

    Dar sintaxa bazată pe eveniment mi-a întârziat mereu:

    add_action ('admin_notices', 'show_my_notice'); functon show_my_notice () echo '

    Lucrul tău a fost actualizat

    „;

    Există o mulțime de motive bune pentru care WordPress urmează această arhitectură bazată pe evenimente. Dar nu este intuitiv, dacă nu doriți să stați în jur și să memorați filtre și acțiuni diferite. 

    Să facem acest lucru cu cel mai simplu caz de utilizare: trebuie să arăt o notificare de administrator. Îmi place să proiectez acest API-primul: unde îmi dau seama cel mai bun mod de a se referi la funcția din codul meu. Aș vrea să citesc astfel:

    funcția thing_that_happens_in_my_plugin ($ post_id, valoare $) $ updated = update_post_meta ($ post_id, valoare $); dacă $ actualizat) JaredsTools :: show_admin_notice ("Lucrul tău a fost actualizat") altceva JaredsTools :: show_admin_notice ("Eroare la actualizarea lucrurilor", "eroare"); 

    Odată ce am proiectat punctul final, pot îndeplini cerința de proiectare:

    clasa JaredsTools funcția publică statică show_admin_notice ($ message, $ class = 'actualizat') add_action ('admin_notices', function ()

    '$ Mesaj'.

    „; );

    Mult mai bine! Acum nu este nevoie să creați toate aceste funcții suplimentare sau să vă amintiți numele nebun de cârlig. Aici folosesc funcții anonime PHP (numite și "închideri") care ne permit să legăm o funcție direct la o acțiune sau un filtru. 

    Acest lucru vă scutește de a avea o grămadă de funcții suplimentare care plutesc în jurul fișierelor. utilizare comandă ne permite să transmitem argumentele din funcția părinte în închiderea copilului.

    Fii intuitiv

    Acum, un alt coleg de muncă te cheamă. Ea nu știe de ce anunțul ei de admin nu devine roșu:

    JaredsTools :: show_admin_notice ("Eroare la actualizarea lucrurilor", "roșu");

    Este pentru că trimite "roșu" (pe care s-ar aștepta să o transforme într-o cutie roșie) atunci când, de fapt, ar trebui să trimită numele clasă acea declanșatoare roșu. Dar de ce să nu o faceți mai ușor?

    funcția statică publică show_notice ($ message, $ class = 'actualizare') $ class = trim (strtolower ($ class)); dacă ('galben' == clasă $) $ class = 'actualizat';  dacă ('roșu' == $ clasă) $ class = 'eroare';  add_action ('admin_notices', funcția () folosiți ($ text, $ class) echo '

    ". $ text. '

    „; );

    Am acceptat acum pentru o mai mare toleranță față de utilizatori, care va face mai ușoară partajarea și pentru noi când ne vom întoarce să o folosim luni de acum înainte.


    Concluzie

    După ce ați construit o serie de astfel de elemente, iată câteva dintre principiile pe care le-am învățat să le fac foarte utile pentru echipa mea și pentru mine.

    1. Deseneaza-l mai intai si lasa functia sa se potriveasca cu modul in care oamenii vor sa o foloseasca.
    2. Salvați tastatura! Faceți comenzi rapide pentru sarcini obișnuite.
    3. Oferiți valori implicite sensibile.
    4. Fii minim. Lăsați biblioteca să se ocupe de prelucrare.
    5. Fii iertator la intrare, dar precis la ieșire.
    6. Acestea fiind folosite folosesc cât mai puține argumente funcționale, patru sunt maxime bune. După aceea, ar trebui să faceți o gamă de opțiuni.
    7. Organizați-vă biblioteca în clase separate pentru a acoperi diferite zone (admin, imagini, posturi personalizate etc.).
    8. Documentați cu exemplu de cod.

    La Upstatement, bibliotecile noastre pentru cherestea fac mai ușor construirea de teme și Jigsaw oferă comenzi rapide de economisire a timpului pentru a personaliza fiecare instalare.

    Economiile de timp oferite de aceste instrumente ne permit să ne petrecem mai mult timp construind părțile noi și inovatoare ale fiecărui site sau aplicație. Prin preluarea comenzilor care sunt altfel esoterice (cum ar fi adăugarea unei coloane în tabelele de post administrare) și crearea de interfețe simple: orice designer sau dezvoltator de la compania noastră poate personaliza pe deplin fiecare site cu aceeași putere ca un dezvoltator pro WordPress.

    Cod