【カスタマイズ編】WordPressでWebプッシュ通知を送ろう!OneSignalプラグインの使い方

こんにちは、katori@xxbicottです。
WPプラグイン「OneSignal – Web Push Notifications」の使い方、これまで導入編・オプション編を紹介しました。

今回はfunctions.phpでカスタマイズを試してみた中で、

  • 特定のカテゴリ、タグ、投稿タイプへのプッシュ通知
  • スケジュール通知

が使う機会がありそうだったので、こちらを紹介したいと思います!

特定のカテゴリ、タグ、投稿タイプの記事のみプッシュ通知を送る

初期設定では通常投稿ページは全てプッシュ通知が送られるようになっていますが、例えば「セール情報」カテゴリのみ購読者へプッシュ通知を送りたいというケースもありますよね。

functions.phpでカスタマイズすれば、いちいち投稿ページ単位でもプッシュ通知の送信可否を操作しなくても制御することができます。

onesignal_include_postとonesignal_exclude_postを使用する

OneSignal側で用意されているフィルターを用いて制御を行なっていきます。

カテゴリーならin_category( $category )やhas_category( $category )、
タグならhas_tag( $tag )、
カスタム投稿タイプなら$post->post_type == “slug”、
カスタムタクソノミーならhas_term( $term, $taxonomy)
などで条件分岐して使っていきましょう。

ちなみに、この方法で制御する場合、投稿ページの送信可否チェックボックスは無視されるのでご注意ください。

特定の記事を除外する

onesignal_exclude_postフィルターを使用すると、プッシュ通知対象の記事でも通知しないようにできます。
下はスラッグが「test1」のカテゴリーの記事を除く時のサンプル。

add_filter('onesignal_exclude_post', 'onesignal_exclude_post_filter', 10, 3);
function onesignal_exclude_post_filter($new_status, $old_status, $post) {
	if ( in_category('test1') ) {
		return true;
	}
	return false;
}

逆に「test1」以外のカテゴリーの記事を除きたい場合は上の3〜5行目を下のようにすればOK。

if (! in_category('test1') ) {
	return true;
}

特定の記事を対象に含める

onesignal_include_postフィルターを使用すると、プッシュ通知対象外の記事でも通知するようにできます。
例えばカスタム投稿タイプの場合。初期設定ではプッシュ通知対象ではないんですが、onesignal_include_postを使うことでデフォルトでプッシュ通知が送られるようになります。

下はxxxというスラッグのカスタム投稿タイプをプッシュ通知対象にする場合の例。

add_filter('onesignal_include_post', 'onesignal_include_post_filter', 10, 3);
function onesignal_include_post_filter($new_status, $old_status, $post) {
	if ( $post->post_type == "xxx") {
		return true;
	}
}

除外する際は、includeだけだと通知は止められない

ここで注意しておきたいのが、onesignal_include_postはtrueとしたもののプッシュ通知を実施するが、falseにしたもののプッシュ通知を停止することものではないということ。

公式サイトによれば、下のようなロジックだそうです。

onesignal_include_postフィルター

trueを返すと、指定した投稿の通知が常に送信される。falseを返しても何も起こらず、単に制御をメインのプラグインロジックに戻すだけ
つまり、falseを返しても投稿が除外されないことに注意

onesignal_exclude_postフィルター

trueを返すと、指定した投稿の通知は送信されない。falseを返しても何も起こらず、単に制御をメインのプラグインロジックに戻すだけ
つまり、falseを返すと投稿が含まれないことに注意

onesignal_include_postフィルターとonesignal_exclude_postフィルターの併用

onesignal_include_postフィルターとonesignal_exclude_postフィルターを一緒に、または個別に使用できます。 操作の順序は、INCLUDE => EXCLUDEです。

onesignal_include_postフィルターが最初に実行され、投稿が含まれているかどうかが判断されます。

投稿が含まれていない場合、次にonesignal_exclude_postフィルターが実行され、この投稿が除外されているかどうかが判別されます。 投稿が除外されていない場合、通常のプラグインロジックが実行されます。

参照:WordPress Plugin Questions

これがどういうことかというと、例えばtest1カテゴリーだけプッシュ通知を送信したかったのに、onesignal_include_postだけだと全てのカテゴリで送信されてしまうということ。

add_filter('onesignal_include_post', 'onesignal_include_post_filter', 10, 3);
function onesignal_include_post_filter($new_status, $old_status, $post) {
	if ( in_category('test1') ) {
		return true;
	}
	return false;
}

これだと全てのカテゴリに送信される

そのため、除外設定がしたい時はonesignal_exclude_postフィルターが必ず必要になります。

