WordPress 記事公開時にカテゴリ含めて通知する

投稿日:

WordPressのプラグインを使用すれば、簡単にSlackへ通知を行う事が出来ますが、
今回は、アクションフックを使って独自に実装してみます。

ステータス変更時に通知する

ChatGPTに、以下のように聞いてみると、

「WordPressで、記事を公開した際や、下書きに戻して再び公開した際に、Slackへ通知を行いたい。アクションフックのサンプルを教えてほしい。」

transition_post_status を利用すると良いと教えてくれました。

/**
 * 公開に切り替わった際にSlackへ通知
 */
function notify_slack_on_publish($new_status, $old_status, $post) {
    if ('publish' === $new_status && $old_status !== $new_status) {
        $slack_webhook_url = 'YOUR_SLACK_WEBHOOK_URL';
        $post_title = get_the_title($post->ID);
        $post_url = get_permalink($post->ID);
        $message = "新しい記事が公開されました: *<$post_url|$post_title>*";

        wp_remote_post($slack_webhook_url, array(
            'body' => json_encode(array('text' => $message)),
            'method' => 'POST',
            'headers' => array(
                'Content-Type' => 'application/json',
            ),
        ));
    }
}

add_action('transition_post_status', 'notify_slack_on_publish', 10, 3);

タイトルや、URL、オーナーを取得する事が出来るため、十分動作しますが、
カテゴリを取得しようとすると、上手く行きませんでした...

追加:通知にカテゴリ情報を使用したい

transition_post_status タイミングでは、まだ投稿がデータベースに保存されていない為、下書き保存せずに公開したり、カテゴリを変更した直後に公開を行った場合は、カテゴリ情報が取得できず。
※下書き保存してからだと、その保存時のカテゴリは取得できます

これらを解決する方法として、いくつかの情報が見つかりました。

 ・save_post
 ・wp_insert_post

しかし、どちらも新規作成してカテゴリを変更した直後の投稿では、カテゴリを取得する事が出来ませんでした。
調べてみると wp_after_insert_post を使用すると良いという記事を見つけました。

・Get categories from save_post hook
 https://wordpress.stackexchange.com/questions/371224/get-categories-from-save-post-hook

・hook wp_after_insert_post
 https://developer.wordpress.org/reference/hooks/wp_after_insert_post/

カテゴリを利用したければ wp_after_insert_post を利用すれば良いという事ですね。
ただし、このアクションフックでは、前回のステータスがわからない為、公開に切り替わったかどうかの判定を追加する必要があるので、以下を試してみました。

① transition_post_status で、$old_status をメタデータに保存
② wp_after_insert_post で、保存したメタデータと比較して分岐

/**
 * ステータスが変更されたときに前のステータスを保存
 */
function save_old_post_status($new_status, $old_status, $post) {
    if ('post' == $post->post_type) {
        update_post_meta($post->ID, '_old_post_status', $old_status);
    }
}

/**
 * 公開に切り替わった際にSlackへ通知
 */
function notify_slack_on_publish($post_id, $post, $update) {

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if ('post' != $post->post_type) return;

    // 公開に切り替わったかどうか判定
    $post_status = get_post_status($post_id);
    $old_status = get_post_meta($post_id, '_old_post_status', true);
    if ($old_status !== 'publish' && $post_status === 'publish') {
        // 通知処理
        ~~~
    }


    // 後処理として、古いステータスのメタデータを削除する
    delete_post_meta($post_id, '_old_post_status');
}

add_action('transition_post_status', 'save_old_post_status', 10, 3);
add_action('wp_after_insert_post', 'notify_slack_on_publish', 10, 3);

参考リンク

・WordPress アクションフックのタイミング
 https://tech.kurojica.com/archives/45012/

・Get categories from save_post hook
 https://wordpress.stackexchange.com/questions/371224/get-categories-from-save-post-hook

・hook wp_after_insert_post
 https://developer.wordpress.org/reference/hooks/wp_after_insert_post/

・function get_the_terms
 https://developer.wordpress.org/reference/functions/get_the_terms/

-WordPress
-

Copyright© 打ち聞かせ , 2024 All Rights Reserved Powered by STINGER.