WordPress 通知變得簡單
已發表: 2022-03-10 WordPress 不提供任何類型的通知系統。 您只能使用wp_mail()
函數,但所有設置都必須進行硬編碼,否則您必須創建一個單獨的設置屏幕以允許用戶調整選項。 編寫一個可靠、可配置且易於使用的系統需要花費很多時間。 但現在不是了。 我將向您展示如何使用免費的通知插件在幾分鐘內創建自己的通知系統。 通知,我的意思是任何類型的通知。 大多數情況下,它將是電子郵件,但使用我們將使用的插件,您還可以發送 webhook 和其他類型的通知。
在為我的一個客戶創建項目時,我遇到了我所描述的這個問題。 要求是具有可配置內容的多個自定義電子郵件警報。 我決定構建一個系統,而不是對每個警報進行硬編碼。 我希望它非常靈活,目的是能夠盡快編寫新場景。
我編寫的代碼是偉大開發之旅的開始。 事實證明,我創建的系統足夠靈活,可以作為一個單獨的包工作。 這就是通知插件的誕生方式。
假設您要發送一封電子郵件,說明您網站的一位成員正在更新用戶配置文件。 WordPress 不提供該功能,但使用通知插件,您可以在幾分鐘內創建這樣的電子郵件。 或者假設您希望通過在每次發布新產品時將 webhook 發送到單獨的 URL 來將您的 WooCommerce 產品與第三方軟件同步。 使用插件也很容易做到這一點。
開發 WordPress 插件時的經驗教訓
良好的插件開發和支持會帶來更多下載。 更多的下載意味著更多的錢和更好的聲譽。 了解如何利用七項黃金法則開發優質產品。 閱讀相關文章 →
在本文中,您將學習如何將插件集成到您自己的應用程序中,以及如何比以往更快速、更輕鬆地創建高級 WordPress 通知系統。
在本文中,我們將介紹:
- 如何安裝插件,
- 插件背後的想法及其架構,
- 為通知創建自定義場景,
- 創建動作(過程的第 1 步),
- 創建觸發器(過程的第 2 步),
- 創建自定義通知類型,
- 如何啟用白標模式並將插件捆綁到您的包中。
安裝插件
要創建自己的場景,您將需要 Notification 插件。 只需從 WordPress 儀表板中的 WordPress.org 存儲庫安裝它,或從 GitHub 存儲庫下載它。

在本文後面,您將學習如何向您的客戶隱藏此插件,並使其作為插件或主題的集成部分工作。
插件的想法
在進入你的代碼編輯器之前,你需要知道插件的架構是什麼樣的。 該插件包含許多不同的組件,但其核心實際上是一些抽像類。
主要成分是:
- 通知
這可以是電子郵件、網絡掛鉤、推送通知或 SMS。 - 觸發
這就是發送通知的內容。 這實際上是 WordPress 操作。 - 合併標籤
這是動態內容的一小部分,例如{post_title}
。
為了讓您更好地了解它們是如何一起發揮作用的,您可以觀看這個簡短的視頻:
Notification 插件的核心實際上只是一個 API。 所有默認觸發器,例如發布的帖子和註冊的用戶,都是建立在該 API 之上的。
因為該插件是為開發人員創建的,所以添加您自己的觸發器非常容易。 所需要的只是一個 WordPress 操作,它只是一行代碼和一個類聲明。
自定義場景
讓我們設計一個簡單的場景。 我們將在每篇文章的底部添加一個文本區域和按鈕,以便報告文章中的錯誤。 然後,我們將在提交表單時觸發通知。

這種情況在另一篇文章“在不重新加載頁面的情況下提交表單:WordPress 中的 AJAX 實現”中進行了介紹。
為簡單起見,我們將其設為靜態表單,但將操作放在 AJAX 處理程序中而不是wp_mail()
函數中沒有問題。
讓我們創建表單。
表格
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; }
請注意,缺少許多組件,例如 WordPress 隨機數、錯誤處理和操作結果的顯示,但這些不是本文的主題。 為了更好地了解如何處理這些操作,請閱讀上面提到的文章。
準備行動
要觸發通知,我們只需要一個操作。 這不必是像下面這樣的自定義操作。 您可以使用已在 WordPress 核心或其他插件中註冊的任何操作。
表單處理程序和操作
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; }
您可以閱讀有關如何在 WordPress Codex 中使用admin-post.php
文件的更多信息。
這就是我們創建自定義、可配置通知所需的全部內容。 讓我們創建觸發器。
註冊自定義觸發器
觸發器只是一個擴展抽象觸發器的簡單類。 抽像類為您完成所有工作。 它將觸發器放在列表中,並處理通知和合併標籤。
讓我們從觸發器聲明開始。
最小觸發器定義
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() {} }
您需要做的就是調用父構造函數並傳遞觸發器 slug 和好聽的名稱。
然後,我們可以掛鉤到我們的自定義操作。 add_action
方法與add_action()
函數非常相似; 所以,第二個參數是優先級,最後一個是參數個數。 僅缺少回調參數,因為抽像類為我們做了這件事。
有了這個類,我們可以將它註冊為我們的新觸發器。
register_trigger( new ReportBug() );
現在這是一個完全有效的觸發器。 您可以在撰寫新通知時從列表中選擇它。

雖然觸發器正在工作並且我們已經可以發送我們想要的通知,但它並不是很有用。 我們無法向收件人顯示哪個帖子有錯誤以及消息是什麼。
然後,是時候註冊一些合併標籤並使用我們擁有的操作參數設置觸發上下文:帖子 ID 和消息。
為此,我們可以向觸發器類添加另一個方法。 這是動作回調,我們可以在其中捕獲動作參數。
處理動作參數
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;
陳述。 如果您從此方法返回false
,則觸發器將停止,並且不會發送任何通知。 在我們的例子中,我們不希望提交帶有空消息的通知。 在現實世界中,您希望在發送表單之前驗證這一點。

