会員制サイトで不特定多数の人が投稿できるようにしているサイトや多人数で編集する機会があるサイトでは、いちいち管理画面を開いて確認するわけにもいかず、いつ投稿が公開されたかを把握するのはとても大変な作業になってきます。
そこで本ページでは、投稿が公開されたときに限り、サイトのメールアドレス(「設定」→「一般」画面に表示されているメールアドレス)へ通知するコードを紹介します。
それでは早速...
本ページ掲載のコードを使用するときは
本ページで掲載しているコードは、以下に了承した上で使用ください
- コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
- コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
- コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
- コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
- 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
- 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)
以下のコードをテーマのfunctions.php、または、自作プラグインへ追加することで動作します。
/***** 投稿の公開時にサイトメールアドレスへ通知する *****/
if ( !function_exists( 'pwcn_post_pubulished_send_email' ) ){
function pwcn_post_pubulished_send_email($new_status, $old_status, $post_id){
if ( $new_status == 'publish' && $old_status !='publish' && $post_id->post_type == 'post') {
$to = get_option('admin_email');//送信先(サイトメールアドレス)
$post_url = get_permalink( $post_id );//投稿のURL
$post_title = get_the_title($post_id);//投稿タイトル
$author_ID = $post_id->post_author;//投稿者のID
$author_name = get_the_author_meta('nickname',$author_ID);//投稿者のIDからニックネームを取得
$subject = __('投稿が公開されました','');//メールの件名
$headers = array('Content-Type: text/plain; charset=UTF-8');//ヘッダー情報
$title_text = __('投稿が公開されました','');
$posttitle_text = __('投稿タイトル:','');
$posturl_text = __('投稿のURL:','');
$post_author_text = __('作者:','');
$message = <<<EOF
$title_text
$posttitle_text $post_title
$posturl_text $post_url
$post_author_text $author_name
EOF;
wp_mail($to, $subject, $message, $headers, array( '' ) );
}
}
}
add_action( 'transition_post_status', 'pwcn_post_pubulished_send_email', 10, 3);
コードを簡単に解説しておくと、
メールの送信は、wp_mailという関数を使って行っています(SMTPを経由させるプラグインを使っていても問題なく動作すると思います)。
そして、transition_post_statusというフックを使って、投稿の状態(ステータス)がコード中の条件に合致した場合(投稿が公開された場合)にメールを送信するという仕組みになっています。
投稿の情報から抽出したデータと、件名や本文の文章などを組み合わせたメールを送信するようにしています。
どんな内容が送信されるのかは、恐らくコード中に日本語で書いているので問題ないと思いますが、以下で一応一覧にしておきます。
変数 | 出力内容 |
---|---|
$subject | メールの件名です |
$title_text | メール本文冒頭の文章です |
$posttitle_text | 投稿のタイトル横に表示する文字列です |
$posturl_text | 投稿のURL横に表示する文字列です |
$post_author_text | 作者名の横に表示する文字列です |
$to | メールの送信先です(管理者などにしたい場合には、ご自身で調べて改変してください) |
$author_name | ユーザーのニックネームにしています(別の項目を送信したい場合には調べて改変してください) |
$headers | text/plain(テキスト形式)を指定しています。HTML形式で送る場合にはご自身で調べてヘッダーおよび本文の内容の変更をしてください |
ちょっとしたことではありますが、文字列として送信されるものを「__(‘文字列’,’テキストドメイン’);」としていますので、自作テーマや自作プラグインで多言語対応しているようであれば、翻訳対象として設定できるようにしています。
本ページのコードは、以下のページなどを参考にしました。
実は参考にしたといいながら、冒頭で紹介したコードはほとんど別物になっています。
というのも...以下のような不具合というか不都合があったためです(参考ページとして2つ挙げていますが、結構いろいろなページで紹介されているコードがそれぞれ同じような問題を抱えていますので、上記ページに限ったことではありません)。
- 通知メールが2重に送信される
- メールが送信されない
- 通知メールの内容が解説されているものと違う(送信されない内容もある)
- 送信されるメール本文の内容にhtmlタグがそのまま表示される
ひとまずWordPressからメール送信をするのはwp_mail()という関数を使うのですが、内容はきちんと検証して変数化して与えてやらないと、意図した内容が含まれないということになったり、HTMLタグがそのまま内容として表示されてしまったりします。
また、よく使われる「publish_post」フックでは、確かに投稿公開時に発火するというものではあるものの、どうやら公開ボタンをクリックした時と、公開後に画面がリフレッシュされたときの両方で処理されてしまうため、2重にメールが送信されてしまうようです。
本ページで紹介するコードがどんな環境でも、どんなテーマでも動く!とは決して言いきれませんが、少なくともテストサイトでもいいから動いたものを掲載してもらえるといいなぁなんて個人的には感じました。
投稿タイプを追加したいときは
単純にコード中で条件指定している以下の部分
$post_id->post_type == 'post'
で、array指定すればいいかと思ったのですが、うまく動作しないようです。
従って、別のユーザー定義関数を用意して対応するか、条件をグリグリ書いて動作させるといった対応が必要でしょう。
ただ、運営方法によっては、特に指定することなく公開している投稿タイプすべてで機能を有効にしたいという機会が多いと思いますので、以下のページのようにして実装するとうまく動作するようです。
コメントを残す