WordPressでは、投稿が保存または更新されたタイミングで独自の処理を追加することが可能です。たとえば、特定のカスタムフィールドを自動で設定したり、ログを記録したり、外部APIに通知を送るといった用途に使えます。
save_postアクションフックの概要
投稿の保存時に処理をフックさせるには、save_postアクションを利用します。このフックは、投稿が新規保存されたときや、既存の投稿が更新されたときに呼び出されます。
基本的な書き方は以下の通りです。
functions.php:save_postの基本形
function my_custom_save_post($post_id) {
// 自動保存やリビジョンの保存時はスキップ
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// 投稿タイプを制限(例:post のみ)
if (get_post_type($post_id) !== 'post') {
return;
}
// カスタム処理をここに記述
// 例:カスタムフィールドを自動追加
update_post_meta($post_id, 'my_custom_field', '保存時に自動設定される値');
}
add_action('save_post', 'my_custom_save_post');
投稿タイプごとに処理を切り替える
get_post_type()を使えば、処理対象を特定の投稿タイプ(例:custom_post_type)に限定できます。
投稿タイプによる分岐
if (get_post_type($post_id) === 'custom_post_type') {
// カスタム投稿タイプ用の処理
}
ユーザー権限のチェックも可能
投稿の更新を行うユーザーが適切な権限を持っているかどうかをチェックすることもできます。
権限チェック
if (!current_user_can('edit_post', $post_id)) {
return;
}
save_post_{$post_type} を使ってより限定的に処理する
特定の投稿タイプに対してのみ処理を追加したい場合、save_post_postやsave_post_custom_post_typeなど、より限定されたアクションフックを使うことができます。
functions.php:投稿タイプ限定フック
function save_custom_post_data($post_id) {
// 自動保存時はスキップ
// (投稿タイプ限定フックはリビジョンでは発火しないが、
// 新規投稿の下書き段階でのオートセーブでは発火するため必要)
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// カスタム処理
}
add_action('save_post_my_post_type', 'save_custom_post_data');
投稿タイプ限定フックでもDOING_AUTOSAVEガードは必要
save_post_{$post_type}はそのタイプの投稿にしか発火しないため、post_type=’revision’であるリビジョンの保存では発火しません。しかし、新規のカスタム投稿タイプの投稿がまだ下書き段階のとき、ブラウザの定期オートセーブによって作成される投稿行に対しては発火します。外部API通知のような副作用のある処理をそのまま書くと、ユーザーがまだ書き終えていない下書き中に約60秒おきに誤って繰り返し実行されてしまうため、DOING_AUTOSAVEのチェックは省略せず必ず入れてください。よくある質問(FAQ)
Q記事の更新時のみ(新規ではなく)に処理を実行するには?
Apost_updatedアクションフックを使うと、更新時のみ(新規挿入時は発火せず)処理を実行できます。save_postを使う場合はwp_is_post_revision()でリビジョンをスキップしたうえで、引数で渡される更新前後のpost_status等を比較して判定します。
Q記事の特定フィールドが変更された場合にのみ処理を実行するには?
Apost_updatedフックで$post_before(更新前)と$post_after(更新後)を比較します。post_title・post_contentが変化した場合のみ処理するif($post_before->post_title !== $post_after->post_title)のような判定ができます。
Q外部APIへの通知を記事公開・更新のたびに送るには?
Apublish_post・post_updatedフックでwp_remote_post()を使って外部APIにリクエストします。失敗した場合のリトライはWP-Cronでスケジュールするか、WP Queueプラグインを使ったキュー処理が信頼性高いです。
まとめ
save_postフックを利用することで、投稿の保存や更新時に柔軟なカスタム処理を追加することができます。カスタムフィールドの自動設定、外部サービスとの連携、管理ログの記録など、運用を自動化・最適化する上で非常に有用な手段です。投稿タイプ限定フックを使う場合でも、オートセーブ対策は忘れずに行いましょう。

