WordPress 3分間フッキングシリーズについて
こんにちは!「WordPress 3分間フッキング」シリーズへようこそ。埼玉県川越市を拠点に活動する私たちが、WordPressの「フック」を活用した実用的なカスタマイズ術をお届けします。
このシリーズは、お料理番組「3分間クッキング」のように、短時間で理解・実装できるWordPressフックの活用法を紹介しています。プラグインを追加せずに、functions.php に数行のコードを追加するだけで、サイトに便利な機能を追加できるのがフックの魅力です。
今回は「投稿が公開されたときに管理者に自動通知する」機能を実装します。サイト運営を複数人で行っている場合に、誰かが新しい記事を公開したことをすぐに知りたい場合に便利です!
投稿公開通知の目的と概要
WordPressサイトを複数の投稿者で運営している場合、誰かが新しい記事を公開したことをタイムリーに知りたいケースがあります。例えば以下のような場面で役立ちます:
- 編集者やライターが公開した記事をすぐに確認したい
- サイト管理者として、公開された記事の品質チェックをリアルタイムで行いたい
- チーム内で新しいコンテンツの共有をスムーズに行いたい
- 投稿が公開されたタイミングで承認や次のアクションが必要な場合
WordPress には標準でこのような通知機能が備わっていませんが、「publish_post」フックを使えば、数行のコードで簡単に実装できます。記事が公開されるたびに、管理者のメールアドレスに自動で通知メールが送信されるようになります。
フックコードと基本実装
それでは、投稿公開通知を実装するコードを見てみましょう:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
add_action('publish_post', 'wp3min_notify_admin', 10, 2); function wp3min_notify_admin($post_id, $post) { // 投稿タイプが 'post' であることを確認(必要に応じて) if ('post' !== $post->post_type) { return; } $admin_email = get_option('admin_email'); $title = $post->post_title; $permalink = get_permalink($post_id); $author = get_the_author_meta('display_name', $post->post_author); $subject = '['. get_bloginfo('name'). '] 新しい投稿が公開されました: '. $title; $message = "投稿者: ". $author. "\n"; $message .= "タイトル: ". $title. "\n"; $message .= "公開されました。\n\n"; $message .= "確認はこちら: ". $permalink; wp_mail($admin_email, $subject, $message); } |
このコードを functions.php に追加するだけで、新しい投稿が公開されるたびに管理者のメールアドレスに通知メールが送信されるようになります。
フックコードの詳細解説
コードの各部分を詳しく解説していきましょう。
1. フックの登録
1 |
add_action('publish_post', 'wp3min_notify_admin', 10, 2); |
この行では、「publish_post」というアクションフックに関数を登録しています。
- publish_post: 投稿が「公開」ステータスになったときに発動するフック
- wp3min_notify_admin: フックが発動したときに実行する関数名
- 10: 実行優先度(デフォルト値)
- 2: 関数が受け取るパラメータの数
最後の「2」という数字が重要です。これにより、フック関数が「$post_id」と「$post」の2つのパラメータを受け取れるようになります。
2. 投稿タイプの確認
1 2 3 4 |
// 投稿タイプが 'post' であることを確認(必要に応じて) if ('post' !== $post->post_type) { return; } |
この部分では、公開されたコンテンツが通常の「投稿」(post)であることを確認しています。これにより、カスタム投稿タイプや「固定ページ」が公開されたときには通知されません。
もし他の投稿タイプ(例えば「product」など)でも通知を送りたい場合は、このチェックを調整するか、別のフック関数を追加することができます。
3. 通知情報の取得
1 2 3 4 |
$admin_email = get_option('admin_email'); $title = $post->post_title; $permalink = get_permalink($post_id); $author = get_the_author_meta('display_name', $post->post_author); |
ここでは、通知メールに必要な情報を取得しています:
get_option('admin_email')
– サイト管理者のメールアドレス$post->post_title
– 公開された投稿のタイトルget_permalink($post_id)
– 投稿のパーマリンク(URL)get_the_author_meta('display_name', $post->post_author)
– 投稿者の表示名
4. メール構築と送信
1 2 3 4 5 6 7 |
$subject = '['. get_bloginfo('name'). '] 新しい投稿が公開されました: '. $title; $message = "投稿者: ". $author. "\n"; $message .= "タイトル: ". $title. "\n"; $message .= "公開されました。\n\n"; $message .= "確認はこちら: ". $permalink; wp_mail($admin_email, $subject, $message); |
最後に、メールの件名と本文を構築し、wp_mail()
関数を使って送信しています。
「wp_mail()」はWordPressの組み込み関数で、PHPの「mail()」関数をラップして使いやすくしたものです。プラグインを追加しなくても、WordPress標準でメール送信ができます。
publish_postとsave_postの違い
コード例の最初にあるコメントで、「’publish_post’ フックを使用する方がシンプル」と言及していますが、なぜ「save_post」ではなく「publish_post」を選ぶべきなのでしょうか。
フック名 | 発動タイミング | 特徴 |
---|---|---|
publish_post | 投稿が「公開」状態になったとき | ・新規作成後の公開時 ・下書きから公開への変更時 ・予約投稿が公開された時 |
save_post | 投稿が保存されるたびに | ・下書き保存時も発動 ・自動保存時も発動 ・$updateフラグで新規/更新の判別が必要 ・公開以外のステータス変更でも発動 |
「save_post」フックを使う場合、不要な通知を防ぐために条件チェックが複雑になります。下書き保存や自動保存時に誤って通知されないよう、ステータスチェックや更新フラグチェックが必要です。
今回は「投稿が公開されたときだけ通知する」という明確な目的があるため、「publish_post」フックの方がシンプルで適切です。
実装手順
では、このカスタマイズを実際にWordPressサイトに追加する方法を見ていきましょう:
- WordPressの管理画面にログインします
- 「外観」→「テーマエディター」(または「テーマファイルエディター」)を開きます
- 子テーマを使用している場合は、子テーマを選択してください
- テーマエディターが表示されない場合は、プラグインで無効化されているかもしれません
- 右側のファイル一覧から「functions.php」を選択します
- ファイルの末尾(PHPの終了タグ「?>」がある場合はその前)に、先に紹介したコードを貼り付けます
- 「ファイルを更新」ボタンをクリックします
- 新しい投稿を作成し、公開して通知メールが正しく送信されるか確認します
サーバーの設定によっては、メール送信機能が正しく動作しない場合があります。その場合、SMTP送信プラグインを使うことでメール配信の信頼性を向上させることができます。
カスタマイズバリエーション
基本的な通知機能を理解したところで、より実用的なカスタマイズ例を見ていきましょう。目的に合わせて機能を拡張できます。
1. 複数の管理者に通知する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
add_action('publish_post', 'wp3min_notify_multiple_admins', 10, 2); function wp3min_notify_multiple_admins($post_id, $post) { // 投稿タイプ確認 if ('post' !== $post->post_type) { return; } // 通知を送信する宛先リスト $recipients = array( get_option('admin_email'), 'editor@example.com', 'manager@example.com' ); // メール内容の構築(基本的な例と同様) $title = $post->post_title; $permalink = get_permalink($post_id); $author = get_the_author_meta('display_name', $post->post_author); $subject = '['. get_bloginfo('name'). '] 新しい投稿: '. $title; $message = "投稿者: ". $author. "\n"; $message .= "タイトル: ". $title. "\n"; $message .= "確認URL: ". $permalink; // BCC で全員に送信 wp_mail($recipients, $subject, $message); } |
このバリエーションでは、複数のメールアドレスに通知を送信します。wp_mail()
関数の第1引数に配列を渡すことで、複数の宛先に一斉送信できます。
2. 特定のカテゴリーの投稿のみ通知する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
add_action('publish_post', 'wp3min_notify_category_based', 10, 2); function wp3min_notify_category_based($post_id, $post) { // 通知対象のカテゴリーID $important_categories = array(4, 10, 15); // 重要カテゴリーのID // 投稿のカテゴリーを取得 $categories = wp_get_post_categories($post_id); // いずれかの重要カテゴリーに属しているか確認 $notify = false; foreach ($categories as $category) { if (in_array($category, $important_categories)) { $notify = true; break; } } // 重要カテゴリーの投稿でなければ何もしない if (!$notify) { return; } // ここから通知処理(基本例と同様) $admin_email = get_option('admin_email'); // メール送信処理... } |
カテゴリーに基づいてフィルタリングすることで、特定のトピックの投稿のみを通知することができます。例えば「お知らせ」や「重要」カテゴリーの記事だけを通知したい場合に便利です。
3. HTMLメール形式でリッチな通知を送信する

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
add_action('publish_post', 'wp3min_notify_html_email', 10, 2); function wp3min_notify_html_email($post_id, $post) { // 基本情報取得 $admin_email = get_option('admin_email'); $title = $post->post_title; $permalink = get_permalink($post_id); $author = get_the_author_meta('display_name', $post->post_author); $excerpt = wp_trim_words($post->post_content, 30); // アイキャッチ画像 $thumbnail = get_the_post_thumbnail_url($post_id, 'thumbnail'); $thumb_html = $thumbnail ? '<img src="' . $thumbnail . '" style="max-width:100%;height:auto;display:block;margin:15px 0;">' : ''; // HTMLメールの本文 $html_message = ' <div style="max-width:600px;margin:0 auto;font-family:sans-serif;color:#333;"> <h2 style="color:#0073aa;border-bottom:1px solid #eee;padding-bottom:10px;">新しい投稿が公開されました</h2> <h3 style="margin-top:20px;">' . $title . '</h3> <p><strong>投稿者:</strong> ' . $author . '</p>' . $thumb_html . ' <p>' . $excerpt . '...</p> <p><a href="' . $permalink . '" style="background:#0073aa;color:white;padding:10px 15px;text-decoration:none;border-radius:4px;display:inline-block;">記事を確認する</a></p> </div>'; // メールヘッダー $headers = array( 'Content-Type: text/html; charset=UTF-8' ); // HTMLメール送信 wp_mail($admin_email, '['. get_bloginfo('name'). '] ' . $title, $html_message, $headers); } |
HTMLメールを使うと、アイキャッチ画像や装飾付きの通知を送信できます。ビジュアル的にわかりやすく、記事の概要をプレビューすることも可能です。
4. Slack/Discordと連携する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
add_action('publish_post', 'wp3min_notify_slack', 10, 2); function wp3min_notify_slack($post_id, $post) { // Slack Webhook URL $webhook_url = 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'; $title = $post->post_title; $permalink = get_permalink($post_id); $author = get_the_author_meta('display_name', $post->post_author); // Slackに送信するデータ $payload = json_encode(array( 'text' => '新しい投稿が公開されました!', 'blocks' => array( array( 'type' => 'section', 'text' => array( 'type' => 'mrkdwn', 'text' => "*新しい投稿:* " . $title ) ), array( 'type' => 'section', 'fields' => array( array( 'type' => 'mrkdwn', 'text' => "*投稿者:*\n" . $author ), array( 'type' => 'mrkdwn', 'text' => "*公開日:*\n" . get_the_date('Y/m/d H:i', $post) ) ) ), array( 'type' => 'actions', 'elements' => array( array( 'type' => 'button', 'text' => array( 'type' => 'plain_text', 'text' => '記事を確認', ), 'url' => $permalink ) ) ) ) )); // Webhookにデータを送信 $response = wp_remote_post($webhook_url, array( 'body' => $payload, 'headers' => array('Content-Type' => 'application/json') )); // エラー処理 if (is_wp_error($response)) { error_log('Slack通知エラー: ' . $response->get_error_message()); } } |
メール以外にも、SlackやDiscordなどのチャットツールに通知を送ることもできます。チームでサイト運営している場合、リアルタイムな通知として便利です。
実装時の注意点とベストプラクティス
投稿通知機能を実装する際の注意点とベストプラクティスをいくつか紹介します。
1. エラーハンドリング
メール送信やAPI通信が失敗することもあります。エラー処理を追加して、問題が発生した際に対応できるようにしましょう。
1 2 3 4 5 |
$result = wp_mail($admin_email, $subject, $message); if (!$result) { error_log('投稿通知メールの送信に失敗しました: ' . $post_id); // 失敗時の代替処理 } |
2. 通知頻度の調整
多数の投稿が短時間に公開されると、大量の通知が送信される可能性があります。一定時間内の通知を制限する仕組みを考慮しましょう。
1 2 3 4 5 6 |
// 最後の通知から30分以内は送信しない $last_notify = get_option('last_post_notification', 0); if (time() - $last_notify < 1800) { return; // スキップ } update_option('last_post_notification', time()); |
3. プライバシーとセキュリティ
メール通知には投稿情報が含まれるため、プライバシーとセキュリティに配慮しましょう。特に非公開情報は通知に含めないようにします。
4. テスト環境での確認
本番環境に実装する前に、テスト環境で動作確認することをお勧めします。特にメール送信は、サーバー環境によって挙動が異なることがあります。
まとめ
「publish_post」フックを使った投稿公開通知機能の実装方法を紹介しました。このカスタマイズにより、プラグインをインストールすることなく、新しい投稿が公開されたタイミングで管理者に自動通知することができます。
数行のコードで実用的な機能が追加できるのが、WordPressフックの魅力です。今回紹介したカスタマイズは、複数人でサイトを運営する場合や、投稿の承認フローを管理する場合に特に役立ちます。
埼玉県川越市を拠点とする私たちは、こうしたWordPressカスタマイズを通じて、お客様のサイト運営をより効率的にサポートしています。フックを活用すれば、プラグインに頼らず軽量なサイトを維持しながら、必要な機能を追加できます。
よくある質問
Q: 特定の著者の投稿だけを通知することはできますか?
A: はい、可能です。以下のようなコードで、特定の著者の投稿のみ通知できます:
1 2 3 4 5 6 7 |
// 特定の著者IDリスト $specific_authors = array(2, 5, 10); // 著者IDをチェック if (in_array($post->post_author, $specific_authors)) { // 通知処理 } |
Q: カスタム投稿タイプでも同様の通知を設定できますか?
A: はい、カスタム投稿タイプに対しても同様のフックが存在します。例えば「product」というカスタム投稿タイプの場合、「publish_product」というフック名になります。あるいは、投稿タイプを判定するコードを調整することもできます:
1 2 3 4 5 |
// 複数の投稿タイプをチェック $notify_post_types = array('post', 'product', 'event'); if (in_array($post->post_type, $notify_post_types)) { // 通知処理 } |
Q: 投稿が更新された場合も通知を送りたいのですが?
A: 投稿の更新時にも通知を送るには、「post_updated」フックを使用できます。ただし、公開ステータスになったときだけでなく、あらゆる更新で発動するため、条件分岐が必要です:
1 2 3 4 5 6 7 |
add_action('post_updated', 'wp3min_notify_on_update', 10, 3); function wp3min_notify_on_update($post_id, $post_after, $post_before) { // 公開済みの投稿が更新された場合のみ通知 if ('publish' === $post_after->post_status && 'publish' === $post_before->post_status) { // 通知処理 } } |
Q: メールが送信されない場合はどうすればいいですか?
A: サーバーの設定によっては、wp_mail() 関数が正しく動作しない場合があります。その場合は、SMTP送信プラグイン(例:WP Mail SMTP)を導入することで、より確実にメールを送信できるようになります。また、error_log() でデバッグ情報を記録すると、問題解決に役立ちます。
WordPressサイトのカスタマイズやプラグイン開発でお困りの場合は、WordPressカスタマイズ・プラグイン開発サービスをご検討ください。また、WordPress運用におけるセキュリティや保守管理のサポートが必要な場合は、WordPress保守サポートサービスも提供しています。