update_post_metaでカスタムフィールドを更新しても、検索結果が変化しないのはキャッシュが原因

update_post_metaファンクションを使うと、記事のカスタムフィールドの値をプログラムによって書き換えることができます。

update_post_meta

そしてカスタムフィールドは、WP_Queryなどで検索をするとき、meta_queryパラメーターで絞り込みをする事ができます。

WP_Query

今回、この2つの処理を組み合わせて、検索結果を表示した後、カスタムフィールドの値に変化を加えて、検索結果を変更するというプログラムを作成したのですが、ここでトラブルが発生しました。

カスタムフィールドを変化させても検索結果が変化しない

カスタムフィールドの内容を変更して検索結果を表示すると、当然ながら結果に変化が現れることを期待します。しかし、プログラムを実際に制作して動作させたところ、検索結果が変化しません。

カスタムフィールドの値がうまく反映できていないのかと調べてみると、確かに変更されている。では、データベースに反映されていないのかと直接確認しても変化しています。

では、検索条件が間違えているのかと調べてみると、こちらもうまくいっている。ということで、原因が掴めません。がしかし、結果が変化する瞬間がありました。

投稿の内容を保存すると更新される

カスタムフィールドの値を変化させても、検索結果が変化しなかったのですが、そのままその記事を編集画面で編集して保存すると、なんと検索結果が変化しました。これで原因が分かりました。「投稿画面で投稿を保存しないと、検索結果の内容がキャッシュされた状態になる」という事だったのです。

カスタムフィールドとタクソノミーの変更はキャッシュされる

どうやら、カスタムフィールドの内容とタクソノミーの内容は、プログラムで変更しても検索結果がキャッシュされているため、そのままでは変化しないようでした。meta_queryの項目にも、キャッシュに関するパラメーターが存在しています。

Caching Parameters

しかし、実際に筆者が試したところ、なにか間違えているのかうまくキャッシュがコントロールできません。試行錯誤しましたが諦めて、別の手段で修理・復旧しました。

wp_update_postで投稿を保存で解決

カスタムフィールドの内容を変更してもキャッシュが変わらないため、その直後にwp_update_postファンクションを使って、強制的に投稿の内容を変更することにしました。プログラムとしては、次のようになります。

global $post;
update_post_meta(get_the_ID(), 'key', 'value');
wp_update_post($post);

これで無事に検索結果が変化しました。