東京都府中市、九段下のWEB制作会社Maromaroのブログです

2023.09.19

taka

WordPressの記事投稿時にTeamsへ通知を送信する方法

Takaです。

今回はWordPressの記事投稿時にTeamsへ通知を送信する方法を書きます。

 

実装方法

■用意するもの

・組織用のTeamsアカウント または Slackのアカウント
・Webhook URL (teamsまたはslackのいずれか)
・WordPress
・wp-cronを実行できる環境

 

まず初めにTeamsアカウントなどを取得し、
WebhookURLをだします。

今回はTeamsでの手順を簡単にご紹介します。

まずTeamsの画面で通知を送信したいチャンネルの3点リーダーをクリックし「コネクタ」を押下します。

次に「Incoming Webhook」の構成(または追加)ボタンを押下します。
この際初めての場合はそのあと追加をさらに押してください。
その後初めからやり直すと構成ボタンが出現します。

適当な名前を付けて、
作成ボタンを押します。

そうするとURLが発行されるので、
コピーをして保管し、完了を押下でURLの生成は終了です。
こちらは後々に通知先の設定で使用します。

 

次にWordPress側での実装を行います。
今回は記事投稿時に指定のWebhook URLで通知を送信する形となります。

functions.phpに以下のように記載します。

function schedule_delayed_event($new_status, $old_status, $post) {
  if ($new_status == 'publish' && $old_status != 'publish') {
    // 記事公開後5秒後に 'send_notification_cron' アクションを実行する
    wp_schedule_single_event(time() + 5, 'send_notification_cron', array($post->ID));
  }
}
add_action('transition_post_status', 'schedule_delayed_event', 999, 3);


function send_notification() {
  $post_id = func_get_arg(0); // スケジュールイベントから渡された引数を取得
  $webhook_url = "Webhook URLを入れてください";
  // Webhook URLが設定されている場合
  if (!empty($webhook_url)) {
      // 通知の内容を設定
      $message = array(
          'text' => '記事が公開されました! タイトル:'.get_the_title($post_id).' URL:' . get_permalink($post_id),
      );
     
      // 通知を送信
      $args = array(
          'body' => json_encode($message),
          'headers' => array('Content-Type' => 'application/json'),
      );
      wp_remote_post($webhook_url, $args);
  }
}
add_action('send_notification_cron', 'send_notification');

何をしているかというと、
公開記事かつ前回のステータスが公開以外のものが投稿されたら、
それをフックに5秒後に通知するようにwp-cronに登録します。

なぜわざわざ一旦wp-cronに登録するかというと、
カスタムタクソノミー等を設定している場合、
新規投稿時のフックでカスタムタクソノミーの中身を拾えないためです。
今回は特にカスタムタクソノミーを使用するコードは書いてないですが、
そういったケースもあったため、このようにしております。

新規作成→下書き→公開
の手順を踏んだ場合はこの限りではありません。

今回はTeamsのWebhook URLを記載しましたが、
“Webhook URLを入れてください”の部分をSlackのWebhook URLに変更すればSlackに送信されるようになります。

以上Takaでした。