Custom Field SuiteとDuplicate Postを併用したときにトラブった話

はじめてのCustom Field SuiteとAdvanced Custom Fieldsの問題点

はじめてカスタムフィールドのテンプレートプラグインの新星「Custom Field Suite(以下CFS)」を利用してみました。
現在カスタムフィールドをテンプレート化するプラグインの一番人気はなんといっても「Advanced Custom Fields(以下ACF)」なのですが、ACFにはちょっとややこしい問題がありました。

Advanced Custom Fieldsプラグインを使う際の注意点など | notnil creation weblog

ひとつのキーに対して複数の値(value)をもたせると、通常ならばキーの重複が許されるため、同じキーで複数のデータが保存されるはずなのですが、これをシリアライズして格納するということです。単に値を出力するだけなら問題はありませんが、例えばクエリを回す際に「meta_value」を使ってなんらかの処理をする場合に正しく動かすことができません。また、ACFの開発が将来止まってしまった場合、その値の形式が独自のものであると、いろいろ不都合がありそうです。

これを避けるためにWordPress標準のカスタムフィールドと同じデータの持ち方をして、かつACFと同等の拡張性・将来性があるという「Custom Field Suite」の導入を決めたわけです。

前評判通り、カスタムフィールドのテンプレ化作業はやりやすく、オプションはACFほどの多機能ではないながらも十分豊富です。なにより標準で繰り返しフィールドが使えるのはとても嬉しい(ACFの場合は有料アドオンが必要)。

しかし、問題はまさに「meta_value」を利用している時に起こりました。

Custom Field Suiteでmeta_queryが正しく動作しない!

イベントを紹介するサイトの場合よくあるのが「カスタムフィールドでイベント日時を入力させ、そのイベント日時に従ってソートをおこなう」ですとか「現在の日時より過去の記事は出力しない」といった処理ですね。

こうしたクエリを回すときに活躍するのが「meta_query」とくに「meta_value」や「meta_compare」といったパラメータです。これはカスタムフィールドのキーから値をとってきて、その値をもとに記事を検索するときに用いられます。

これがまったく正しく動作しないのです。

おかしいなと思ってイベント日時を指すキー「ev_date」の値を調べてみるとなんと。その値はなぜか複数の値になっていました。

ev_dateが重複しているキャプチャ
テンプレート上ではひとつしか値を持っていないはずの「ev_date」が複数量産されていた

しかもその値も一見メチャクチャ。なんだこれは? と思って色々な方に聞いてみると分かってきました。

Custom Field Suite + Duplicate Postで起こる不具合

そう、プラグイン「Duplocate Post」が一枚噛んでいたのです。このDuplicate Post、記事をカスタムフィールドも含めてまるっと複製できてしまう大変便利なプラグインなのですが、これがいろいろと悪さをするようです。

クエリを回す前に私は記事を「Duplicate Post」を使って複製しまくっていました。そして、記事を複製した時にカスタムフィールドはそのまま複製されるわけではなく、重複して作成されていることを発見したのです。

説明しづらいのですが…

記事Aのev_dateが「2014-07-11」であるとした場合、これを複製した記事Bのev_dateは、記事複製時点で2つに増えており、ev_dateが「201407-11」とするキーと値のセットが重複して存在している状態になっていたのです。これをCFSのテンプレートから正しい日時にしても、修正されるのは一方だけ。そして複製を繰り返していくごとに重複するフィールドは増えていく…という不具合です。

また「meta_query」でクエリを回した時に読み取られるのは配列上番号が若いものであるため複製前のオリジナル記事の値がそのまま参照されて正しいソートが行われていなかった、ということです。

その後、このバグは修正されました

これについて菱川拓郎(ノットニル・クリエイティブコンクリートファイブジャパン株式会社)さんが調査検証をされ、CFS側がDuplicate Postsによる記事複製時にメタデータをコピーすると同時に、フィールドまで複製してしまっていることを確認され、修正の上CFS作者さんにプルリクエストを送信されました。

Fix bug: unexpected duplicate postmeta data by hissy · Pull Request #208 · mgibbs189/custom-field-suite

その後の8月21日、菱川さんのプルリクエストを受けて、CFS2.3.6ではこのバグは修正されたことを確認しました。

ということで、もうCFSとDuplicate Postは併用してもよくなったんだ、ということでこの投稿を締めます。
本当は1ヶ月前に投稿するつもりだったのに、検証が後手後手になったり仕事が忙しくなったりで、結局解決した問題をレポートする記事になってしまいました。しかし、Facebookなどでたくさんこの問題にコミットしていただいた皆さまへの遅い御礼の意味も込めて、この記事を公開してます。

蛇足

関係ないことだけど、Facebookは友達関係のよしみもあって悩みを書き込むと結構親身になって付き合ってくれる方が多くいらっしゃいます。そこで問題が解決してよかったー、となることも多いのですが、どうせならこうして公の場にみなさんの善意の結果を残したほうがいいんだろうと思います。たくさんの困っている人に有用な情報、facebook.comの中に閉じ込めて置くのはもったいないよ! そう思って書きました。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください