2023.01.28

WordPressで登録ユーザー宛にメールを一定件数ずつ送信する機能実装例

こんにちは、Webエンジニアのゾノ( @ozonosho )です。

今回の記事ではWordPressで登録ユーザー宛にメールを一定件数ずつ送信する機能実装例を紹介します。

たとえば登録者が1万人以上いるような会員サイトの場合、メールを一括送信すると途中で落ちたりサーバーの制約に引っかかったりします。そのため5分おきに500人ずつにメールを送信するような仕組みが必要になります。

実際に僕の運営する無料相談サイト「ココトモ」の場合だと数万人の会員がいるため、会員宛にメールを一括送信しても途中で落ちます。送信はSMPTリレーサービスのSendGridを利用しているのでメール送信数に上限はありませんが、一回で全件送ろうとすると処理時間の長さでタイムアウトします。

そんなわけで、ココトモで会員宛にメールを送信する際は前述した「5分おきに500人ずつにメールを送信する」という方法を取っています。

登録ユーザー宛にメールを一定件数ずつ送信する機能の実装方法

実装方法は色々あると思いますが、ここでは以下のアプローチを取ります。

  1. ユーザーごとに最終送信日をカスタムフィールド(meta_key:last_send_at)で管理する
  2. 未送信のユーザー500人を取得してメール送信する機能を作り、wp_cronを利用して5分毎に実行する

実際のコード例は下記になります。

function send_all() {

	/*
		①未送信のユーザー500人を取得
	*/
	$args = array(
		'number' => 500,
		'role__in' => array('member', 'user'), //送信したいユーザーの権限
		'meta_query' => array(
			'relation' => 'OR',
			array(
				'key' => 'last_send_at',
				'value' => wp_date('Y-m-d'),
				'compare' => '!=',
			),
			array(
				'key' => 'last_send_at',
				'compare' => 'NOT EXISTS',
			)
		)
	);
	$user_query = new WP_User_Query( $args );

	/*
		②メール送信
	*/
	if(!empty($user_query->results)) {
		mb_language("ja");
		mb_internal_encoding("UTF-8");
		$subject = '件名';
		$body = '本文';
		foreach ($user_query->results as $user) {
			wp_mail($user->user_email, $subject, $body);
			//送信完了日をカスタムフィールドに登録
			update_user_meta($user->ID, 'last_send_at', wp_date('Y-m-d'));
		}
	}

}
add_action('cron_send_all', 'send_all');

/*
	③wp_cronに5分毎の処理として登録
*/
if(!wp_next_scheduled('cron_send_all')) {
  wp_schedule_event(time(), 'minute5', 'cron_send_all');
}

//wp_cronに独自の実行時間単位を登録
function my_cron_intervals($schedules) {
  $schedules['minute5'] = array(
    'interval' => 300,
    'display' => '5分毎'
  );
  return $schedules;
}
add_filter( 'cron_schedules', 'my_cron_intervals');

①のとおり、まずは最終送信日が未登録または今日ではないユーザーを対象に500人取得します。
コードにあるWP_User_Queryの「role__in」を利用してユーザーの権限を指定したり、カスタムフィールドの条件を加えたりすることで、特定のユーザーだけを対象にしたメール送信機能を実現することもできます。

メール送信対象ユーザーを取得したら、②のとおりユーザー宛にメールを送信します。
送信完了したユーザーはカスタムフィールドの最終送信日を更新します。wp_mail関数は一応真偽値を返してくれるので、正常に送信できなかった場合はerror_log関数などを利用してログを吐き出すようにすると良いでしょう。

①②をあわせたメール送信処理の関数を作成したら、③のとおりwp_cronに関数を登録します。
wp_cronのデフォルトのスケジュールには「5分毎」が無いので、上記コード例のように「interval:300(秒)」のスケジュールを追加したうえで登録します。

これで一連の処理が実装できました。

今回は「数万人のユーザー向けに正常にメール配信するため一定件数ずつ送信する」という処理の実装方法を紹介したので、次回はこの仕組みを利用してメルマガの配信予約機能の実装方法あたりをご紹介したいと思います。

多数の会員を抱えるWebサービスにとって必須となる機能なので、会員制サイトを制作する際にはぜひお試しください。

おわりに

以上、今回の記事ではWordPressで登録ユーザー宛にメールを一定件数ずつ送信する機能実装例を紹介させていただきました。

当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。

あなたのサイトに理想の機能を実装!WordPressカスタマイズサービス

本サービスはあなたのWordPressサイトに理想の機能を実装するサービスとなります。 どのような機能・要望でも実現可能です! Wo......

→この記事を読む