少し前にあった案件について、自分のためにメモしておきます。
WPで「管理画面の投稿一覧でカスタムフィールドを表示させたい」という相談を受けまして。
その時点で既にあちこちを参考にしてfunctions.phpにそれ用のコードが書かれていたのですが…
//my custom field $mcf = get_post_meta($post->id, "my_custom_field", true); echo $mcf; //Arrayと表示される(1つしかない場合はそのアイテム名が表示される)
状態としてはこんな感じ。get_post_metaで該当するカスタムフィールドを取得すると、一部はちゃんと表示されるが、一部は「Array」としか表示されない、と。
複数アイテムをセットできるようにしておいたら、それはまあ配列になりますよねぇ…と思いながらもヒアリングを続けていると…どうやらこのカスタムフィールド、プラグインを使って実装している模様。しかもテストした結果、シリアライズされていると来た!
これは少々面倒なことになってきましたね…と思いつつもコードを捏ね繰り回すことに。あんまり当該環境が分からない上にfunctions.php直接編集なので真っ白になったら大変ですからね…。
- 関数リファレンス/maybe serialize – WordPress Codex 日本語版
- maybe_unserialize:WordPress私的マニュアル
- is_serialized:WordPress私的マニュアル
調べてみたらmaybe_unserializeなんて関数があるのですね。ということで…
$mcf = maybe_unserialize(get_post_meta($post->id, "my_custom_field", true)); //非シリアライズ化され、phpの配列として扱えるようになった foreach($mcf as $key => $value) { //後はループで回して表示させるだけ echo $value; }
だいたいこんな感じ(詳細はメモし忘れたので忘れました。ロジック的にはこんな感じだった)で行けました。
カンマ区切りくらいはしたかったのですが、どうもカウンタの回数が合わなかったようで最後もカンマが付いてしまったので直したかったのですが時間がなかったし表示さえできれば良いということで未検証のまま。
ということで、ロジック部分の概要だけメモしておきます。
必要に応じてis_serializedで判定してループ使わず単独表示かどうか分岐させるもよし。
今回初めてmaybe_unserializeを知ったので、勉強になりました。
…今の自分だったらまずシリアライズされないように設計しますが…それも経験しないと気付けないですからね。