2025.5.10
  • WordPress

Advanced Custom Fieldsでカスタムバリデーションを実装する

WordPressの管理画面に独自の入力欄を追加したいときに便利なのが、プラグイン「Advanced Custom Fields(ACF)」です。テキスト・日付・画像・セレクトボックスなどのカスタムフィールドを簡単に設置でき、業務に合わせた管理画面を構築できます。

ただし、自由に入力できるだけでは操作ミスや不整合が起こりやすくなります。便利なカスタムフィールドも、正しく入力されなければ意味がありません。

そこで重要になるのがバリデーション(入力チェック)です。この記事では、ACFの標準機能に加えて柔軟な制御が可能な「カスタムバリデーション」の実装方法をコードとともに紹介します。

標準バリデーションでできること

ACFでは、各フィールドに次のようなバリデーション機能を設定できます。

  • 必須チェック(空欄を許可しない)
  • 文字数制限(最小・最大文字数)
  • 形式チェック(メールアドレス、URLなど)
  • 数値の範囲チェック(最小値・最大値)
  • ファイルの種類・サイズ制限(画像やPDFなど)

これらはフィールド編集画面の「検証」タブから設定できます。

形式チェックなど一部のバリデーションはフィールドタイプに応じて自動で適用されます。バリデーションに通らなければ投稿の公開や更新はできず、入力欄にエラーメッセージが表示されます。

多くの場合は標準バリデーションで十分ですが、「過去の日付はエラーにする」といった条件には対応できません。

acf/validate_valueで独自ルールを追加する

標準バリデーションで対応できない条件をチェックするには、ACFが提供するacf/validate_valueフィルターフックを利用します。

投稿の保存直前に、定義したバリデーション関数が実行されます。条件を満たせば保存が続行され、失敗すれば処理は中断されてエラーメッセージが表示されます。

カスタムバリデーションの基本構文は以下のとおりです。

functions.php
add_filter(
// 'acf/validate_value/name=...' の部分で対象フィールドを指定(name=の代わりにkey=やtype=も使える)
'acf/validate_value/name=フィールド名',
function ( $valid, $value, $field, $input ) {
// $valid: 現在のバリデーション結果(trueまたはエラーメッセージ)
// $value: フィールドに入力された値
// $field: 対象フィールドの設定情報(ラベル、タイプなど)
// $input: フォーム上のname属性。POSTデータの識別に使える
// 条件に応じてtrueまたはエラーメッセージを返す
return $valid;
},
10,
4
);

バリデーションに失敗すると、投稿画面にエラーメッセージが表示されます。

これにより、次のような柔軟なチェックが可能になります。

  • 入力値が指定フォーマットに一致しているか
  • 他のフィールドとの値の比較(例:開始日 < 終了日)
  • 複数の選択肢が選ばれているか(例:最低1件以上を必須にする)

次のセクションでは、「未来の日付しか選べないようにする」バリデーションの実装例を紹介します。

実装例①:締切日が現在より未来であることをチェック

イベント申し込みフォームなどで「締切日」を設定する場合は、その日付が今日より未来でなければなりません。この条件を満たすために、カスタムバリデーションを使ってサーバー側でチェックします。

カスタムフィールドの設定は以下のとおりです。

  • ラベル:締切日
  • フィールド名:deadline
  • フィールドタイプ:日時選択ツール

このままだと過去の日付も選択できてしまうため、次のようなコードをfunctions.phpに追加します。

functions.php
add_filter(
'acf/validate_value/name=deadline', // バリデーションを適用するフィールド名を指定
function ( $valid, $value ) {
// 既にバリデーションが失敗している場合は、その結果をそのまま返す
if ( ! $valid ) {
return $valid;
}
// 入力された日付が現在より未来の日付であるかをチェック
return new DateTime() < new DateTime( $value )
? $valid
: '締切日は現在より未来の日付を選択してください。';
},
10,
4
);

このコードでは、deadlineフィールドに入力された日付が現在よりも未来かどうかをDateTimeで比較しています。過去の日付であれば、エラーメッセージを返してバリデーションエラーとします。

このようにカスタムバリデーションを活用することで、ユーザーの入力ミスを防ぎ正しい情報だけが保存されるように制御できます。

実装例②:開始日と終了日の前後関係をチェック

次に、2つの日付フィールドの前後関係をチェックするケースを紹介します。ここでは「開始日」と「終了日」という2つのカスタムフィールドを使用します。

カスタムフィールドの設定は以下のとおりです。

  • ラベル:開始日
  • フィールド名:start_date
  • フィールドタイプ:日付選択ツール
  • ラベル:終了日
  • フィールド名:end_date
  • フィールドタイプ:日付選択ツール

functions.phpに、end_dateフィールドのバリデーション処理を追加します。

functions.php
add_filter(
'acf/validate_value/name=end_date',
function ( $valid, $value ) {
// 既にバリデーションが失敗している場合は、その結果をそのまま返す
if ( ! $valid ) {
return $valid;
}
// POSTデータから開始日を取得
$post_id = isset( $_POST['post_id'] ) ? absint( $_POST['post_id'] ) : 0;
$start_date_field = get_field_object( 'start_date', $post_id );
$start_date_key = $start_date_field['key'] ?? null;
$start_date = isset( $_POST['acf'][ $start_date_key ] ) ? sanitize_text_field( wp_unslash( $_POST['acf'][ $start_date_key ] ) ) : null;
// 開始日が存在し、かつ終了日が開始日より後の日付であるかをチェック
return $start_date && new DateTime( $start_date ) < new DateTime( $value )
? $valid
: '終了日は開始日より後の日付を選択してください。';
},
10,
4
);

ここではend_dateの値は$valueとして渡されますが、start_date$_POST['acf']から取得する必要があります。専用関数はないため、get_field_object()でフィールドキーを取得し配列から値を取り出しています。

2つの値をDateTimeで比較し、終了日が開始日以前であればエラーメッセージを返すようにしています。

このように開始日と終了日のような複数フィールド間の関係も、カスタムバリデーションを使えば柔軟にチェックできます。応用すれば数値の整合性や条件付き入力制御など、実務に即したバリデーションも実現可能です。

まとめ

  • acf/validate_valueフィルターで独自ルールを定義できる
  • 単体の値だけでなく、複数フィールド間の関係もチェックできる
  • バリデーションに失敗した場合は投稿が保存されず該当フィールドにエラーメッセージが表示される

なお、acf/validate_valueの詳細はACF公式ドキュメントも参照してください。

検証環境とサンプルコード

  • PHP 8.2.28
  • WordPress 6.8.1
  • Advanced Custom Fields 6.4.0.1

今回のサンプルコードはGitHubで公開しています。

松田 拓也
エンジニア

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