ホームページ制作 SiGT Web Studio (横浜/フリーランス) > Blog > WordPress > [WP]Duplicate Postを使用して複製した記事のカスタムフィールドレコードが無駄に増えていく?

横浜のフリーランスWeb制作者ブログ

2014年 3月 08日

[WP]Duplicate Postを使用して複製した記事のカスタムフィールドレコードが無駄に増えていく?


※現在進行形の問題を、ネットの力を借りて解決したいという思いを込めて書いてます。
Wordpressでカスタムフィールドを使ってサイトを構築する際、私はよくCustom Field Suiteを使用します。今回の問題は、このCustom Field Suiteの使用時に、記事を複製するプラグインDuplicate Postを使用した場合、です。もしかしたら、マルチサイト機能使用時などの特殊な環境下のみで具現化する問題かもしれません。

Duplicate Postを使用しての記事の複製自体は全く問題無く、カスタムフィールドの値も全てワンクリックで複製されます。素晴らしいです。しかし、複製後の記事のカスタムフィールドを編集すると…ちょっと変な現象に出くわします。

編集した後に、シングルページなど「$cfs->get(‘key’);」が使用できるページでは更新した通りの内容が表示されて何ら問題はありません。が。例えばマルチサイトで「switch_to_blog();」を使って他のサイトの情報を呼び出す際は「$cfs->get」が動作しないので、代わりに「get_post_meta($post->ID, ‘key’, true)」を使います。すると、更新されたはずのデータが複製当時のまま表示されるという現象に遭遇します。画像の場合、消去しているはずなのに、複製直後の画像が表示されます。ちょっと気持ち悪いです。

データベースを調べてみると、テーブル「_postmeta」内に、同一の「post_id」+「meta_key」が複数登録されていることが解ります。複製前の記事ではこの現象は起こりません。つまり、複製前の記事だと「_postmeta」の内容は上書きされ、複製後の記事だと上書きされずに更新の度に新規追加されていく…という事のようです。文章での説明がなかなか難しくてすみません。

おそらくは、複製時に作成される、各データの関連を司っている「_cfs_values」に記録される値の何かがおかしいのだと思いますが、じっくり調査する時間も無く…。

現在、対応策として「get_post_meta($post->ID, ‘key’, true)」で呼び出して問題になっている箇所を「get_post_meta($post->ID, ‘key’, false)」として複数のレコードを配列で呼び出し、配列の最後の値を最終更新値として使用しています。コードで示すと

1
2
3
  $value = get_post_meta($post->ID, 'key', false);
  $value = end($value);
  echo $value;

こんな感じ。

「$cfs->get」が使える場合、この命令はちゃんと最終更新値を取得して来ますので、「$cfs->get」だけで問題なく運用できている場合は気づきにくい問題だと思います。しかし、Duplicate Postを使用して複製→編集を繰り返している場合、データベースには好ましくない亡霊化したレコードがどんどん蓄積されて行っている可能性は高そうです。これをスッキリ解決できるノウハウ、どこかに無いかなあ。

Posted: 2014年 3月 08日 15:26

Tagged with


Categories: WordPress

Comments: 1 comment


トラックバックURL

コメント & トラックバック

[…] 以前、[WP]Duplicate Postを使用して複製した記事のカスタムフィールドレコードが無駄に増えていく?というエントリーで書いた、Custom Field Suite + Duplicate Postの組み合わせで起きる問題が解 […]

コメント





コメント本文に次の(X)HTMLタグを使えます:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Gravatarに登録されているアバターを使用します。

Additional comments powered byBackType