Un primer pe Ajax în tabloul de bord WordPress - Solicitare și răspuns

În această serie de două părți, ne uităm la modul în care să introducem funcționalitatea specifică Ajax în WordPress Dashboard.

În primul articol din serie, am început să lucrăm la un plugin care afișează o notificare de îndată ce este activat ... dar asta este. În acest articol, vom adăuga funcționalitatea Ajax care va permite utilizatorilor să respingă mesajul și vom termina cu o versiune de lucru a pluginului.

Mai precis, vom acoperi toate lucrurile necesare atât pe partea de server, cât și pe partea clientului, care sunt necesare pentru a procesa o solicitare Ajax și a răspunde în mod corespunzător.

În cele din urmă, vom examina o listă de verificare a elementelor pe care trebuie să le aibă toate funcționalitățile WordPress bazate pe Ajax pentru a vă asigura că folosiți API în proiectele viitoare.


Îți amintești de nonce

Înainte de a începe, este important să vă asigurați că aveți valoarea nonce în funcția care vă face metoda de notificare. Pentru examinare, iată funcția pe care am inclus-o în primul articol:

 funcția publică display_admin_notice () $ html = '
„; $ html. = '

„; $ html. = __ ('Exemplul Ajax Notification plugin este activ. Acest mesaj va apărea până când veți decide să îl respingeți.', 'ajax-notification'); $ html. = '

„; $ html. = '". wp_create_nonce ("ajax-notification-nonce"). '„; $ html. = '
„; echo $ html;

Observați că folosim valoarea nonce wp_create_nonce într - un element de control care are ID-ul ajax-notificare-nonce. Aduc acest lucru din trei motive:

  1. Valorile Nonce oferă măsuri de securitate și sunt importante atunci când faceți orice tip de solicitare de la front-end la back-end.
  2. Din experiența mea, acesta este unul dintre lucrurile pe care dezvoltatorii le părăsesc cel mai adesea din munca lor - aceasta este menită să ne asigurăm că am acoperit acest lucru înainte de a scrie orice cod suplimentar.
  3. Elementul care conține valoarea nonce are nevoie de un ID specific, astfel încât să putem accesa cu ușurință utilizând JavaScript atunci când inițiază cererea Ajax.

Cu asta, hai să scriem funcția Ajax.


Pe Ajax

Clădirea funcționalității bazate pe Ajax în tabloul de bord WordPress include de obicei patru puncte cheie:

  • Unele funcții JavaScript care vor răspunde evenimentului utilizatorului și îl vor trimite pe server
  • O funcție de retur a apelării de la server, care este responsabilă pentru gestionarea solicitării venite din browser
  • Funcționalități de la server care vor trimite datele înapoi în browser
  • Funcția JavaScript responsabilă pentru gestionarea răspunsului

Deși nu există o ordine specială în care trebuie să scriem acest cod, vom merge în jos pe listă așa cum este menționat mai sus și vom lucra prin el.

Trimiterea cererii

Codul JavaScript pentru trimiterea cererii este o chestiune relativ boilerplate, dar trebuie să subliniem mai întâi ce anume avem de gând să facem:

  • Utilizatorul decide să respingă notificarea
  • Utilizatorul dă clic pe ancora pe care am trimis-o
  • JavaScript răspunde la eveniment atunci când utilizatorul face clic pe ancora respectivă
  • JavaScript trimite o cerere la server

