WordPressの通知が簡単に
公開: 2022-03-10 WordPressはいかなる種類の通知システムも提供していません。 使用できるのはwp_mail()
関数だけですが、すべての設定をハードコーディングする必要があります。そうでない場合は、ユーザーがオプションを微調整できるように、別の設定画面を作成する必要があります。 信頼性が高く、構成可能で、使いやすいシステムを作成するには、何時間もかかります。 もうそうじゃない。 無料の通知プラグインを使用して、数分以内に独自の通知システムを作成する方法を紹介します。 通知とは、あらゆる種類の通知を意味します。 ほとんどの場合、メールになりますが、使用するプラグインを使用すると、Webhookやその他の種類の通知を送信することもできます。
クライアントの1つのプロジェクトを作成しているときに、説明したこの問題が発生しました。 要件は、構成可能なコンテンツを含む複数のカスタム電子メールアラートを持つことでした。 すべてのアラートをハードコーディングする代わりに、システムを構築することにしました。 私はそれが非常に柔軟であることを望みました、そしてその目的は新しいシナリオをできるだけ早くコーディングできるようにすることでした。
私が書いたコードは、素晴らしい開発の旅の始まりでした。 私が作成したシステムは、個別のパッケージとして機能するのに十分な柔軟性があることがわかりました。 これが通知プラグインの誕生です。
Webサイトのメンバーの1人によって更新されているユーザープロファイルに関する電子メールを送信するとします。 WordPressはその機能を提供していませんが、Notificationプラグインを使用すると、そのような電子メールを数分で作成できます。 または、新しい製品が公開されるたびにWebhookを別のURLに送信して、WooCommerce製品をサードパーティソフトウェアと同期させたいとします。 プラグインでも簡単に行えます。
WordPressプラグインの開発中に学んだ教訓
優れたプラグインの開発とサポートにより、ダウンロード数が増加します。 より多くのダウンロードはより多くのお金とより良い評判を意味します。 7つの黄金のルールで高品質の製品を開発する方法を学びましょう。 関連記事を読む→
この記事では、プラグインを独自のアプリケーションに統合する方法と、高度なWordPress通知システムをこれまでになく迅速かつ簡単に作成する方法を学習します。
この記事では、以下について説明します。
- プラグインのインストール方法、
- プラグインとそのアーキテクチャの背後にある考え方、
- 通知のカスタムシナリオを作成し、
- アクションの作成(プロセスのステップ1)、
- トリガーの作成(プロセスのステップ2)、
- カスタム通知タイプを作成し、
- ホワイトラベルモードを有効にして、プラグインをパッケージにバンドルする方法。
プラグインのインストール
独自のシナリオを作成するには、通知プラグインが必要です。 WordPressダッシュボードのWordPress.orgリポジトリからインストールするか、GitHubリポジトリからダウンロードするだけです。
この記事の後半では、このプラグインをクライアントから非表示にして、プラグインまたはテーマの統合された部分として機能させる方法を学習します。
プラグインのアイデア
コードエディタに入る前に、プラグインのアーキテクチャがどのように見えるかを知る必要があります。 プラグインにはさまざまなコンポーネントが含まれていますが、そのコアは実際にはいくつかの抽象クラスです。
主なコンポーネントは次のとおりです。
- 通知
これは、電子メール、Webhook、プッシュ通知、またはSMSである可能性があります。 - 引き金
これが通知を送信するものです。 それは事実上WordPressのアクションです。 - マージタグ
これは、{post_title}
のような動的コンテンツのごく一部です。
すべてがどのように一緒に再生されるかをよりよく理解するために、次の短いビデオを見ることができます。
通知プラグインのコアは、実際には単なるAPIです。 PostpublishedやUserregisteredなどのデフォルトのトリガーはすべて、そのAPIの上に構築されたものです。
プラグインは開発者向けに作成されているため、独自のトリガーを追加するのは非常に簡単です。 必要なのはWordPressアクションだけです。これは、1行のコードとクラス宣言だけです。
カスタムシナリオ
簡単なシナリオを考えてみましょう。 各投稿の下部にテキスト領域とボタンを追加して、記事のバグを報告できるようにします。 次に、フォームの送信時に通知をトリガーします。
このシナリオは、別の記事「ページをリロードせずにフォームを送信する:WordPressでのAJAX実装」で取り上げられました。
簡単にするために、静的な形式にしましょう。ただし、アクションをwp_mail()
関数ではなくAJAXハンドラーに配置しても問題はありません。
フォームを作成しましょう。
フォーム
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ナンス、エラー処理、アクションの結果の表示など、多くのコンポーネントが欠落していることに注意してください。ただし、これらはこの記事の主題ではありません。 これらのアクションの処理方法をよりよく理解するには、上記の記事をお読みください。
アクションの準備
通知をトリガーするには、1つのアクションのみが必要です。 これは、以下のようなカスタムアクションである必要はありません。 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; }
WordPressCodexで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() {} }
親コンストラクターを呼び出して、トリガースラッグとナイスネームを渡すだけです。
次に、カスタムアクションにフックできます。 add_action
メソッドは、 add_action()
関数と非常によく似ています。 したがって、2番目のパラメーターは優先順位であり、最後のパラメーターは引数の数です。 抽象クラスが私たちのためにそれを行うので、コールバックパラメータだけが欠落しています。
クラスがあるので、それを新しいトリガーとして登録できます。
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; }, ) ) ); }
これにより、4つのマージタグが追加され、通知の作成中にすべて使用できるようになります。
マージタグは、特別なクラスのインスタンスです。 これらのタグには多くの種類があり、リゾルバーから返される値に応じて使用していることがわかります。 GitHubリポジトリですべてのマージタグを確認できます。
すべてのマージタグはadd_merge_tag
メソッドを介して追加され、3つのキーを持つconfig配列が必要です。
- ナメクジ
通知で使用される静的な値(つまり、{post_url}
)。 - 名前
マージタグの翻訳されたラベル。 - リゾルバ
マージタグを実際の値に置き換える関数。
私たちの場合のように、リゾルバーはクロージャーである必要はありませんが、それを使用すると便利です。 これが別のクラスのメソッドである場合は、関数名を文字列または配列として渡すことができます。
リゾルバー関数では、トリガークラスインスタンスという1つの引数のみを使用できます。 したがって、 action
メソッドで設定したプロパティにアクセスして、必要な値を返すことができます。
そしてそれがすべてです! マージタグはトリガーで使用できません。バグレポートの通知を必要な数だけ設定できます。
カスタム通知タイプの作成
通知プラグインは、カスタムトリガーだけでなく、カスタム通知タイプも提供します。 プラグインには、電子メールとWebhookの2つのタイプが付属していますが、独自の通知を登録するためのシンプルなAPIがあります。
カスタムトリガーと非常によく似ています。登録するには、クラスと1つの単純な関数の呼び出しも必要です。
例のみを示しています。 実装は、統合するシステムによって異なります。 サードパーティのライブラリを含めてその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 ) {} }
コンストラクターでは、親のクラスコンストラクターを呼び出して、通知のスラッグとナイスネームを渡す必要があります。
form_fields
メソッドは、通知の構成フォームを作成するために使用されます。 (たとえば、電子メール通知には件名、本文などが含まれます)
send
メソッドはトリガーによって呼び出され、統合するサードパーティのAPIを呼び出すことができます。
次に、 register_notification
関数で登録する必要があります。
register_trigger( new CustomNotification() );
通知フォーム
構成フィールドのない通知がある場合があります。 それは問題ありませんが、WordPress管理者にマージタグを使用して通知コンテンツを構成する方法を提供することをお勧めします。
そのため、 form_fields
メソッドにタイトルとメッセージの2つのフィールドを登録します。 次のようになります。
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のいずれであっても、任意のサービスと統合する無限の可能性が得られます。
プラグインのホワイトラベリングとバンドル
簡単に非アクティブ化してアンインストールできるプラグインの依存関係を作成することは理想的ではありません。 通知プラグインが常に利用可能であることが本当に必要なシステムを構築している場合は、プラグインを独自のコードにバンドルできます。
以前にAdvancedCustom Fieldsプラグインを使用したことがある場合は、バンドル手順に精通している可能性があります。 プラグインのファイルをプラグインまたはテーマにコピーし、プラグインを手動で呼び出すだけです。
通知プラグインは非常によく似ていますが、プラグインの呼び出しは、高度なカスタムフィールドを使用する場合よりもはるかに簡単です。
プラグインのファイルをコピーするだけで、プラグインを機能させるには1つのファイルが必要です。
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通知システム用のオールインワンソリューションです。 設定は非常に簡単で、すぐに使用できます。 登録されているすべてのトリガーは、どの通知タイプでも機能します。高度な要件がある場合は、既存の拡張機能を使用することで時間を節約できます。
詳細と高度なテクニックについては、ドキュメントのWebサイトにアクセスしてください。
私は常に新しいアイデアを受け入れているので、もしあれば、GitHubの問題やTwitterで、コメントで私に連絡することができます。
リポジトリからプラグインをダウンロードして、試してみてください。