会員制サイトで不特定多数の人が投稿できるようにしているサイトや多人数で編集する機会があるサイトでは、いちいち管理画面を開いて確認するわけにもいかず、いつ投稿が公開されたかを把握するのはとても大変な作業になってきます。

そこで本ページでは、投稿が公開されたときに限り、サイトのメールアドレス(「設定」→「一般」画面に表示されているメールアドレス)へ通知するコードを紹介します。

それでは早速...

以下のコードをテーマのfunctions.php、または、自作プラグインへ追加することで動作します。

/***** 投稿の公開時にサイトメールアドレスへ通知する *****/
if ( !function_exists( 'sample_post_pubulished_send_email' ) ){
function sample_post_pubulished_send_email($new_status, $old_status, $post_id){
if ( 'publish' == $new_status  &&  'publish' != $old_status && 'post' == $post_id->post_type ) {
	$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', 'sample_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ユーザーのニックネームにしています(別の項目を送信したい場合には調べて改変してください)
$headerstext/plain(テキスト形式)を指定しています。HTML形式で送る場合にはご自身で調べてヘッダーおよび本文の内容の変更をしてください

ちょっとしたことではありますが、文字列として送信されるものを「__(‘文字列’,’テキストドメイン’);」としていますので、自作テーマや自作プラグインで多言語対応しているようであれば、翻訳対象として設定できるようにしています。


本ページのコードは、以下のページなどを参考にしました。

実は参考にしたといいながら、冒頭で紹介したコードはほとんど別物になっています。

というのも...以下のような不具合というか不都合があったためです(参考ページとして2つ挙げていますが、結構いろいろなページで紹介されているコードがそれぞれ同じような問題を抱えていますので、上記ページに限ったことではありません)。

  • 通知メールが2重に送信される
  • メールが送信されない
  • 通知メールの内容が解説されているものと違う(送信されない内容もある)
  • 送信されるメール本文の内容にhtmlタグがそのまま表示される

ひとまずWordPressからメール送信をするのはwp_mail()という関数を使うのですが、内容はきちんと検証して変数化して与えてやらないと、意図した内容が含まれないということになったり、HTMLタグがそのまま内容として表示されてしまったりします。

また、よく使われる「publish_post」フックでは、確かに投稿公開時に発火するというものではあるものの、どうやら公開ボタンをクリックした時と、公開後に画面がリフレッシュされたときの両方で処理されてしまうため、2重にメールが送信されてしまうようです。

本ページで紹介するコードがどんな環境でも、どんなテーマでも動く!とは決して言いきれませんが、少なくともテストサイトでもいいから動いたものを掲載してもらえるといいなぁなんて個人的には感じました。