以前に公開した以下のページでは、「投稿」という投稿タイプで、状態が「公開」以外から「公開」となった場合にサイトのメールアドレス宛に通知メールが送信されるというものでした。
通常のサイトでは、何かを一般に公開できるのは「投稿」と「固定ページ」だけで、頻繁に公開という作業が行われるのは「投稿」なので、リンク先ページのコードで事足りると思います。
ただ、サイトにカスタム投稿タイプを追加して、追加したカスタム投稿タイプ上で状態が「公開」となっても通知メールは送信されません。
これは、ジャンルをカスタム投稿タイプで分けているようなサイトではすべてを把握できないため不都合に感じるかも知れません。
そこで今回は、上記のページで紹介したコードをさらにカスタマイズして、「投稿」「固定ページ」「追加したカスタム投稿タイプ」すべてで状態が「公開」に変更された場合にメールを送る方法を紹介します。
ひょっとしたらもっとスマートな方法があるかも知れませんので参考程度にお読みください
すべての投稿タイプでステータスが「公開」になった時に自動でメール通知をするためのコード
まずは完成コードから。コードの後に解説をしていきます。
if ( !function_exists( 'sample_post_pubulished_send_email' ) ){
function sample_post_pubulished_send_email($new_status, $old_status, $post_id){
//投稿や固定ページと同じ機能を持つ投稿タイプを$post_typesへ代入
$post_types = get_post_types_by_support(array('title', 'editor', 'thumbnail'));
//$post_typeで公開になっていない投稿タイプを除外して$post_keyに代入し直す
foreach ($post_types as $post_spec => $post_type) {
if (!is_post_type_viewable($post_type)) {
unset($post_types[$post_type]);
}
}
//$post_keyに合致する投稿タイプに対してコールバック関数の列を並び替え可能にする
foreach ($post_types as $post_spec) {
if ( $new_status == 'publish' && $old_status !='publish' && $post_id->post_type == $post_spec) {
$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 = __('Post publish notification','');//メールの件名
$headers = array('Content-Type: text/plain; charset=UTF-8');//ヘッダー情報
$title_text = __('Post Published','');
$posttitle_text = __('Post Title:','');
$posturl_text = __('Post URL:','');
$post_author_text = __('Author:','');
$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);
冒頭のリンク先ページにあるコードと比較しながら見るとわかりやすいと思います
「transition_post_status」にフックさせて、公開以外の状態から公開となった場合にメールを送信するという基礎となるコード自体は変わりません。
相違点は以下の部分です。
- 「get_post_types_by_support」関数を使って、「title」「editor」「thumbnail」というサポートが有効な投稿タイプをすべて抽出する
- 念のため、「is_post_type_viewable」関数を使って、フロントエンド表示可能な投稿タイプ以外を除外して(プラグインなどがバックエンド用に生成する投稿タイプやパターンなどを除外)投稿タイプ分だけ抽出を繰り返す
- 繰り返して抽出した投稿タイプ分だけ、メール生成の処理を繰り返す
自身のサイトでカスタマイズする際は十分にテストを行ってくださいね。
コメントを残す