Vom scrie codul treptat pentru a ne asigura că este ușor de urmărit. Mai întâi, vom începe prin setarea codului după încărcarea ferestrei și vom fi siguri că mesajul de notificare Ajax este prezent:

 (functie ($) $ (function () // Verificati pentru a vedea daca notificarea Ajax este vizibila, altfel // nu ne facem griji sa facem oricare din aceste lucruri daca ($ ('# dismiss-ajax-notification ') .length> 0) // Lucru TODO aici ...););  (JQuery));

Apoi, trebuie să configurați un handler de evenimente care să se declanșeze odată ce utilizatorul face clic pe ancora pe care am plasat-o în notificare. Pentru aceasta, avem nevoie de ID-ul elementului mesajului - adică, respingerea-ajax-notificare.

Deoarece un comportament implicit al unei ancore este de a încerca să navighezi spre el href atribut, trebuie de asemenea să împiedicăm să apară acțiunea implicită.

 (functie ($) "use strict"; $ (function () // Verificati daca notificarea Ajax este vizibila daca ($ (' deci trebuie să configurați un handler de evenimente pentru a declanșa concedierea lui $ ('# dismiss-ajax-notification'). end); (jQuery));

În acest moment, suntem gata să trimitem cererea către server. Pentru a face acest lucru, vom folosi jQuery post funcţie. Vom trece trei argumente:

  • Adresa URL a adresei la care trebuie trimisă solicitarea. Aceasta este o valoare globală oferită de WordPress. Este stocat în ajaxurl variabil
  • Hashul opțiunilor de trimitere către server. Aceasta include acțiunea - sau funcția - de foc pe server și valoarea nonce pentru validare
  • Funcția utilizată pentru a gestiona răspunsul

Să scriem toate acestea acum (inclusiv stubbing funcția de răspuns) și apoi vom hop peste codul de server-side.

 (functie ($) $ (function () // Verificati pentru a vedea daca notificarea Ajax este vizibila daca ($ ('dismiss + ajax-notification'). () (evet) evt.preventDefault (); // Inițierea unei cereri pe partea de server $ .post (ajaxurl,  // Numele funcției de foc pe acțiunea serverului: 'hide_admin_notification', // Valoarea nonce pentru a trimite pentru verificarea de securitate nonce: $ .trim ($ ('ajax-notification-nonce'). ), funcția (răspunsul) // TODO rutina de răspuns);); // end if); (jQuery));

Reamintim mai devreme că am spus că ar trebui să știm ID-ul câmpului care conține valoarea nonce - adică, ajax-notificare-nonce. Observați mai sus că luăm valoarea textului acelui element și îl trimitem serverului ca valoare a lui nonce cheie.

Al doilea lucru de observat este că trimitem de-a lungul unei chei de acțiune care are valoarea hide_admin_notification. Aceasta este o funcție pe care trebuie să o scriem pe server deoarece este ceea ce va fi responsabil pentru ascunderea efectivă a notificării.

Manipularea cererii

În fișierul plugin, trebuie să creați o funcție care are numele ca valoare de acțiune menționată mai sus: hide_admin_notification.

Ca de obicei, îmi place să vorbesc despre ce va face funcția înainte de a scrie orice cod. În acest caz, iată ce trebuie făcut:

  • Trebuie să ne asigurăm că intrarea necorespunzătoare este corectă; în caz contrar, nu vrem să executăm niciun cod
  • Trebuie să actualizăm opțiunea pe care am creat-o în primul articol pentru a seta renunțarea la falsă
  • Trebuie să trimitem o valoare înapoi în browser pentru a putea răspunde corespunzător funcției

Iată codul pentru a face acest lucru:

 funcția publică hide_admin_notification () // Mai întâi, verificați nonce pentru a vă asigura că se potrivește cu ceea ce am creat atunci când afișăm mesajul. Dacă nu, nu vom face nimic. dacă wp_verify_nonce ($ _REQUEST ['nonce'], 'ajax-notification-nonce')) // Dacă actualizarea opțiunii are succes, trimiteți 1 înapoi la browser; // În caz contrar, trimiteți 0. dacă (update_option ('hide_ajax_notification', true)) die ('1');  altceva die ('0');  // end if / else // end if

Este relativ simplu, nu-i așa? Cheia importantă de înțeles este că trimitem valoarea "1" în contextul a muri dacă opțiunea este actualizată cu succes; în caz contrar, trimitem valoarea "0". Acest lucru ne va permite să citim valoarea din răspunsul din browser pentru a determina cum să răspundem cel mai bine.

Evident, dacă valoarea returnată este 1, atunci putem ascunde notificarea.

Înainte de a reveni în JavaScript, trebuie să vă asigurați că efectuăm această operație prin utilizarea unui cârlig adecvat. Deci, în constructorul plugin-ului, să adăugăm o linie pentru ADD_ACTION:

 add_action ('wp_ajax_hide_admin_notification', array (& $ this, 'hide_admin_notification'));

Lucrul cheie care trebuie notat aici este faptul că eticheta pentru această funcție este etichetă "wp_ajax_hide_admin_notification'.

Dacă lucrați cu Ajax în tabloul de bord WordPress, atunci cârligul trebuie să fie adăugat cu wp_ajax_ prefix și ar trebui să se încheie cu numele funcției.

Acesta este cu siguranță cel de-al doilea cel mai important lucru pe care îl văd dezvoltatorii atunci când lucrează la codul bazat pe Ajax.

De aici, suntem gata să revenim în codul clientului.

Manipularea răspunsului

În cele din urmă, suntem gata să rezolvăm răspunsul. Acest lucru este ușor: dacă serverul răspunde cu 1, atunci ne vom ascunde; altfel, nu vom face nimic.

Acordat, cea mai bună practică ar fi să afișați un mesaj de eroare sau un tip de feedback pentru a permite utilizatorului să știe că ceva nu a mers bine, dar punctul principal al articolului este să demonstreze Ajax în WordPress, astfel încât vom schimba pur și simplu numele de clasă din la curent la eroare.

Iată ce trebuie adăugat la sursa JavaScript pentru a gestiona răspunsul:

 funcția (răspunsul) // Dacă răspunsul a avut succes (adică 1 a fost returnat), ascundeți notificarea; // În caz contrar, vom schimba numele clasei notificării dacă ('1' === răspuns) $ ('# ajax-notification') fadeOut ('slow');  altceva $ ('# ajax-notification') .removeClass ('actualizat') .addClass ('error');  // end if

Și asta este cu adevărat. Sursa JavaScript completă ar trebui să arate astfel:

 (functie ($) $ (function () // Verificati pentru a vedea daca notificarea Ajax este vizibila daca ($ ('dismiss + ajax-notification'). () (evet) evt.preventDefault (); // Inițierea unei cereri pe partea de server $ .post (ajaxurl,  // Numele funcției de foc pe acțiunea serverului: 'hide_admin_notification', // Valoarea nonce pentru a trimite pentru verificarea de securitate nonce: $ .trim ($ ('ajax-notification-nonce'). ), funcția (răspunsul) // Dacă răspunsul a avut succes (adică 1 a fost returnat), ascundeți notificarea; // În caz contrar, vom schimba numele clasei notificării dacă ('1' === răspunsul) $ ('# ajax-notification') fadeOut ('slow'); altul $ ('ajax-notification') .removeClass (' end);); // end if); (jQuery));

PHP plugin-ul ar trebui să arate astfel:

 / * Nume Plugin: Ajutor URI de notificare Ajax: http://github.com/tommcfarlin/ajax-notification Descriere: Un exemplu de plugin folosit pentru a demonstra API-ul WordPress Ajax pentru un articol însoțitor pe site-ul Envato WPTuts +. Versiune: 1.0 Autor: Tom McFarlin Autor URI: http://tommcfarlin.com Autor: Email: [email protected] Licență: Copyright 2012 Tom McFarlin ([email protected]) Acest program este software liber; îl puteți redistribui și / sau modifica în conformitate cu termenii GNU General Public License, versiunea 2, publicată de Fundația pentru Software Liber. Acest program este distribuit în speranța că va fi util, dar FĂRĂ NICI O GARANȚIE; fără nici măcar garanția implicită de VANDABILITATE sau de FITNESS PENTRU UN SCOP SPECIC. Pentru mai multe detalii, consultați Licența publică generală GNU. Ar fi trebuit să fi primit o copie a Licenței Publice Generale GNU împreună cu acest program; dacă nu, scrieți la Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 SUA * / clasa Ajax_Notification / * ---------------- ---------------------------- * * Constructor * ------------------ -------------------------- * / / ** * Inițializează pluginul prin setarea funcțiilor de localizare, filtre și administrare. * / funcția __construct () load_plugin_textdomain ('ajax-notification', false, dirname (plugin_basename (__FILE__)). '/ lang'); register_activation_hook (__FILE__, array (& $ this, 'activ')); register_deactivation_hook (__FILE__, array (& $ this, 'dezactivare')); add_action ('admin_enqueue_scripts', array (& $ this, 'register_admin_scripts')); // Afișează notificarea de administrator numai dacă nu a fost ascunsă dacă (false == get_option ('hide_ajax_notification')) add_action ('admin_notices', array (& $ this, 'display_admin_notice'));  // sfârșit dacă add_action ('wp_ajax_hide_admin_notification', array (& $ this, 'hide_admin_notification'));  // constructor final / * ------------------------------------------- - * * Funcții de bază * ------------------------------------------ - * / / ** ** La activare, adăugați o nouă opțiune utilizată pentru a urmări dacă doriți sau nu să afișați notificarea. * / funcția publică activate () add_option ('hide_ajax_notification', false);  // end activate / ** * La dezactivare, elimină opțiunea care a fost creată când plugin-ul a fost activat. * / dezactivarea funcției publice () delete_option ('hide_ajax_notification');  // end deactivate / ** * Înregistrează și încalcă codul JavaScript specificat pentru administrare. * / funcția publică register_admin_scripts () wp_register_script ('ajax-notification-admin', plugins_url ('ajax-notification / js / admin.min.js')); wp_enqueue_script ('ajax-notificare-admin');  // end register_admin_scripts / ** * Redă nota de administrare. De asemenea, face un nonce ascuns folosit pentru securitate atunci când procesează cererea Ajax. * / funcția publică display_admin_notice () $ html = '
„; $ html. = '

„; $ html. = __ ('Exemplul Ajax Notification plugin este activ. Acest mesaj va apărea până când veți decide să îl respingeți.', 'ajax-notification'); $ html. = '

„; $ html. = '". wp_create_nonce ("ajax-notification-nonce"). '„; $ html. = '
„; echo $ html; // end display_admin_notice / ** * Callback JavaScript utilizat pentru a ascunde notificarea de administrare atunci când se face clic pe ancora 'Dismiss' pe front. * / funcția publică hide_admin_notification () // Mai întâi, verificați nonce pentru a vă asigura că se potrivește cu ceea ce am creat la afișarea mesajului. Dacă nu, nu vom face nimic. dacă wp_verify_nonce ($ _REQUEST ['nonce'], 'ajax-notification-nonce')) // Dacă actualizarea opțiunii are succes, trimiteți 1 înapoi la browser; // În caz contrar, trimiteți 0. dacă (update_option ('hide_ajax_notification', true)) die ('1'); altceva die ('0'); // end if / else // end if // end hide_admin_notification // Ajax_Notification ();

Concluzie

Puteți lua pluginul pe GitHub. Pentru referință, asigurați-vă că consultați următoarele resurse:

  • WordPress Nonce
  • jQuery.post
  • Ajax pe partea administrativă
Cod