カスタムフィールドの管理にとても便利な「Custom Field Suite」。またお客様からほぼ必ずと言って良いほどご要望の多い『記事を複製する』機能を提供する「Duplicate Post」。WordPressにおいてどちらも使用頻度は高いのですが、これを共存させようとすると問題が。それもかなり「深刻な」問題です。。
具体的には、「Duplicate Post」を使用して生成(複製)された記事を編集し、登録すると、複製前のカスタムフィールド値がDB上に残るというもの。しかも、それ以降更新をすればするほどカスタムフィールドの重複データが増えていくという。。
それでも、CFS()->getで取得・表示する分には問題は発生しません。なぜか?データ(カスタムフィールド値)は最新のものがちゃんと表示されます。問題は、カスタムフィールド値を検索対象にしたクエリを実行した場合に発生します。例えば、「都道府県」というカスタムフィールドに「東京都」とあるものを一覧表示する、という場合、最新データが「東京都」ではなくても(例えば、「千葉県」)、複製元のデータが「東京都」だった場合には「千葉県」のものもヒットしてしまいます。
この問題、結構古くから認識されていて、一部情報では「Custom Field Suite」側で対応(解決)した、なんてのも検索でヒットするのですが、実は解決していないように思います(2020.01現在)。
たまたま他の問題でWordPressをいじっている時に、「強引だけどこうすれば…」と思いつき、実際にテストして問題を解決したのが以下の方法。
下記ソースをfunctions.phpに追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function update_customfield( $post_id, $post) { $types = array( 'xxxx' // カスタム投稿タイプを設定 ); if (!in_array($post->post_type, $types) || $post->post_status == 'auto-draft') return; $field_data = CFS()->get( false, $post_id, array( 'format' => 'raw' ) ); if ( is_array( $field_data ) ) { foreach ( $field_data as $key => $value ) { delete_post_meta( $post_id, $key ); } } $post_data = array( 'ID' => $post_id ); CFS()->save( $field_data, $post_data ); return; } add_action( 'save_post', 'update_customfield',10,2); |
もし既に運用していて、問題が発生しているページがある場合には、それらのページを全て更新してみてください。多分、直る筈。あまりにも問題のある件数が多い場合には、、それも、上記を参考に全件同じ処理を行えば、きっと解決できる筈。(※くれぐれも自己責任でお願いします!)