質問するログイン新規登録
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1769閲覧

Wordpress ページ更新時のメール自動配信が2重送信される問題

hiroaki_

総合スコア6

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/09/20 19:23

編集2021/09/21 20:05

0

0

<?php add_action('post_updated', function($post_ID, $post_after, $post_before) { //ユーザー一覧の取得 $blogusers = get_users('role=subscriber'); // post_ID:1006 if ($post_ID == 1006) { foreach ( $blogusers as $user) { $to_mail = ($user -> user_email); // 送信先のメールアドレス(複数指定可) $to = $to_mail; // 件名 $subject = '新しい記事が公開されました'; // 本文 $message = $post_after->post_title . "\n"; //更新後の固定ページタイトル $message .= get_permalink($post_ID) . "\n"; //固定ページのURL $message .= "上記リンクから最新ページにアクセス可能です。"; // FromやReply-Toを記述。WordPressの一般設定で設定しているメールアドレスをFromにする場合は空配列。 $headers = 'From: 〇〇株式会社 <example@outlook.com>' . "\r\n"; // 添付ファイルがあればファイルパスを記述 $attachments = []; wp_mail($to, $subject, $message, $headers, $attachments); }; }; }, 10, 3);

Wordpressで会員制サイトを構築中です。
上記のコードをwordpressの子テーマfunction.phpに記述して、指定の固定ページが更新されたときに登録ユーザーに対してメール自動配信をする機能を実装しています。

メール自体はページ更新時に配信されるようにはなったのですが、何故かメールが必ず2通届いてしまいます。。
$to部分にメールアドレスを直接記載してみたり、mb_send_mailを使ってみたりしてみたのですが、どの場合も必ず2回メールが届いてしまいます。
原因不明なのですが、過去に同じような経験をした方がいればと思い質問させていただきました。
よろしくおねがいします。

ご回答いただいた方法で少しコードを書き直しましたので再投稿致します。
現状はまだ2回送信されています。
wordpressのwp mail logging で送信ログを確認したところ2回同じメールアドレスに送信がされていることが確認できました。

<?php function my_post_updated($post_ID, $post_after, $post_before) { //ユーザー一覧の取得 $blogusers = get_users('role=subscriber'); // post_ID:1006 if ($post_ID == 1006 && $post_type = 'page') { foreach ( $blogusers as $user) { $to_mail = ($user -> user_email); // 送信先のメールアドレス(複数指定可) $to = $to_mail; // 件名 $subject = '新しい記事が公開されました'; // 本文 $message = $post_after->post_title . "\n"; //更新後の固定ページタイトル $message .= get_permalink($post_ID) . "\n"; //固定ページのURL $message .= "上記リンクから最新ページにアクセス可能です。"; // FromやReply-Toを記述。WordPressの一般設定で設定しているメールアドレスをFromにする場合は空配列。 $headers = []; // 添付ファイルがあればファイルパスを記述 $attachments = []; if(did_action('post_updated') == 1){ wp_mail($to, $subject, $message, $headers, $attachments); } remove_action('post_updated','my_post_updated',10); }; }; }; add_action('post_updated','my_post_updated',10,3);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2021/09/21 05:13

2回届いたメールの Recived ヘッダは、同一ですか? 別々ですか? メールサーバのログが確認できるのであれば、送信時のログを確認してみてください。 PHP からのメールは2通送られていますか? PHP からのメールは1通なのに 2通届いていますか?
hiroaki_

2021/09/21 19:45

ご回答ありがとうございます! ヘッダは共通でした。 また、wordpressからのメールログをプラグインのwp mail logging で確認したところ2回送信がされていました。 下記のkei344さんの回答にもコメントしたのですが、did_actionを使ってアクション1回目のみメール送信するようにしても2回メールが送信されていました。。。 if(did_action('post_updated') == 1){ wp_mail($to, $subject, $message, $headers, $attachments); } メールを送信している部分をif文で囲んでやったのですが、方法が間違っているでしょうか?
CHERRY

2021/09/22 10:40 編集

> ヘッダは共通でした。 共通というのは、同一だったということでしょうか? それ以外の意味を含んでいますか? 具体的に、メールヘッダに記載されているすべてのホスト名やタイムスタンプの「時分秒」も同じだったということでしょうか? その場合、Message-ID は、どうなっていますか?
guest

回答2

0

ベストアンサー

tabuuさんの回答&hiroaki_さんのコメントより、同一のタイミングで実行されている可能性は低いですが、アクションは実行済みかどうか調べることが可能です。

【did_action – WordPress私的マニュアル】
https://elearn.jp/wpman/function/did_action.html


現在のコードの問題について、$post_afterpost_typeを限定すべきではないかと思います。
WordPressではアイキャッチ画像やリビジョンもpostの扱いになるため、画像を投稿したり、リビジョンが生成されるたびに、post_updatedフックを通ります。

【リビジョンの仕組みを勘違いしてた – WordPress私的マニュアル】
https://elearn.jp/wpman/column/c20180917_01.html

リビジョン機能を調べていくと、 wp_insert_post関数の'post_updated'アクションに指定されたwp_save_post_revision関数で作られていた。'post_updated'アクションが実行されるタイミングは既存の投稿データを更新した後でその投稿データを元にして、親ID(post_parent)を元となる投稿のIDに、投稿タイプ(post_type)を'revision'に、投稿ステータスを'inherit'にするなど、いくつかの変更を行ってから保存していた。

このwp_save_post_revision関数内からさらに呼ばれた関数内でwp_insert_postが実行されます。

投稿2021/09/21 07:43

kei344

総合スコア69625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroaki_

2021/09/21 20:08

ご回答ありがとうございます! 質問部分に修正したコードを更新したのですが、post_type,did_actionを使って絞り込みをしましたが、まだ2回送信がされている状態です。。 強制的に一度しか送らないように、なにかフィルターのようなものがかけれればいいかなと模索しています。。
kei344

2021/09/22 02:24

すみません、最初の投稿でも「$post_ID == 1006」で限定されていましたね。 また、remove_actionとdid_actionは両方書く必要はありません。 各種プラグインを使用しない状態で試してみてはいかがでしょうか。
guest

0

post_updatedが複数回コールされているような感じがします。

以下のようにメール送信後にフックを解除すればいかがでしょうか?

PHP

1function my_post_updated($post_ID, $post_after, $post_before) { 2 ... 3 wp_mail($to, $subject, $message, $headers, $attachments); 4 remove_action('post_updated', 'my_post_updated', 10); 5} 6 7add_action('post_updated', 'my_post_updated', 10, 3);

投稿2021/09/21 00:16

tabuu

総合スコア2493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroaki_

2021/09/21 03:02

ご回答ありがとうございます! 頂いたコードで試してみたのですが、やはり2回メールが送信されてしまいました。。。 なにかサーバーやブラウザなどの根本的なシステムの問題な気もしてきましたが全然糸口が見つからないです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問