
目次
WordPressの管理画面にカスタムフィールドを追加できるプラグイン「Advanced Custom Fields(ACF)」。ACFを使えば、業務に応じて管理画面を柔軟にカスタマイズできます。
ACFではカスタムフィールドの更新時に独自の処理を加えることも可能です。たとえば、入力された値をもとに投稿タイトルを更新したりタクソノミーを設定したりといった処理が考えられます。
このようなカスタマイズを実現する手段として活用できるのが、ACFが提供するacf/save_post
アクションです。
この記事では、acf/save_post
の基本的な使い方と実務で役立つ具体的な実装例を紹介します。
acf/save_post
でカスタムフィールドの更新時に独自の処理を実行する
カスタムフィールドの更新時に独自の処理を実行するには、ACFが提供するacf/save_post
アクションを利用します。
ACF | acf/save_post
Fires when saving $_POST data.
www.advancedcustomfields.com

基本構文は以下のとおりです。テーマのfunctions.php
に記述します。
// カスタムフィールドの更新後に実行されるadd_action( 'acf/save_post', function ( $post_id ) { // 更新後のフィールドの値を取得する $values = get_fields( $post_id );
// 特定のフィールドの更新後の値を確認する $hero_image = get_field( 'hero_image', $post_id ); if ( $hero_image ) { // 任意の処理 } });
// カスタムフィールドの更新前に実行されるadd_action( 'acf/save_post', function ( $post_id ) { // 更新前のフィールドの値を取得する $prev_values = get_fields( $post_id );
// 新しく入力されたフィールドの値を取得する $values = $_POST['acf'];
// 特定のフィールドの新しく入力された値を確認する if ( isset( $_POST['acf']['field_abc123'] ) ) { // 任意の処理 } }, 5 // 優先度。10未満の数値を指定するとカスタムフィールドの更新前に処理が実行される);
add_action()
の第1引数に'acf/save_post'
を、第2引数に独自の処理を実行する関数を渡します。
デフォルトの設定では、この関数はカスタムフィールドの値が更新されたあとで実行されます。関数内ではget_fields()
やget_field()
を使って、更新後のカスタムフィールドの値を取得し利用できます。
add_action()
の第3引数は優先度です。ここに10
未満の数字を設定すると、カスタムフィールドの更新前に関数が実行されます。この場合、get_fields()
やget_field()
は更新前の値を返します。新しく入力された値は$_POST
から取得する必要があります。
次のセクションでは、カスタムフィールドに入力された日付をもとに投稿タイトルを更新する実装例を紹介します。
実装例①:カスタムフィールドに入力された日付をもとに投稿タイトルを更新する
以下のような仕様を想定します。
- 日付を入力するカスタムフィールド
開催日
がある 開催日
の入力値を利用して、投稿タイトルの先頭に【2025年5月】
といった文言を追加する
投稿タイトルは手動でも変更可能ですが、開催日
の変更に応じて手動で修正するのは更新漏れのリスクがあります。そこで、acf/save_post
アクションを使って開催日
の入力値に応じて投稿タイトルも自動的に更新されるようにしましょう。
カスタムフィールドを以下のとおり設定します。
- ラベル:
開催日
- フィールド名:
event_date
- フィールドタイプ:
日付選択ツール
- 戻り値の形式:
Ymd
次のコードをfunctions.php
に追加します。
add_action( 'acf/save_post', function ( $post_id ) { // event_dateフィールドの値を取得 $event_date = get_field( 'event_date', $post_id );
if ( ! $event_date ) { return; }
// 日付をフォーマット $date = new DateTime( $event_date ); $formatted_date = $date->format( 'Y年n月' );
// 現在の投稿タイトルを取得 $current_title = get_the_title( $post_id );
// タイトルに日付部分があるかチェック if ( preg_match( '/【\d{4}年\d{1,2}月】/', $current_title ) ) { // 既存の日付部分を新しい日付に置換 $new_title = preg_replace( '/【\d{4}年\d{1,2}月】/', '【' . $formatted_date . '】', $current_title ); } else { // 日付部分がない場合は先頭に追加 $new_title = '【' . $formatted_date . '】' . $current_title; }
// 投稿タイトルを更新 wp_update_post( array( 'ID' => $post_id, 'post_title' => $new_title, ) ); },);
このコードでは、開催日
の入力値に応じて投稿保存時に自動的に投稿タイトルを更新します。たとえば開催日
の入力値を2025年5月1日
に更新した場合、投稿タイトルも【2025年5月】〜
に自動で更新されます。
実装例②:カスタムフィールドに入力された日付をもとにタクソノミーを更新する
続いて、カスタムフィールドに入力された日付をもとにタクソノミーを更新する実装例を紹介します。
カスタムフィールドの設定は実装例①と同じで、以下のとおりです。
- ラベル:
開催日
- フィールド名:
event_date
- フィールドタイプ:
日付選択ツール
- 戻り値の形式:
Ymd
さらにカスタムタクソノミーを追加します。設定は以下のとおりです。
- 複数ラベル:
月別
- 単数ラベル:
月別
- タクソノミーキー:
event_month
- 投稿タイプ:
投稿
functions.php
に、次のコードを追加します。
add_action( 'acf/save_post', function ( $post_id ) { // event_dateフィールドの値を取得 $event_date = get_field( 'event_date', $post_id );
if ( ! $event_date ) { return; }
// 日付をフォーマット $date = new DateTime( $event_date ); $formatted_date = $date->format( 'Y年n月' ); $term_slug = $date->format( 'Y-m' );
// event_monthタクソノミーのタームを更新 $term = term_exists( $term_slug, 'event_month' ); if ( ! $term ) { // タームが存在しない場合は作成 $term = wp_insert_term( $formatted_date, 'event_month', array( 'slug' => $term_slug ) ); }
if ( ! is_wp_error( $term ) ) { // タームを設定 wp_set_object_terms( $post_id, $term_slug, 'event_month' ); } });
このコードでは、開催日
の更新後その入力値に応じて投稿に紐づくカスタムタクソノミー月別
のタームを更新します。たとえば、開催日
が2025年5月1日
の場合、投稿を保存すると月別
タクソノミーに2025年5月
が設定されます。開催日
を2025年6月1日
に変更して保存すると、2025年5月
は解除され新たに2025年6月
が設定されます。
このようにacf/save_post
アクションを活用すれば、カスタムフィールドの入力内容に応じて投稿タイトルやタクソノミーを自動で更新できます。
まとめ
acf/save_post
アクションを使うことで、カスタムフィールドの保存タイミングにあわせて任意の処理を実行できる- 入力されたカスタムフィールドの値に基づいて、投稿タイトルやタクソノミーを自動で更新できる
- タイトルやタクソノミーの更新漏れを防ぎ、運用の手間を減らせる仕組みを構築できる
検証環境とサンプルコード
- PHP 8.2.28
- WordPress 6.8.1
- Advanced Custom Fields 6.4.2
今回のサンプルコードはGitHubで公開しています。