然後,我們只需設置觸發器類的屬性、完整的帖子對象和消息。 現在,我們可以使用它們向觸發器添加一些合併標籤。 我們可以只填充我們之前聲明的merge_tags
方法的內容。
定義合併標籤
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; }, ) ) ); }
這將添加四個合併標籤,在編寫通知時都可以使用。
合併標籤是一個特殊類的實例。 您可以看到這些標籤有很多種類型,我們根據解析器返回的值使用它們。 您可以在 GitHub 存儲庫中查看所有合併標籤。
所有合併標籤都是通過add_merge_tag
方法添加的,它們需要具有三個鍵的配置數組:
- 蛞蝓
將在通知中使用的靜態值(即{post_url}
)。 - 姓名
合併標籤的翻譯標籤。 - 解析器
用實際值替換合併標籤的函數。
解析器不必像我們的例子那樣是閉包,但使用它很方便。 如果這是另一個類中的方法,您可以將函數名稱作為字符串或數組傳遞。
在解析器函數中,只有一個參數可用:觸發器類實例。 因此,我們可以訪問我們剛剛在action
方法中設置的屬性並返回我們需要的值。
就這樣! 合併標籤不能與我們的觸發器一起使用,我們可以根據需要設置盡可能多的錯誤報告通知。

創建自定義通知類型
Notification 插件不僅提供自定義觸發器,還提供自定義通知類型。 該插件附帶兩種類型,電子郵件和 webhook,但它有一個簡單的 API 來註冊您自己的通知。
它的工作方式與自定義觸發器非常相似:您還需要一個類和一個對一個簡單函數的調用來註冊它。
我只展示一個例子; 實施將根據您希望集成的系統而有所不同。 您可能需要包含第三方庫並調用其 API 或在 WordPress 的文件系統中操作,但下面的指南將為您設置基本流程。
讓我們從一個類聲明開始:
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 ) {} }
在構造函數中,您必須調用父類的構造函數並傳遞通知的 slug 和 nice 名稱。
form_fields
方法用於創建通知的配置表單。 (例如,電子郵件通知將包含主題、正文等)
send
方法由觸發器調用,您可以在其中調用您希望集成的第三方 API。
接下來,您必須使用register_notification
函數註冊它。
register_trigger( new CustomNotification() );
通知表
在某些情況下,您可能會收到沒有配置字段的通知。 這很好,但您很可能希望為 WordPress 管理員提供一種使用合併標籤配置通知內容的方法。
這就是為什麼我們將在form_fields
方法中註冊兩個字段,標題和消息。 它看起來像這樣:
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' ), ) ) ); }
如您所見,每個字段都是一個對象,並使用add_form_field
方法註冊。 有關所有可用字段類型的列表,請訪問 GitHub 存儲庫。
每個字段都有可翻譯的標籤、唯一的名稱和一組其他屬性。 您可以定義是否應使用具有resolvable
鍵的合併標籤來解析該字段。 這意味著當有人在此字段中使用{post_title}
合併標籤時,它將被更改為帖子的實際標題。 您還可以提供description
字段以獲得更好的用戶體驗。
此時,您的自定義通知類型可以在插件界面中與任何可用的觸發器類型一起使用。

發送自定義通知
為了讓它真正起作用,我們必須在通知類聲明中使用send
方法。 在這裡,您可以編寫 API 調用或使用 WordPress 的文件系統或任何 WordPress API,並對通知數據做任何您喜歡的事情。
這是您可以訪問它的方式:
public function send( \BracketSpace\Notification\Interfaces\Triggerable $trigger ) { $title = $this->data['title']; $message = $this->data['message']; // @todo Write the integration here. }
此時,所有字段都使用合併標籤解析,這意味著變量已準備好發送。
這為您提供了將 WordPress 與任何服務集成的無限可能性,無論是您本地的 SMS 提供商、另一個 WordPress 安裝還是您希望與之通信的任何外部 API。
白標和捆綁插件
創建可以輕鬆停用和卸載的插件的依賴項並不理想。 如果您正在構建一個確實需要通知插件始終可用的系統,您可以將插件捆綁在您自己的代碼中。
如果您以前使用過 Advanced Custom Fields 插件,那麼您可能熟悉捆綁過程。 只需將插件的文件複製到您的插件或主題中,然後手動調用插件。
通知插件的工作方式非常相似,但調用插件比使用高級自定義字段要簡單得多。
只需複制插件的文件,並需要一個文件才能使其工作。
require_once( 'path/to/plugin/notification/load.php' );
該插件將確定其位置和 URL。
但是捆綁插件可能還不夠。 也許您需要完全隱藏您正在使用此第三方解決方案。 這就是通知插件帶有白標模式的原因,您可以隨時激活該模式。
它也可以作為對函數的單個調用啟用:
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 ), ) );
默認情況下,調用此函數將隱藏所有默認觸發器。
使用白標和捆綁這兩種技術將完全隱藏對插件來源的任何引用,並且該解決方案將作為您系統的完全集成部分。
結論
通知插件是任何自定義 WordPress 通知系統的一體化解決方案。 它非常容易配置,而且開箱即用。 註冊的所有觸發器都適用於任何通知類型,如果您有任何高級要求,您可以通過使用現有擴展來節省一些時間。
如果您想了解更多詳細信息和高級技術,請訪問文檔網站。
我總是對新想法持開放態度,所以如果你有任何想法,可以通過 GitHub 問題或 Twitter 在評論中與我聯繫。
從存儲庫下載插件,並試一試!