acf
WordPressでカスタムフィールドを使うとなると、超有名plugin『ACF(Advanced Custom Fields)』を使われる方が多いと思います。使い込むと色々難あり、とか言われますが、一度使い始めるとなかなか手放せません。

で、このACFには有料のACF PROがあって、繰り返しフィールドをはじめとした複数のオマケ付きなのですが、自分は、このPROバージョンの最大の利点はバリデーションフックがあるところだと思っていて、これを使うと、『必須か、否か』以上の複雑なバリデーションが簡単に実現出来ます。これで、『仕様です』や『運用カバー』などの黒魔術を使わなくて済むかもしれませんw

ということで、まずは、簡単な例として、選択した日付が『過去ならNG』にチャレンジ。

ACFのドキュメントをみてみる

ACFはドキュメントが充実していて分かりやすいのも魅力の一つです。
今回使うのは、PRO版(v5.x)から追加されているacf/validate_value
フィールド毎に

add_filter(‘acf/validate_value/name=フィールド名’, ‘自作関数’, 10, 4);

とすればいいだけだから簡単そうですね。

簡単なサンプルコードを作ってみる

では、サンプルとして、イベント登録のイメージで以下のようなACFのフィールドグループを作ってみました。『終了日』は指定が無い可能性もある、という想定で、フィールド『開始日』だけ必須にしておきます。

acf_group_setting

ここで、フィールド『開始日』に、『過去の日付が選ばれたらNG』というバリデーションを追加してみます。
いつものように、以下のコードをfunctions.php、もしくは、新規pluginに仕込みます。
フックから


/**
* 『開始日』が過去ならNG
*/
function check_start_date( $valid, $value, $field, $input ){
//ACFのお作法なのでそのままに
if( !$valid ) {
return $valid;
}
//入力された日付が今日より過去ならNG ※日本時間にするにはdate_i18nを使う
if ( strtotime($value) < strtotime( date_i18n('Y/m/d') ) ) { return '今日よりの先の日付を入力してください'; } //残りはOKな場合 return $valid; } add_filter('acf/validate_value/name=start_date', 'check_start_date', 10, 4); [/php] ドキュメントのサンプルを数行書き換えただけで出来ました。独自コードは3行のみ。 実際のエラー画面はこんな感じ。error_sample

ACFの仕様でつまづくw

この勢いで、『終了日』が指定されているときは『開始日』よりも過去だったらNGに、というバリデーションも追加!と、思いきや、acf/validate_value/name=フィールド名 のフックで参照出来るのは、『name=フィールド名』で指定したフィールドの値だけです…さて、どうしましょう。

送信された『終了日』を$_POSTから取得して比較すればいいだけじゃん、と思うのですが、ACFでは、inputタグのnameのところにACFが内部的にもっているIDが使われています。実際にブラウザで『終了日』のinput部分のhtmlを見てみると以下のようになっています。

<input id="acf-field_55a226e425841" class="input-alt" type="hidden" name="acf&#91;field_55a226e425841&#93;" value="20150701">

『field_55a226e425841』の部分は、フィールドを作成した時点でACFが決定するので、これを固定してプログラムに書込んでしまった後に、フィールドを再度作成したりすると数字部分の値が変わってしまい、入力値が取得出来なくなります。

このinputタグの親の親の親のdivタグの属性に『data-name=”end_date”』という属性が仕込まれていますが、javascriptを使ってそれなりにゴニョゴニョしないと、$_POSTに『field_55a226e425841はend_dateのことですよ〜』という情報を含める事は出来ません。それに、これだけの為にjavascriptを使うのも…

そして、ここで『運用カバー』を唱えるのは、負けの気がするw

ということで、この『field_55a226e425841』を取得する為に、DBの中に探検に出る事にします。

ACF PROで複数のfieldを絡めたバリデーション(後編)に続く。

※作成から2年前(803日経過)の記事です。内容が古い可能性があります。
東京都東日本橋の株式会社プレスマンPRESSMAN*Tech