目次
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のacf/save_postアクションを使った投稿情報の自動更新について解説しました。
acf/save_postアクションを使うことで、カスタムフィールドの保存タイミングにあわせて任意の処理を実行できます。今回紹介した実装例のように、入力されたカスタムフィールドの値に基づいて投稿タイトルやタクソノミーを自動で更新するといったことも可能です。
このような仕組みを構築することで、タイトルやタクソノミーの更新漏れを防ぎ運用の手間を大幅に減らせるでしょう。
検証環境とサンプルコード
- PHP 8.2.28
- WordPress 6.8.1
- Advanced Custom Fields 6.4.2
今回のサンプルコードはGitHubで公開しています。
私たちgreenciderは「地域のクリエイティブ・パートナー」です。
スタッフそれぞれの専門スキルや興味関心を生かして、地域課題をクリエイティブの力で解決しています。
制作に関するご相談はお問い合わせフォームよりお気軽にご連絡ください。
また、私たちgreenciderとともに、クリエイティブを通して地域課題や地方創生に取り組みたい方も、ぜひお問い合わせフォームよりご連絡ください。
お問い合わせ|greencider(グリーンサイダー)
制作のご相談や見積もり依頼、その他お問い合わせはお問い合わせフォームよりお気軽にご連絡ください。
greencd.jp