WordPress Bildirimleri Kolaylaştı
Yayınlanan: 2022-03-10 WordPress herhangi bir bildirim sistemi sunmaz. Kullanabileceğiniz tek şey wp_mail()
işlevidir, ancak tüm ayarların sabit kodlanmış olması gerekir, yoksa kullanıcının seçenekleri ince ayar yapabilmesi için ayrı bir ayarlar ekranı oluşturmanız gerekir. Güvenilir, yapılandırılabilir ve kullanımı kolay bir sistem yazmak saatler sürer. Ama artık değil. Ücretsiz Bildirim eklentisi ile dakikalar içinde kendi bildirim sisteminizi nasıl oluşturacağınızı göstereceğim. Bildirim derken, her türlü bildirimi kastediyorum . Çoğu zaman e-posta olur, ancak kullanacağımız eklenti ile web kancaları ve diğer türde bildirimler de gönderebilirsiniz.
Müşterilerimden biri için proje oluştururken bahsettiğim bu sorunla karşılaştım. Gereklilik, yapılandırılabilir içeriğe sahip birden çok özel e-posta uyarısına sahip olmaktı. Her uyarıyı kodlamak yerine bir sistem kurmaya karar verdim. Çok esnek olmasını istedim ve amacım yeni senaryoları olabildiğince çabuk kodlayabilmekti.
Yazdığım kod, harika bir geliştirme yolculuğunun başlangıcıydı. Oluşturduğum sistemin ayrı bir paket halinde çalışabilecek kadar esnek olduğu ortaya çıktı. Bildirim eklentisi böyle doğdu.
Web sitenizin üyelerinden biri tarafından güncellenen bir kullanıcı profili hakkında bir e-posta göndermek istediğinizi varsayalım. WordPress bu işlevi sağlamaz, ancak Bildirim eklentisi ile dakikalar içinde böyle bir e-posta oluşturabilirsiniz. Veya her yeni ürün yayınlandığında ayrı bir URL'ye bir web kancası göndererek WooCommerce ürünlerinizi üçüncü taraf yazılımlarla senkronize etmek istediğinizi varsayalım. Eklenti ile bunu yapmak da çok kolay.
WordPress Eklentileri Geliştirirken Alınan Dersler
İyi eklenti geliştirme ve destek, daha fazla indirmeye yol açar. Daha fazla indirme, daha fazla para ve daha iyi bir itibar anlamına gelir. Yedi altın kuralla kaliteli ürünleri nasıl geliştirebileceğinizi öğrenin. İlgili bir makaleyi okuyun →
Bu makalede, eklentiyi kendi uygulamanıza nasıl entegre edeceğinizi ve her zamankinden daha hızlı ve kolay bir şekilde gelişmiş bir WordPress bildirim sistemini nasıl oluşturacağınızı öğreneceksiniz.
Bu yazıda şunları ele alacağız:
- eklenti nasıl kurulur,
- eklentinin arkasındaki fikir ve mimarisi,
- bildirimler için özel bir senaryo oluşturma,
- eylemi oluşturma (sürecin 1. adımı),
- tetikleyici oluşturma (işlemin 2. adımı),
- özel bildirim türü oluşturma,
- beyaz etiket modunun nasıl etkinleştirileceği ve eklentinin paketinizde nasıl paketleneceği.
Eklentiyi Yükleme
Kendi senaryolarınızı oluşturmak için Bildirim eklentisine ihtiyacınız olacak. Sadece WordPress kontrol panelinizdeki WordPress.org deposundan yükleyin veya GitHub deposundan indirin.
Makalenin ilerleyen bölümlerinde, bu eklentiyi müşterilerinizden nasıl gizleyeceğinizi ve eklentinizin veya temanızın entegre bir parçası olarak çalışmasını nasıl sağlayacağınızı öğreneceksiniz.
Eklenti Fikri
Kod düzenleyicinize girmeden önce eklentinin mimarisinin nasıl göründüğünü bilmeniz gerekir. Eklenti birçok çeşitli bileşen içerir, ancak özü gerçekten birkaç soyut sınıftır.
Ana bileşenler şunlardır:
- bildirim
Bu bir e-posta, web kancası, anında iletme bildirimi veya SMS olabilir. - Tetik
Bu, bildirimi gönderen şeydir. Etkili bir şekilde WordPress eylemidir. - birleştirme etiketi
Bu,{post_title}
gibi dinamik içeriğin küçük bir bölümüdür.
Her şeyin bir arada nasıl oynandığına dair size daha iyi bir fikir vermek için bu kısa videoyu izleyebilirsiniz:
Bildirim eklentisinin özü gerçekten sadece bir API'dir. Yayınlanan Gönderi ve Kullanıcı kaydı gibi tüm varsayılan tetikleyiciler, bu API'nin üzerine inşa edilen şeylerdir.
Eklenti geliştiriciler için oluşturulduğundan, kendi tetikleyicilerinizi eklemek çok kolaydır. Tek gereken, yalnızca tek bir kod satırı ve bir sınıf bildirimi olan bir WordPress eylemidir.
Özel Senaryo
Basit bir senaryo tasarlayalım. Her gönderinin altına bir metin alanı ve düğme ekleyerek makaledeki hataların bildirilmesini sağlayacağız. Ardından, formun gönderilmesi üzerine bildirimi tetikleyeceğiz.
Bu senaryo, "Sayfayı Yeniden Yüklemeden Form Gönderme: WordPress'te AJAX Uygulaması" adlı başka bir makalede ele alındı.
Basit olması için, bunu statik bir biçim yapalım, ancak eylemi wp_mail()
işlevi yerine bir AJAX işleyicisine koymakta sorun yok.
Formu oluşturalım.
Form
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; }
Lütfen WordPress nonces, hata işleme ve eylem sonucunun görüntülenmesi gibi birçok bileşenin eksik olduğunu unutmayın, ancak bunlar bu makalenin konusu değildir. Bu eylemlerin nasıl ele alınacağını daha iyi anlamak için lütfen yukarıda belirtilen makaleyi okuyun.
Eylemin Hazırlanması
Bildirimi tetiklemek için tek bir eyleme ihtiyacımız olacak. Bu, aşağıdaki gibi özel bir işlem olmak zorunda değildir. WordPress çekirdeğinde veya başka bir eklentide kayıtlı olan eylemlerden herhangi birini kullanabilirsiniz.
Form İşleyicisi ve Eylem
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; }
admin-post.php
dosyasının nasıl kullanılacağı hakkında daha fazla bilgiyi WordPress Kodeksinde okuyabilirsiniz.
Özel, yapılandırılabilir bir bildirim oluşturmak için ihtiyacımız olan tek şey bu. Tetikleyiciyi oluşturalım.
Özel Tetikleyiciyi Kaydetme
Tetik, soyut tetikleyiciyi genişleten basit bir sınıftır. Soyut sınıf sizin için tüm işleri yapar. Tetiği listeye koyar ve bildirimleri ve birleştirme etiketlerini yönetir.
Tetikleyici bildirimi ile başlayalım.
Minimal Tetik Tanımı
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() {} }
Tek yapmanız gereken, ana kurucuyu aramak ve tetikleyici bilgisini ve Nice adını iletmektir.
Ardından, özel eylemimize bağlanabiliriz. add_action
yöntemi, add_action()
işlevine çok benzer; bu nedenle, ikinci parametre önceliktir ve sonuncusu argüman sayısıdır. Soyut sınıf bunu bizim için yaptığından yalnızca geri arama parametresi eksik.
Sınıfa sahip olarak, onu yeni tetikleyicimiz olarak kaydedebiliriz.
register_trigger( new ReportBug() );
Bu artık tamamen çalışan bir tetikleyicidir. Yeni bir bildirim oluştururken listeden seçebilirsiniz.
Tetik çalışıyor ve zaten istediğimiz bildirimi gönderebiliyor olsak da pek kullanışlı değil. Alıcıya hangi gönderide hata olduğunu ve mesajın ne olduğunu göstermenin hiçbir yolu yok.
O halde bu, bazı birleştirme etiketlerini kaydetme ve elimizdeki eylem parametreleriyle tetikleyici bağlamı kurma zamanı olacaktır: posta kimliği ve mesaj.
Bunu yapmak için tetikleyici sınıfına başka bir yöntem ekleyebiliriz. Bu, eylem argümanlarını yakalayabileceğimiz eylem geri çağrısıdır.
Eylem Argümanlarını Kullanma
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; }
return false;
ifade. Bu yöntemden false
döndürürseniz, tetikleyici durdurulacak ve herhangi bir bildirim gönderilmeyecektir. Bizim durumumuzda, boş bir mesajla bir bildirim gönderilmesini istemiyoruz. Gerçek dünyada, form gönderilmeden önce bunu doğrulamak istersiniz.
Ardından, tetikleyici sınıfın özelliklerini, tam gönderi nesnesini ve mesajı ayarladık. Şimdi bunları tetikleyicimize bazı birleştirme etiketleri eklemek için kullanabiliriz. Sadece daha önce açıkladığımız merge_tags
yönteminin içeriğini doldurabiliriz.
Birleştirme Etiketlerini Tanımlama
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; }, ) ) ); }
Bu, bir bildirim oluşturulurken kullanıma hazır dört birleştirme etiketi ekleyecektir.
Birleştirme etiketi, özel bir sınıfın bir örneğidir. Bu etiketlerin birçok türü olduğunu ve çözümleyiciden dönen değere bağlı olarak bunları kullandığımızı görebilirsiniz. Tüm birleştirme etiketlerini GitHub deposunda görebilirsiniz.
Tüm birleştirme etiketleri, add_merge_tag
yöntemiyle eklenir ve üç anahtarlı yapılandırma dizisi gerektirir:
- sümüklü böcek
Bildirimde kullanılacak statik değer (ör.{post_url}
). - isim
Birleştirme etiketi için çevrilmiş etiket. - çözücü
Birleştirme etiketini gerçek değerle değiştiren işlev.
Çözücü, bizim durumumuzda olduğu gibi kapatma olmak zorunda değildir, ancak onu kullanmak uygundur. Bu başka bir sınıftaki bir yöntemse, bir işlev adını dize veya dizi olarak iletebilirsiniz.
Çözümleyici işlevinde yalnızca bir bağımsız değişken kullanılabilir: tetikleyici sınıf örneği. Böylece action
methodunda az önce belirlediğimiz özelliklere erişebilir ve ihtiyacımız olan değeri döndürebiliriz.
Ve hepsi bu! Birleştirme etiketleri tetikleyicimizle kullanılamaz ve hata raporuyla ilgili istediğimiz kadar bildirim ayarlayabiliriz.
Özel Bildirim Türünü Oluşturma
Bildirim eklentisi yalnızca özel tetikleyiciler değil, aynı zamanda özel bildirim türleri de sunar. Eklenti, e-posta ve web kancası olmak üzere iki türde gelir, ancak kendi bildirimlerinizi kaydetmek için basit bir API'ye sahiptir.
Özel tetikleyiciye çok benzer şekilde çalışır: Kaydetmek için ayrıca bir sınıfa ve basit bir işleve yapılan çağrıya ihtiyacınız vardır.
Ben sadece bir örnek gösteriyorum; Uygulama, entegre etmek istediğiniz sisteme göre değişiklik gösterecektir. Üçüncü taraf bir kitaplık eklemeniz ve API'sini çağırmanız veya WordPress'in dosya sisteminde çalışmanız gerekebilir, ancak aşağıdaki kılavuz size temel süreci ayarlayacaktır.
Bir sınıf bildirimi ile başlayalım:
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 ) {} }
Yapıcıda, ebeveynin sınıf yapıcısını çağırmalı ve bildirimin bilgi ve güzel adını iletmelisiniz.
form_fields
yöntemi, bildirimler için bir yapılandırma formu oluşturmak için kullanılır. (Örneğin, e-posta bildiriminin bir konusu, gövdesi vb. olacaktır.)
send
yöntemi tetikleyici tarafından çağrılır ve entegre etmek istediğiniz üçüncü taraf API'sini burada arayabilirsiniz.
Ardından, register_notification
işleviyle kaydetmeniz gerekir.
register_trigger( new CustomNotification() );
Bildirim Formu
Yapılandırma alanı olmayan bir bildiriminizin olduğu bir durum olabilir. Sorun değil, ancak büyük olasılıkla WordPress yöneticisine, bildirim içeriğini birleştirme etiketleriyle yapılandırması için bir yol vermek isteyeceksiniz.
Bu yüzden form_fields
yönteminde başlık ve mesaj olmak üzere iki alan kaydedeceğiz. Şuna benziyor:
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' ), ) ) ); }
Gördüğünüz gibi, her alan bir nesnedir ve add_form_field
yöntemi ile kaydedilir. Mevcut tüm alan türlerinin listesi için lütfen GitHub deposunu ziyaret edin.
Her alanın çevrilebilir etiketi, benzersiz adı ve bir dizi başka özelliği vardır. Alanın resolvable
anahtar ile birleştirme etiketleri ile çözülüp çözülmeyeceğini belirleyebilirsiniz. Bu, birisi bu alanda {post_title}
birleştirme etiketini kullandığında, gönderinin gerçek başlığıyla değiştirileceği anlamına gelir. Daha iyi bir kullanıcı deneyimi için description
alanını da sağlayabilirsiniz.
Bu noktada, özel bildirim türünüz, eklentinin arayüzünde mevcut herhangi bir tetikleyici türüyle kullanılabilir.
Özel Bildirimi Gönderme
Gerçekten çalışması için, bildirim sınıfı bildirimimizde send
yöntemini kullanmalıyız. Burası bir API çağrısı yazabileceğiniz veya WordPress'in dosya sistemini veya herhangi bir WordPress API'sini kullanabileceğiniz ve bildirim verileriyle istediğinizi yapabileceğiniz yerdir.
Bu şekilde erişebilirsiniz:
public function send( \BracketSpace\Notification\Interfaces\Triggerable $trigger ) { $title = $this->data['title']; $message = $this->data['message']; // @todo Write the integration here. }
Bu noktada tüm alanlar birleştirme etiketleri ile çözümlenir, bu da değişkenlerin gönderilmeye hazır olduğu anlamına gelir.
Bu, ister yerel SMS sağlayıcınız, isterse başka bir WordPress kurulumu veya iletişim kurmak istediğiniz herhangi bir harici API olsun, WordPress'i herhangi bir hizmetle entegre etmek için sonsuz olanaklar sunar.
Beyaz Etiketleme ve Eklentiyi Paketleme
Kolayca devre dışı bırakılabilen ve kaldırılabilen bir eklenti bağımlılığı oluşturmak ideal değildir. Bildirim eklentisinin her zaman kullanılabilir olmasını gerçekten gerektiren bir sistem oluşturuyorsanız, eklentiyi kendi kodunuzla paketleyebilirsiniz.
Gelişmiş Özel Alanlar eklentisini daha önce kullandıysanız, muhtemelen paketleme prosedürüne aşinasınızdır. Eklentinin dosyalarını eklentinize veya temanıza kopyalamanız ve eklentiyi manuel olarak çağırmanız yeterlidir.
Bildirim eklentisi çok benzer şekilde çalışır, ancak eklentiyi çağırmak Gelişmiş Özel Alanlara göre çok daha basittir.
Eklentinin dosyalarını kopyalamanız ve çalışması için bir dosya gerektirmeniz yeterlidir.
require_once( 'path/to/plugin/notification/load.php' );
Eklenti, konumunu ve URL'leri çözecektir.
Ancak eklentiyi paketlemek yeterli olmayabilir. Belki de bu üçüncü taraf çözümünü kullandığınızı tamamen gizlemeniz gerekiyor. Bu nedenle Bildirim eklentisi, istediğiniz zaman etkinleştirebileceğiniz beyaz etiket moduyla birlikte gelir.
Ayrıca, bir işleve tek bir çağrı olarak etkinleştirilir:
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 ), ) );
Varsayılan olarak, bu işlevin çağrılması tüm varsayılan tetikleyicileri gizleyecektir.
Beyaz etiketleme ve paketleme olmak üzere her iki tekniğin de kullanılması, eklentinin kaynağına yapılan tüm referansları tamamen gizleyecektir ve çözüm, sisteminizin tamamen entegre bir parçası gibi davranacaktır.
Çözüm
Bildirim eklentisi, herhangi bir özel WordPress bildirim sistemi için hepsi bir arada bir çözümdür. Yapılandırması son derece kolaydır ve kutudan çıktığı gibi çalışır. Kaydedilen tüm tetikleyiciler, herhangi bir bildirim türüyle çalışır ve herhangi bir gelişmiş gereksiniminiz varsa, mevcut bir uzantıyı kullanarak biraz zaman kazanabilirsiniz.
Daha fazla ayrıntı ve gelişmiş teknikler öğrenmek istiyorsanız, dokümantasyon web sitesine gidin.
Her zaman yeni fikirlere açığım, bu yüzden herhangi bir fikriniz varsa, bana buradan, GitHub sorunları veya Twitter üzerinden ulaşabilirsiniz.
Eklentiyi depodan indirin ve deneyin!