WordPressでは、投稿が保存または更新されたタイミングで独自の処理を追加することが可能です。たとえば、特定のカスタムフィールドを自動で設定したり、ログを記録したり、外部APIに通知を送るといった用途に使えます。
save_postアクションフックの概要
投稿の保存時に処理をフックさせるには、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など、より限定されたアクションフックを使うことができます。
function save_custom_post_data($post_id) {
// カスタム処理
}
add_action('save_post_my_post_type', 'save_custom_post_data');
よくある質問(FAQ)
Q. 記事の更新時のみ(新規ではなく)に処理を実行するには?
A. save_postフックでwp_is_post_revision()とwp_is_post_autosave()でスキップ後、post_updated_at(更新日時)が存在するか$post_before->post_statusを確認します。またはpost_updatedアクションフックが更新時のみ発火します。
Q. 記事の特定フィールドが変更された場合にのみ処理を実行するには?
A. post_updatedフックで$post_before(更新前)と$post_after(更新後)を比較します。post_title・post_contentが変化した場合のみ処理するif($post_before->post_title !== $post_after->post_title)のような判定ができます。
Q. 外部APIへの通知を記事公開・更新のたびに送るには?
A. publish_post・post_updatedフックでwp_remote_post()を使って外部APIにリクエストします。失敗した場合のリトライはWP-Cronでスケジュールするか、WP Queueプラグインを使ったキュー処理が信頼性高いです。
まとめ
save_postフックを利用することで、投稿の保存や更新時に柔軟なカスタム処理を追加することができます。カスタムフィールドの自動設定、外部サービスとの連携、管理ログの記録など、運用を自動化・最適化する上で非常に有用な手段です。

