Notificări WordPress simplificate
Publicat: 2022-03-10 WordPress nu oferă niciun fel de sistem de notificare. Tot ce puteți utiliza este funcția wp_mail()
, dar toate setările trebuie să fie codificate, altfel trebuie să creați un ecran de setări separat pentru a permite utilizatorului să modifice opțiunile. Este nevoie de multe ore pentru a scrie un sistem care este fiabil, configurabil și ușor de utilizat. Dar nu mai. Vă voi arăta cum să vă creați propriul sistem de notificare în câteva minute cu pluginul gratuit de notificare. Prin notificare mă refer la orice fel de notificare . De cele mai multe ori, va fi e-mail, dar cu pluginul pe care îl vom folosi, puteți trimite și webhook-uri și alte tipuri de notificări.
În timp ce cream un proiect pentru unul dintre clienții mei, am întâlnit această problemă pe care am descris-o. Cerința a fost să existe mai multe alerte personalizate prin e-mail cu conținut configurabil. În loc să codific fiecare alertă, am decis să construiesc un sistem. Mi-am dorit să fie foarte flexibil, iar scopul a fost să pot codifica noi scenarii cât mai repede posibil.
Codul pe care l-am scris a fost începutul unei mari călătorii de dezvoltare. S-a dovedit că sistemul pe care l-am creat a fost suficient de flexibil încât să poată funcționa ca un pachet separat. Așa s-a născut pluginul Notification.
Să presupunem că doriți să trimiteți un e-mail despre actualizarea unui profil de utilizator de către unul dintre membrii site-ului dvs. WordPress nu oferă această funcționalitate, dar cu pluginul Notificare, puteți crea un astfel de e-mail în câteva minute. Sau să presupunem că doriți să sincronizați produsele WooCommerce cu software terță parte, trimițând un webhook la o adresă URL separată de fiecare dată când este publicat un produs nou. Este ușor de făcut și cu pluginul.
Lecții învățate în timpul dezvoltării pluginurilor WordPress
Dezvoltarea și suportul bun de plugin duc la mai multe descărcări. Mai multe descărcări înseamnă mai mulți bani și o reputație mai bună. Aflați cum puteți dezvolta produse de bună calitate cu șapte reguli de aur. Citiți un articol înrudit →
În acest articol, veți învăța cum să integrați pluginul în propria aplicație și cum să creați un sistem avansat de notificare WordPress mai rapid și ușor ca niciodată.
În acest articol, vom acoperi:
- cum se instalează pluginul,
- ideea din spatele pluginului și arhitectura acestuia,
- crearea unui scenariu personalizat pentru notificări,
- crearea acțiunii (pasul 1 al procesului),
- crearea declanșatorului (pasul 2 al procesului),
- crearea tipului de notificare personalizat,
- cum să activați modul etichetă albă și să includeți pluginul în pachetul dvs.
Instalarea pluginului
Pentru a vă crea propriile scenarii, veți avea nevoie de pluginul Notificare. Doar instalați-l din depozitul WordPress.org în tabloul de bord WordPress sau descărcați-l din depozitul GitHub.

Mai târziu în articol, veți învăța cum să ascundeți acest plugin de clienții dvs. și să îl faceți să funcționeze ca parte integrată a pluginului sau a temei dvs.
Ideea Pluginului
Înainte de a intra în editorul de cod, va trebui să știți cum arată arhitectura pluginului. Pluginul conține multe componente diferite, dar nucleul său este într-adevăr câteva clase abstracte.
Componentele principale sunt:
- Notificarea
Acesta poate fi un e-mail, un webhook, o notificare push sau un SMS. - Trăgaciul
Acesta este ceea ce trimite notificarea. Este efectiv acțiunea WordPress. - Eticheta de îmbinare
Aceasta este o mică parte a conținutului dinamic, cum ar fi{post_title}
.
Pentru a vă face o idee mai bună despre cum se joacă totul împreună, puteți viziona acest scurt videoclip:
Nucleul pluginului Notification este de fapt doar un API. Toate declanșatoarele implicite, cum ar fi Postul publicat și Utilizatorul înregistrat , sunt lucruri construite pe baza acelui API.
Deoarece pluginul a fost creat pentru dezvoltatori, adăugarea propriilor declanșatoare este foarte ușoară. Tot ceea ce este necesar este o acțiune WordPress, care este doar o singură linie de cod și o declarație de clasă.
Scenariu personalizat
Să creăm un scenariu simplu. Vom adăuga o zonă de text și un buton în partea de jos a fiecărei postări, permițând raportarea erorilor din articol. Apoi, vom declanșa notificarea la trimiterea formularului.

