公開日:
  • WordPress

Advanced Custom Fieldsの入力値を使って投稿情報を自動更新する

目次

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に記述します。

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に追加します。

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に、次のコードを追加します。

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で公開しています。

松田 拓也
エンジニア

フロントエンドエンジニア。制作会社および事業会社での実務経験を経て、greenciderに参画。コーディングから保守運用まで、WEBサイト制作における実装業務を担当。趣味は読書、登山、野球観戦、美術鑑賞など。