スタッフブログ
2016.9.27
Advanced Custom Fieldsで設定した選択肢を無理やり取り出してみる
こんにちは。ウェブクリエイターの中井です。
以前、Advanced Custom Filds(以下ACF)について失敗してきたことについて書きましたが
今回は自分が普段ACFでできたらいいのに…と思っていたことについて挑戦したことを書いてみます。
それでは…ACFで設定した選択肢などを無理やり取り出してみる!です。
ACFでカスタムフィールド設定はどんな風に登録されているのか
そもそも、ACFで設定しているカスタムフィールドはどのようにWordPressに登録されているのか。
データベースの状態を確認しながら見ていくことにしましょう。
まずは、まっさらなWordPressにACFを入れただけの状態です。
ここにフィールドグループ、カスタムフィールドを登録していきます。
テストで登録したフィールドグループに【テキスト】【画像】【セレクト】というフィールドを作ってそれぞれ名前と同じフィールドタイプにしています。
【セレクト】には選択肢1~3の選択肢を設定しました。
ACFではフィールドグループを一括りとしてカスタムフィールドの適用範囲を決めることができますが実際ににデータベース上ではどう紐づいているのでしょうか。
はたしてカスタムフィールドはデータベース上ではどうなっているのか
登録が完了したので実際に登録されている情報を確認するためにデータベースをのぞいてみます。
phpmyadminを利用してwp_posts(記事情報が一元管理されているテーブル)を必要な情報だけ抽出して表示させています。
この情報をよく見てみると、各記事のpost_typeがacf-field-groupとacf-fieldになっているので、フィールドグループもカスタムフィールドも一つずつ記事として管理されているようです。
ここには表示していませんがカスタムフィールドの情報が登録されている各記事のpost_parentにフィールドグループの記事IDが格納されているようです。
他の情報にも注目してみます。
通常の投稿では抜粋が登録されるpost_excerptにフィールド名、スラッグ名が入るpost_nameにはACF独自のID、記事内容が入るpost_contentにはシリアライズ化された文字列が登録されています
このシリアライズ化された部分に今回やりたいことの秘密が隠されていそうです。
今度は、今回やりたいACFで設定した選択肢を出力する、に関連する【セレクト】の詳細情報を見てみます。
post_contentを見てみると…ありました! 選択肢1~3の文字を発見!
この記事の情報を取得してやると今回したいことは実現できそうです。
いよいよACFで設定した選択肢などを無理やり取り出してみる!
ここまでわかれば、あとは速いです。
とりあえず、これまで調査してきたことを参考に書いたコードがこちら
<?php
//1) 記事タイトルから記事情報取得
$post = get_page_by_title( 'フィールド【セレクト】', 'OBJECT', 'acf-field' );
//2) 取得した記事情報からpost_contentだけを取り出す
$post_content = $post->post_content;
//3) シリアル化されたものを非シリアル化
$unserialize = maybe_unserialize( $post_content );
//4) select要素の選択肢の部分のみ取り出す
$select = $unserialize[ 'choices' ];
//5) 配列を一覧として出力
if( $select ) :
?>
<ul>
<?php foreach( $select as $val ): ?>
<li><?php echo $val; ?><⁄li>
<?php endforeach; ?>
<⁄ul>
<?php endif; ?>
出力結果はこちら
1)で記事タイトルから記事情報を取得する行は記事IDを利用できる関数でも取得できますが、サイトを移行したときにIDが降りなおされた場合への対処と、後で見た自分や他の制作者が見たときにやっているこがわかりづらいため記事タイトルを利用しています。
今回の肝は3)のシリアル化されたものを非シリアル化なんですが、これがわかるまでは、シリアル化した文字列から地道にexplodeで取得したい文字列を制限して利用していました。
ちなみに、3)で取得できた変数の出力結果はこちらです。
まとめ
いかがでしょうか。この手法を利用することで、ファイルに直接選択肢を書かなくてもよくなったり、選択肢の増加・修正があったりしても修正箇所が1か所で済むなどのメリットがあります。
ACFのデータの持ち方を巡っては、検索には適さなかったり、get_fieldを利用しない場合は値の取得方法が煩雑になるなど、もともと柔軟性の高いプラグインではあるのですが、少し変わったことをしようとするのが困難な面はあるようです。
そういった面があったとしても、サイトを提供する際に使いやすい管理画面を用意できることはかなりのプラスになっているので、もっと便利に使える方法を前向きに検討していきたいものです。