Acest scenariu a fost tratat într-un alt articol, „Trimiterea formularelor fără reîncărcarea paginii: implementarea AJAX în WordPress”.
Pentru simplitate, să o facem într-o formă statică, dar nu există nicio problemă să puneți acțiunea într-un handler AJAX, în loc de în funcția wp_mail()
.
Să creăm formularul.
Forma
add_filter( 'the_content', 'report_a_bug_form' ); function report_a_bug_form( $content ) { // Display the form only on posts. if ( ! is_single() ) { return $content; } // Add the form to the bottom of the content. $content .= '<form action="' . admin_url( 'admin-post.php' ) . '" method="POST"> <input type="hidden" name="post_id" value="' . get_ID() . '"> <input type="hidden" name="action" value="report_a_bug"> <textarea name="message" placeholder="' . __( 'Describe what\'s wrong...', 'reportabug' ) . '"></textarea> <button>' . __( 'Report a bug', 'reportabug' ) . '</button> </div>'; return $content; }
Vă rugăm să rețineți că lipsesc multe componente, cum ar fi nonces WordPress, gestionarea erorilor și afișarea rezultatului acțiunii, dar acestea nu fac obiectul acestui articol. Pentru a înțelege mai bine cum să gestionați aceste acțiuni, vă rugăm să citiți articolul menționat mai sus.
Pregătirea Acțiunii
Pentru a declanșa notificarea, vom avea nevoie doar de o singură acțiune. Aceasta nu trebuie să fie o acțiune personalizată precum cea de mai jos. Puteți utiliza oricare dintre acțiunile deja înregistrate în WordPress core sau alt plugin.
Manipulatorul de formulare și acțiunea
add_action( 'admin_post_report_a_bug', 'report_a_bug_handler' ); add_action( 'admin_post_nopriv_report_a_bug', 'report_a_bug_handler' ); function report_a_bug_handler() { do_action( 'report_a_bug', $_POST['post_id'], $_POST['message'] ); // Redirect back to the article. wp_safe_redirect( get_permalink( $_POST['post_id'] ) ); exit; }
Puteți citi mai multe despre cum să utilizați fișierul admin-post.php
în Codexul WordPress.
Acesta este tot ce avem nevoie pentru a crea o notificare personalizată, configurabilă. Să creăm declanșatorul.
Înregistrarea declanșatorului personalizat
Declanșatorul este doar o clasă simplă care extinde declanșatorul abstract. Clasa abstractă face toată treaba pentru tine. Acesta pune declanșatorul în listă și se ocupă de notificări și de etichete de îmbinare.
Să începem cu declarația declanșatorului.
Definiție minimă de declanșare
class ReportBug extends \BracketSpace\Notification\Abstracts\Trigger { public function __construct() { // Add slug and the title. parent::__construct( 'reportabug', __( 'Bug report sent', 'reportabug' ) ); // Hook to the action. $this->add_action( 'report_a_bug', 10, 2 ); } public function merge_tags() {} }
Tot ce trebuie să faceți este să apelați constructorul părinte și să transmiteți slug-ul de declanșare și numele frumos.
Apoi, ne putem conecta la acțiunea noastră personalizată. Metoda add_action
este foarte asemănătoare cu funcția add_action()
; deci, al doilea parametru este prioritatea, iar ultimul este numărul de argumente. Lipsește doar parametrul callback, deoarece clasa abstractă face asta pentru noi.
Având clasa, o putem înregistra ca noul nostru declanșator.
register_trigger( new ReportBug() );
Acesta este acum un declanșator complet funcțional. O puteți selecta din listă atunci când compuneți o nouă notificare.

Deși declanșatorul funcționează și deja putem trimite notificarea pe care o dorim, nu este foarte util. Nu avem nicio modalitate de a arăta destinatarului care postare are o eroare și care este mesajul.
Acesta ar fi momentul, deci, să înregistrăm niște etichete de îmbinare și să setăm contextul de declanșare cu parametrii de acțiune pe care îi avem: ID-ul postării și mesajul.
Pentru a face acest lucru, putem adăuga o altă metodă la clasa de declanșare. Acesta este apelul invers al acțiunii, unde putem captura argumentele acțiunii.

Gestionarea argumentelor de acțiune
public function action( $post_ID, $message ) { // If the message is empty, don't send any notifications. if ( empty( $message ) ) { return false; } // Set the trigger properties. $this->post = get_post( $post_ID ); $this->message = $message; }
Notați return false;
afirmație. Dacă returnați false
din această metodă, declanșatorul va fi oprit și nu va fi trimisă nicio notificare. În cazul nostru, nu dorim ca o notificare să fie trimisă cu un mesaj gol. În lumea reală, ați dori să validați acest lucru înainte ca formularul să fie trimis.
Apoi, doar setăm proprietățile clasei de declanșare, obiectul post complet și mesajul. Acum, le putem folosi pentru a adăuga câteva etichete de îmbinare la declanșatorul nostru. Putem completa doar conținutul metodei merge_tags
pe care am declarat-o mai devreme.
Definirea etichetelor de îmbinare
public function merge_tags() { $this->add_merge_tag( new \BracketSpace\Notification\Defaults\MergeTag\UrlTag( array( 'slug' => 'post_url', 'name' => __( 'Post URL', 'reportabug' ), 'resolver' => function( $trigger ) { return get_permalink( $trigger->post->ID ); }, ) ) ); $this->add_merge_tag( new \BracketSpace\Notification\Defaults\MergeTag\StringTag( array( 'slug' => 'post_title', 'name' => __( 'Post title', 'reportabug' ), 'resolver' => function( $trigger ) { return $trigger->post->post_title; }, ) ) ); $this->add_merge_tag( new \BracketSpace\Notification\Defaults\MergeTag\HtmlTag( array( 'slug' => 'message', 'name' => __( 'Message', 'reportabug' ), 'resolver' => function( $trigger ) { return nl2br( $trigger->message ); }, ) ) ); $this->add_merge_tag( new \BracketSpace\Notification\Defaults\MergeTag\EmailTag( array( 'slug' => 'post_author_email', 'name' => __( 'Post author email', 'reportabug' ), 'resolver' => function( $trigger ) { $author = get_userdata( $trigger->post->post_author ); return $author->user_email; }, ) ) ); }
Aceasta va adăuga patru etichete de îmbinare, toate gata de utilizare în timp ce se compune o notificare.
Eticheta merge este o instanță a unei clase speciale. Puteți vedea că există multe tipuri de aceste etichete și le folosim în funcție de valoarea returnată de la soluție. Puteți vedea toate etichetele de îmbinare în depozitul GitHub.
Toate etichetele de îmbinare sunt adăugate prin metoda add_merge_tag
și necesită matricea de configurare cu trei chei:
- melc
Valoarea statică care va fi utilizată în notificare (adică{post_url}
). - Nume
Eticheta tradusă pentru eticheta de îmbinare. - rezolutor
Funcția care înlocuiește eticheta de îmbinare cu valoarea reală.
Resolverul nu trebuie să fie închiderea, ca în cazul nostru, dar folosirea lui este convenabilă. Puteți transmite un nume de funcție ca șir sau matrice dacă aceasta este o metodă dintr-o altă clasă.
În funcția de rezoluție, este disponibil un singur argument: instanța clasei de declanșare. Astfel, putem accesa proprietățile pe care tocmai le-am setat în metoda de action
și returnăm valoarea de care avem nevoie.
Și asta e tot! Etichetele de îmbinare nu sunt disponibile pentru a fi utilizate cu declanșatorul nostru și putem configura câte notificări despre raportul de eroare dorim.

Crearea tipului de notificare personalizat
Pluginul Notificare oferă nu numai declanșatoare personalizate, ci și tipuri de notificări personalizate. Pluginul este livrat cu două tipuri, e-mail și webhook, dar are un API simplu pentru a vă înregistra propriile notificări.
Funcționează foarte asemănător cu declanșatorul personalizat: aveți nevoie, de asemenea, de o clasă și de un apel la o funcție simplă pentru a o înregistra.
Vă arăt doar un exemplu; implementarea va varia în funcție de sistemul pe care doriți să îl integrați. Poate fi necesar să includeți o bibliotecă terță parte și să apelați API-ul acesteia sau să operați în sistemul de fișiere WordPress, dar ghidul de mai jos vă va configura procesul de bază.
Să începem cu o declarație de clasă:
class CustomNotification extends \BracketSpace\Notification\Abstracts\Notification { public function __construct() { // Add slug and the title. parent::__construct( 'custom_notification', __( 'Custom Notification', 'textdomain' ) ); } public function form_fields() {} public function send( \BracketSpace\Notification\Interfaces\Triggerable $trigger ) {} }
În constructor, trebuie să apelați constructorul clasei părintelui și să transmiteți slug-ul și numele frumos al notificării.
Metoda form_fields
este folosită pentru a crea un formular de configurare pentru notificări. (De exemplu, notificarea prin e-mail ar avea un subiect, un corp etc.)
Metoda de send
este apelată de declanșator și este locul unde puteți apela API-ul terță parte cu care doriți să vă integrați.
Apoi, trebuie să-l înregistrați cu funcția register_notification
.
register_trigger( new CustomNotification() );
Formularul de notificare
Este posibil să existe un caz în care aveți o notificare fără câmpuri de configurare. Este în regulă, dar cel mai probabil veți dori să oferiți administratorului WordPress o modalitate de a configura conținutul notificărilor cu etichetele de îmbinare.
De aceea vom înregistra două câmpuri, titlul și mesajul, în metoda form_fields
. Arata cam asa:
public function form_fields() { $this->add_form_field( new \BracketSpace\Notification\Defaults\Field\InputField( array( 'label' => __( 'Title', 'textdomain' ), 'name' => 'title', 'resolvable' => true, 'description' => __( 'You can use merge tags', 'textdomain' ), ) ) ); $this->add_form_field( new \BracketSpace\Notification\Defaults\Field\TextareaField( array( 'label' => __( 'Message', 'textdomain' ), 'name' => 'message', 'resolvable' => true, 'description' => __( 'You can use merge tags', 'textdomain' ), ) ) ); }
După cum puteți vedea, fiecare câmp este un obiect și este înregistrat cu metoda add_form_field
. Pentru lista tuturor tipurilor de câmpuri disponibile, vă rugăm să vizitați depozitul GitHub.
Fiecare câmp are eticheta traducabilă, numele unic și un set de alte proprietăți. Puteți defini dacă câmpul trebuie rezolvat cu etichetele de îmbinare cu cheia resolvable
. Aceasta înseamnă că, atunci când cineva folosește eticheta de îmbinare {post_title}
în acest câmp, aceasta va fi schimbată cu titlul real al postării. De asemenea, puteți furniza câmpul de description
pentru o experiență mai bună a utilizatorului.
În acest moment, tipul de notificare personalizat poate fi utilizat în interfața pluginului cu orice tip de declanșare disponibil.

Trimiterea notificării personalizate
Pentru ca acesta să funcționeze cu adevărat, trebuie să folosim metoda send
în declarația noastră de clasă de notificare. Acesta este locul în care puteți scrie un apel API sau puteți utiliza sistemul de fișiere WordPress sau orice API WordPress și puteți face orice doriți cu datele de notificare.
Iată cum îl puteți accesa:
public function send( \BracketSpace\Notification\Interfaces\Triggerable $trigger ) { $title = $this->data['title']; $message = $this->data['message']; // @todo Write the integration here. }
În acest moment, toate câmpurile sunt rezolvate cu etichetele de îmbinare, ceea ce înseamnă că variabilele sunt gata pentru a fi expediate.
Acest lucru vă oferă posibilități infinite de a integra WordPress cu orice serviciu, fie că este vorba de furnizorul local de SMS-uri, o altă instalare WordPress sau orice API extern cu care doriți să comunicați.
Etichetarea albă și gruparea pluginului
Nu este ideal să creați o dependență a unui plugin care poate fi dezactivat și dezinstalat cu ușurință. Dacă construiți un sistem care necesită într-adevăr ca pluginul de notificare să fie întotdeauna disponibil, puteți include pluginul în propriul cod.
Dacă ați mai folosit pluginul Advanced Custom Fields, atunci probabil că sunteți familiarizat cu procedura de grupare. Doar copiați fișierele pluginului în pluginul sau tema dvs. și invocați pluginul manual.
Pluginul de notificare funcționează foarte similar, dar invocarea pluginului este mult mai simplă decât în cazul Câmpurilor personalizate avansate.
Doar copiați fișierele pluginului și aveți nevoie de un fișier pentru ca acesta să funcționeze.
require_once( 'path/to/plugin/notification/load.php' );
Pluginul își va afla locația și adresele URL.
Dar gruparea pluginului ar putea să nu fie suficientă. Poate că trebuie să ascundeți complet faptul că utilizați această soluție terță parte. Acesta este motivul pentru care pluginul Notification vine cu un mod etichetă albă, pe care îl puteți activa în orice moment.
De asemenea, este activat ca un singur apel la o funcție:
notification_whitelabel( array( // Admin page hook under which the Notifications will be displayed. 'page_hook' => 'edit.php?post_type=page', // If display extensions page. 'extensions' => false, // If display settings page. 'settings' => false, // Limit settings access to user IDs. // This works only if settings are enabled. 'settings_access' => array( 123, 456 ), ) );
În mod implicit, apelarea acestei funcții va ascunde toate declanșatoarele implicite.
Folosind ambele tehnici, etichetarea albă și gruparea, va ascunde complet orice referință la originea pluginului, iar soluția se va comporta ca o parte complet integrată a sistemului dumneavoastră.
Concluzie
Pluginul de notificare este o soluție all-in-one pentru orice sistem personalizat de notificare WordPress. Este extrem de ușor de configurat și funcționează imediat. Toate declanșatoarele care sunt înregistrate vor funcționa cu orice tip de notificare și, dacă aveți cerințe avansate, puteți economisi timp folosind o extensie existentă.
Dacă doriți să aflați mai multe detalii și tehnici avansate, accesați site-ul web de documentație.
Sunt mereu deschis la idei noi, așa că, dacă aveți, puteți să mă contactați aici în comentarii, prin problemele GitHub sau pe Twitter.
Descărcați pluginul din depozit și încercați-l!