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/