カスタムフィールドを使用するプラグインは、場合によってキー&値のセットが複製されることがあるようです。
WordPress 2.6.x “Duplicate Custom Field” Issue alexking.org (2008/9/6)
2.6から備わった「Post Revisions」機能による影響のようですが、使用するプラグインが、記事を保存する時に実行されるsave_postというフックが持つ2つのパラメータの内、$postではなく$post_idを使っている場合に複製される問題が起きるようです。
記事のリビジョンは、リビジョン自体がオリジナルの記事とは別の$post_idを持っています。そしてそのリビジョンを保存する時に、オリジナルの記事を保存する時と同じsave_postというフックが実行されるため、$post_idというパラメーターを参照した時に「リビジョンの」$post_idを読み、結果「カスタムフィールドが未登録」と判断されて、追加されてしまうようです。
保存後その記事の編集画面を開くと、オリジナル記事に保存されたカスタムフィールドと各リビジョンに保存されたカスタムフィールドが同時に表示され、ダブって表示された状態になります。
—
MT形式のインポート機能をカスタマイズして、エクセルから複数のカスタムフィールドを持つ大量の記事をインポートしていたところ、いくつかの記事でこの「カスタムフィールドが複製される」現象が確認され、原因を調べ始めたところでした。しかしどのタイミングで複製されたのかはっきりわかっていないんです。WP上で記事を再編集しても複製されるわけではありません。インポートに失敗した時なのか。カスタムフィールド追加の部分のコードの書き方が悪いのか?
—
この問題を抱えるプラグインの、とりあえずの解決方法として、以下のような方法が提示されています。
add_action('save_post', '(関数名)', 1, 2);
save_postフックの$post_idだけじゃなく$postというパラメーターも利用できるようにして、
カスタムフィールドを追記する部分の関数の先頭で、
if ($post->post_type == ‘revision’) {
return;
}
(従来のコード)
「もし(保存しようとしている記事が)リビジョンだったら何もしない」と付け加える。2.6以降、オリジナル記事ではなくリビジョンの場合はpost_typeに「revision」という値も持つようになったのでそれで判断できるようです。
タグ: 2.6, Post Revisions, WordPress, バグ
コメント/質問お待ちしています