ロジックではonesignal_include_postフィルターが最初に実行されるので、それを踏まえて下のコードのようにするとtest1カテゴリーへのプッシュ通知がいち早く行われる形になるのかなと思います。

add_filter('onesignal_include_post', 'onesignal_include_post_filter', 10, 3);
function onesignal_include_post_filter($new_status, $old_status, $post) {
	if ( in_category('test1') ) {
		return true;
	}
	return false;
}
add_filter('onesignal_exclude_post', 'onesignal_exclude_post_filter', 10, 3);
function onesignal_exclude_post_filter($new_status, $old_status, $post) {
	if (! in_category('test1') ) {
		return true;
	}
	return false;
}

ちなみに…

私の場合だけかもしれないんですが、上の通り除外設定を行うと、プッシュ通知自体はちゃんと止まるものの必ずこんなダイアログが出ました。


“OneSignal Push: Did not receive a response status from last notification sent”

最初はそういうものなのかな〜と思ったんですが、警告の中身(プラグインフォルダのnotice.js)を見てみるとリクエストが30回施行された結果のダイアログとのこと。

正常な挙動には見えませんが、このエラーメッセージでの事例がほぼないため解消せず…_(┐「ε:)_
ちょっと気になりますね。

WordPress画面上から設定する(カスタム投稿タイプのみ)

私はうまくいかなかったんですが、本来ならプラグイン設定画面からでもカスタム投稿タイプをプッシュ通知対象に含めることができるようなので、一応ご紹介します。

プラグイン設定画面の設定を次のように変更します。

  • Advanced Settings(高度な設定) > Additional Custom Post Types for Automatic Notifications Created From Plugins
    →入力欄にカスタム投稿タイプのスラッグを入力
  • Automatic Notification Settings(自動通知設定) > Automatically send a push notification when I publish a post from 3rd party plugins
    →ONに変更

※ プラグイン設定画面の内容や詳細はこちらをご参照ください。

ドキュメントを見る限りこれで対応できるはずなんですが、なぜかプッシュ通知は飛ばず。。

同じ報告を見つけましたが、解決に至りませんでした。
WooCommerceのカスタム投稿タイプとの連携方法などもドキュメントにあるから出来そうなんだけどなぁ(ヽ´ω`)

プッシュ通知のスケジュール制御

基本的にプッシュ通知は記事の公開と同時に行われます。
もし未来の時刻に公開予約をした記事ともにプッシュ通知を送信したい!という場合は普通の予約投稿で問題ありません。

記事公開とプッシュ通知のタイミングをずらしたい時は、onesignal_send_notificationフィルターを使うと実現できます。

プッシュ通知の時刻を指定する

onesignal_send_notificationフィルターの$fields[‘send_after’]を使うと、プッシュ通知を送る時間を指定することができます。

add_filter('onesignal_send_notification', 'onesignal_send_notification_filter', 10, 4);
function onesignal_send_notification_filter($fields, $new_status, $old_status, $post)
{
	$fields['send_after'] = "Mon May 12 2020 14:45:00 GMT+0900";
	return $fields;
}

これを利用すれば、例えば朝の7時までに公開した記事は朝の7時、そこから夜の7時までに公開した記事は夜の7時にプッシュ通知を送るようにカスタマイズできそうですね。

ちなみに、指定した時刻までに複数の記事が公開されたらどうなるかな〜と試したところ、指定時刻には最後の記事のプッシュ通知しか届きませんでした。

受け取り側のタイムゾーンに合わせて送信する

$fields[‘delayed_option’]と$fields[‘delivery_time_of_day’]を使うと、相手のタイムゾーンの特定の時刻に送信することができます。

add_filter('onesignal_send_notification', 'onesignal_send_notification_filter', 10, 4);
function onesignal_send_notification_filter($fields, $new_status, $old_status, $post)
{
	$fields['delayed_option'] = 'timezone';
	$fields['delivery_time_of_day'] = '2:53PM';

	return $fields;
}

書き方が先ほどの$fields[‘send_after’]とはまた違います。
ここら辺は以下のURLが参考になります。

参考:Create notification

さいごに

今回までのOneSignalの記事は興味本位で調べ始めたものだったんですが、プッシュ通知=有料なイメージをなんとなく持っていたので無料でここまで出来るのか〜と驚きでした(°Д°)

最初はできたらこのブログにも導入しようと思ってましたが、ブログの性質によってはプッシュ通知が望まれないケースも多い様子。
ECサイトの新商品紹介やニュース速報、限定セールなど、プッシュ通知が効果的なサイトの時に適宜提案していけたらなと考えています。

以上、【カスタマイズ編】WordPressでWebプッシュ通知を送ろう!OneSignalプラグインの使い方 でした!