În această serie, am analizat modul de creare a paginilor de administrare personalizate în WordPress fără a utiliza API-ul pentru setări. Acest lucru nu înseamnă că API-ul pentru setări nu este util (deoarece este!), Dar pot exista momente când trebuie să implementăm anumite funcții personalizate sau implementări mai detaliate ale caracteristicilor pe care API-urile disponibile nu le permit.
În plus, ne uităm la unele dintre cele mai importante principii de dezvoltare a software-ului, cum ar fi principiul responsabilității unice și aplicarea acestora la munca noastră.
Dacă tocmai vă alăturați seriei, vă recomand să citiți posturile anterioare, astfel încât să fiți familiarizați cu ceea ce am făcut până acum și astfel să înțelegeți de ce luăm unele decizii că suntem atunci cand scriem codul nostru.
Deși nu pot rezuma tot ceea ce am acoperit până acum în serie, mă pot asigura că subliniez punctele importante.
intrare
a fost adăugat un element care va accepta contribuția utilizatorilor.Cu toate acestea, presupun că aveți cea mai recentă versiune a codului sursă (care este disponibilă ca atașament în articolul precedent) și sunteți gata să vă deplasați înainte.
Ca și în celelalte articole, presupun că aveți un mediu local de dezvoltare WordPress instalat pe mașina dvs..
Mai mult, presupun că aveți cea mai recentă versiune a codului sursă și că sunteți gata să continuați să construiți pe partea de sus a acesteia sau sunteți confortabil să citiți codul pe care îl avem aici și să îl implementați atunci când aveți mai mult timp.
În cele din urmă, vom trece prin fiecare bit de cod incremental. În primul rând, voi vorbi despre ceea ce vom face, atunci voi arăta codul, iar apoi voi explica tot ce face codul, așa că nu mai rămâne nimic care ar putea fi confuz.
Dacă, totuși, vă veți confunda cu ceva în cod și tutorialul nu face o treabă bună de a explica ce se întâmplă, atunci vă rugăm să lăsați un comentariu și voi fi sigur că va urma cu tine.
Să începem.
În ultimul articol, am rămas cu un plugin care arată ca și cum ar face ceva, dar nu salvează de fapt nimic în baza de date, să nu mai vorbim să recuperăm nimic din baza de date.
Pe scurt, avem un plugin care arată funcțional, dar nu este. Și acolo vom ajunge la acest tutorial.
Mai exact, vom aborda următoarele subiecte:
Cu aceasta ca foaia de parcurs, suntem gata să revenim în cod și să continuăm să lucrăm la plugin.
Amintiți-vă din postul anterior, am profitat de funcția API WordPress wp_nonce_field
. Această funcție particulară face următoarele:
Câmpul nonce este utilizat pentru a valida faptul că conținutul cererii de formular a venit de pe site-ul curent și nu în altă parte. Un nonce nu oferă protecție absolută, ci ar trebui să protejeze împotriva celor mai multe cazuri. Este foarte important să folosim câmpurile nonce în forme.
Dacă încercați să salvați pagina cu opțiuni, veți avea probabil un ecran alb. Nu este niciodată bine, dar este ceea ce ne așteptăm, având în vedere stadiul actual al plugin-ului nostru.
Trebuie să introducem o funcție care să cupleze într-unul dintre cârligele WordPress disponibile și va verifica dacă valoarea nonce este validă. Daca este valabil, atunci ne va permite să continuăm cu salvarea informațiilor; în caz contrar, nu ar trebui să ne lase să procedăm.
De vreme ce suntem în căutarea unei pagini de administrare personalizate, vom avea nevoie de un cârlig diferit de cel pe care ni-l putem folosi în situații de genul asta. În acest exemplu, vom folosi admin_post
cârlig.
Incendii la o cerere de autentificare de administrator autentificată, în cazul în care nu a fost furnizată nicio acțiune.
Reamintim din discuțiile noastre anterioare că nu vrem să supraîncărcăm clasele noastre cu mai multă responsabilitate decât este necesar. Amintiți-vă, întrebarea pe care trebuie să ne întrebăm în mod constant este: "Ce motiv ar trebui să se schimbe această clasă?"
În prezent, nu avem o clasă care să gestioneze opțiunile de salvare. Deci, să introducem unul. În directorul de administrare al pluginului, să creăm un serializer
clasă. Acesta va fi responsabil pentru salvarea valorii opțiunilor noastre.
După cum puteți vedea, mi-am numit dosarul clasa-serializer.php
. Știm din experiență și din codul de mai sus că va trebui să cârlig în admin_post
cârlig menționate mai sus și știm că vom avea nevoie de o funcție responsabilă de salvarea informațiilor.
Să le definim acum.
Evident, mai avem încă de lucru (de fapt, nici măcar nu am instanțiat această clasă!), Dar codul de mai sus ar putea fi suficient pentru a vedea unde ne îndreptăm.
O conversație rapidă despre dependențe
Înainte de a adăuga orice funcționalitate, hai să mergem mai departe și să setăm acest lucru când pluginul nostru se încarcă. În primul rând, returnați
personalizate-admin-settings.php
. Acum, în acest moment, trebuie să ne întrebăm dacă oricare dintre clasele noastre existente ar trebui să aibă serializatorul ca o dependență.Cred că se poate face un caz ca
Submenu_Page
ar trebui să aibă o referință la serializator, deoarece pagina are opțiunile de salvare.De asemenea, este posibil să lăsați acest fișier complet separat și să îl aveți la dispoziție pentru un alt model. Dacă ar fi să facem acest lucru, ne-am fi diferiți de subiectul la îndemână. Deși cred că este important, este în afara scopului a ceea ce vrem să facem.
Deci, hai să instanțiăm
serializer
clasa, inițializați-o și apoi treceți-o în constructorul paginii de submeniu. Codul din fișierul de bootstrap al pluginului ar trebui să arate astfel:init (); $ plugin = nou Submeniu (nou submeniu_Page ($ serializer)); $ Plugin-> init ();Cu aceasta, suntem gata să continuăm salvarea opțiunilor noastre.
Înapoi la dezvoltare
Să ne întoarcem la
serializer
. Acum, când l-am conectat la restul pluginului, este timpul să scriem un cod astfel încât, după cum sugerează comentariul, să verificăm valoarea nonce pe care am creat-o pe front-end.Din fericire, WordPress face acest lucru ușor prin intermediul unei funcții API încorporate:
wp_verify_nonce
. Această funcție acceptă două argumente:
- Actiunea
- Numele
Dacă vă amintiți din articolul precedent, am folosit
Acme-settings-save
ca și acțiunea noastră șiAcme-custom-mesaj
ca valoare nonce noastre. Pentru ao valida, trebuie să verificăm dacă există$ _POST
de colectare și că acesta trece verificările native ale WordPress.Pentru a face acest lucru, îmi place să creez a
privat
metodă care îmi permite să încapsulez această logică într - o funcție pe care o pot folosi înSalvați
funcția pe care am definit-o mai sus.După ce am terminat, pot să includ un apel la această funcție, care să ne permită să verificăm valabilitatea trimiterii și fie să ieșim din rutină, fie să mergem la următoarea verificare (la care vom ajunge la moment).
Rețineți că simpla returnare a falsului în această condiție nu este o modalitate adecvată de a face față acestei situații. În schimb, ar fi mai curat să introduci un mesaj de eroare care se afișează în tabloul de bord WordPress. Acesta este un lucru pe care îl vom revizui într-un viitor tutorial.
Pentru moment, totuși, suntem în primul rând preocupați de asigurarea faptului că suntem capabili să trimitem datele cu succes. Acest lucru ne aduce la următoarea porțiune a codului nostru.
Permisiune
Chiar dacă numărul de validare folosit o singură dată (sau nonce) a fost verificat, mai avem încă un lucru pe care trebuie să-l verificăm: trebuie să ne asigurăm că utilizatorul curent are permisiunea de a salva datele.
Pentru scopurile noastre, dorim să ne asigurăm că utilizatorul curent este un administrator. Pentru a face acest lucru, ne putem uita la capabilitățile utilizatorului curent (puteți vedea că această pagină oferă o referință pentru fiecare rol și capabilitățile asociate acestuia).
Observați că una dintre capabilitățile administrației este de a gestiona opțiunile. Acum putem folosi funcția API WordPress
current_user_can
pentru a verifica dacă utilizatorul curent poate salva opțiunile din această pagină.Dar, mai întâi, aceasta ridică o întrebare: dacă utilizatorul nu poate salva opțiunile, de ce ar trebui să li se permită să vadă efectiv pagina în primul rând?
Dacă vă amintiți din mai devreme în serie, am scris următorul cod de cod:
submenu_page, 'render'));Aceasta asigură pagina opțiunilor este disponibilă numai administratorilor; cu toate acestea, dorim să fim foarte atenți și să facem un control pentru acest lucru în timpul procesului de serializare, de asemenea.
Acum putem actualiza condiția în care verificăm, de asemenea, valoarea nonce, de asemenea, pentru a verifica permisiunea utilizatorului curent:
has_valid_nonce () && current_user_can ('manage_options'))) // TODO: Afișați un mesaj de eroare. // Dacă cele de mai sus sunt valide, salvați opțiunea.Acum, că avem un cod în loc pentru a ne asigura că valoarea nonce este setată și că utilizatorul curent poate salva valoarea, putem merge mai departe cu dezinfectarea.
Ține minte, noi voi reveniți la locul în care se spune că trebuie să afișăm un mesaj de eroare. Dar asta nu este în acest tutorial.
sanitization
"Dar așteptați", spuneți voi. "Am crezut că ne pregătim să salvăm opțiunea!" Suntem, dar înainte de a putea face acest lucru trebuie să trecem printr-un proces de igienizare. Pe scurt, sanitizarea este ideea de a vă asigura că datele sunt curate, sigure și, hm, sanitare pentru baza de date.
Pur și simplu, acesta împiedică utilizatorii rău intenționați să introducă informații în baza de date care ar putea afecta în cele din urmă site-ul nostru.
Din fericire, WordPress oferă o funcție de ajutor care ne permite să ne asigurăm că acest lucru este cât se poate de ușor. Pentru cei interesați, puteți citi totul despre validarea și dezinfectarea datelor (deși vom examina validarea în tutorialul următor).
În codul nostru, vom folosi
sanitize_text_field
(așa cum este legat mai sus). Această funcție va face următoarele:
Destul de frumos să fie disponibil, nu-i așa? Să facem asta să funcționeze. Pentru aceasta, localizați Salvați
cu care lucram și actualizăm-o astfel încât să pară următoarele:
has_valid_nonce () && current_user_can ('manage_options'))) // TODO: Afișați un mesaj de eroare. // Dacă cele de mai sus sunt valabile, dezinfectați și salvați opțiunea. dacă null! == wp_unslash ($ _POST ['acme-message']))) $ value = sanitize_text_field ($ _POST ['acme-message']); update_option ('tutsplus-custom-data', valoare $);
Observați că citim intrarea din $ _POST
colectarea, dezinfectarea și apoi salvarea rezultatului într-o variabilă separată. Apoi, acea variabilă este scrisă în baza de date folosind update_option
funcţie.
Pentru acest articol, prefer să folosesc cheia tutsplus-custom-date
. Indiferent ce folosiți, este important să fie prefixată cu ceva unic, astfel încât un alt plugin sau temă să nu suprascrie opțiunea și să nu înlocuiți o opțiune existentă.
În cele din urmă, trebuie să redirecționăm înapoi la pagina cu opțiuni. Deoarece nu folosim un API încorporat, va trebui să scriem o funcție pentru a face acest lucru pentru noi. Din fericire, este foarte ușor.
Mai întâi, creați o funcție numită redirecționare și asigurați-vă că arată astfel:
Codul de mai sus ar trebui să să fie explicativ, dar pentru a vă asigura că este clar, face următoarele:
- Verifică pentru a vă asigura că o valoare WordPress privată este prezentă în
$ _POST
Colectie. Dacă nu este setat, atunci va fi egal cu adresa URL de conectare WordPress. Acest lucru va forța oamenii la pagina de conectare dacă adresa URL de trimitere nu este setată; cu toate acestea, nu există nici un motiv pentru care să nu fie.- Apoi, luăm referire și dezinfectăm datele. Acesta este un lucru pe care standardele de codare îl solicită și se asigură că datele sunt curate.
- În cele din urmă, inițializăm o
wp_safe_redirect
la adresa URL, astfel încât să ne întoarcem la pagina de opțiuni.După ce se termină toate acestea, adăugați acest lucru ca ultimul rând din
Salvați
funcția de mai sus. Versiunea finală a codului ar trebui să arate astfel:has_valid_nonce () && current_user_can ('manage_options'))) // TODO: Afișați un mesaj de eroare. // Dacă cele de mai sus sunt valabile, dezinfectați și salvați opțiunea. dacă null! == wp_unslash ($ _POST ['acme-message']))) $ value = sanitize_text_field ($ _POST ['acme-message']); update_option ('tutsplus-custom-data', valoare $); $ this-> redirect (); / ** * Stabilește dacă variabila nonce asociată cu pagina cu opțiuni este setată * și este validă. * * @access private * * @return boolean Fals dacă câmpul nu este setat sau valoarea nonce este nevalidă; * altfel, adevărat. * / funcția privată has_valid_nonce () // Dacă câmpul nu este chiar în $ _POST, atunci este nevalid. dacă isset ($ _POST ['acme-custom-message']))) // Introduceți var bine. return false; $ field = wp_unslash ($ _POST ['acme-personalizat-mesaj']); $ actiune = 'acme-settings-save'; returnați wp_verify_nonce ($ field, $ action); / ** * Redirecționați către pagina din care am venit (care ar trebui să fie întotdeauna pagina de admin *.) Dacă referința nu este setată, atunci redirecționăm utilizatorul la * pagina de conectare. funcția redirect () // Pentru a face standardele de codificare fericite, trebuie să inițializăm acest lucru dacă (isset ($ _POST ['_ wp_http_referer']))) // Introduceți var okay $ _POST ['_wp_http_referer'] = wp_login_url (); // Sanitizează valoarea colecției $ _POST pentru standardele de codare $ url = sanitize_text_field (wp_unslash ($ _POST ['_ wp_http_referer']) // Input var okay;) // În final, redirecționați înapoi la pagina de administrare wp_safe_redirect (urldecode ($ url)); ieșire;Iată lucrurile: avem securitate, dezinfectare, serializare și redirecționare. Dar nu afișăm mesaje de eroare și nu preluăm datele.
Acolo vom lua locul următorului tutorial.
Concluzie
În acest moment, avem un plugin semi-funcțional, dar mai avem încă de lucru. Evident, informațiile pe care le trimitem la baza de date nu sunt afișate nicăieri și nu este un lucru bun.
Dar, la fel ca în cazul salvării informațiilor, există lucruri importante de luat în considerare atunci când se creează informații. În tutorialul următor, vom examina descărcarea informațiilor, afișarea lor pe front-end, afișarea acestora pe pagina de opțiuni și actualizarea informațiilor în timp ce utilizatorul modifică valoarea elementului de intrare.
Între timp, dacă sunteți în căutarea pentru alte utilități pentru a vă ajuta să construi setul tot mai mare de instrumente pentru WordPress sau de cod pentru a studia și de a deveni mai bine versat în WordPress, nu uitați să vedem ce avem la dispoziție în Envato Piaţă.
Amintiți-vă că puteți prinde toate cursurile și tutorialele mele pe pagina mea de profil și puteți să mă urmați pe blogul meu și / sau pe Twitter la @tommcfarlin unde vorbesc despre diverse practici de dezvoltare software și cum le putem angaja în WordPress.
În cele din urmă, nu ezitați să lăsați orice întrebări sau comentarii în feed-ul de mai jos. Fac tot ce pot pentru a participa și a răspunde la fiecare întrebare sau critică pe care o oferiți în legătură cu acest proiect.
Resurse