【WordPress】カスタムフィールドの更新時間について
バシャログ。アドベントカレンダー3日目、yamashitaがお届けします。
今回は技術記事とオススメしたいものの企画記事、どちらか順番は自由に二つの記事を書くことになってますが、技術記事から書きたいと思います。
前回はおかしなテンションで書いた結果、社内で正気かと疑われたので様子を見たいと思います。
ちなみに前回紹介した時屋はコンセプト毎に店舗を拡大してるので皆様是非食べてください。
さて、この記事ではWordPressのカスタムフィールドを含めた投稿の更新時間を取得する方法を考えたいと思います。
流れは以下の通りです。
- なぜ取得する必要がある?
- カスタムフィールドの更新時間を保存する方法
- カスタムフィールドの更新時間を取得する方法
- まとめ
なぜ取得する必要がある?
経緯としては、投稿を管理画面以外からも更新するシステムを作っていました。
その際に投稿本体を更新せずにカスタムフィールドのみを更新する場合もあります。
他の画面でその更新時間を取得することになったですが、更新時間は本体を更新した時間になってました
update_post_meta()やACFのupdate_field()でカスタムフィールドだけ更新しても投稿の更新時間は変わりません。
そのために、カスタムフィールドだけ更新された場合にも更新時間を設けようと思いました。
カスタムフィールドの更新時間を保存する方法
updated_postmetaフックを利用します。
// メタ情報が更新されたら起動
add_action("updated_postmeta", "update_meta_modified",10,4);
function update_meta_modified($meta_id, $object_id, $meta_key, $meta_value){
// 環境によってはgmtが反映されてしまう時があるので念のため日本時間に設定
date_default_timezone_set('Asia/Tokyo');
// 任意のフォーマットに設定
$nowDate = date("Y-m-d H:i:s");
// ACFを使ってるのでupdate_fieldで確認しました。任意でupdate_post_metaに変更してください。
update_field("meta_modified_date", $nowDate, $post->ID);
}
その他必要そうな処理
上記のままだと全ての投稿、メタ情報で更新されてしまいます。 そのため、必要のない投稿では更新時間を更新しないように条件で弾く必要があります。 引数でカスタムフィールドの情報も取得できるため、それを基に条件を設定しましょう。
// メタ情報が更新されたら起動
add_action("updated_postmeta", "update_meta_modified",10,4);
function update_meta_modified($meta_id, $object_id, $meta_key, $meta_value){
// 投稿タイプによっては更新が不要だったり
if ($post->post_type !== "test") {
return;
}
// カスタムフィールドによっても更新が不要の場合はリターンしてしまう。
if ($meta_key !== "test") {
return;
}
// 環境によってはgmtが反映されてしまう時があるので念のため日本時間に設定
date_default_timezone_set('Asia/Tokyo');
// 任意のフォーマットに設定
$nowDate = date("Y-m-d H:i:s");
// ACFを使ってるのでupdate_fieldで確認しました。任意でupdate_post_metaに変更してください。
update_field("meta_modified_date", $nowDate, $post->ID);
}
カスタムフィールドの更新時間を取得する方法
更新時間自体もカスタムフィールドなのでget_postmeta()やget_field()で取得します。 その後に投稿の更新時間とカスタムフィールドの更新時間を比較してより最近の日時の方を採用します。
まとめ
フック便利ですね。
これでカスタムフィールドの更新時間を取得できるようになったので、
「あれ?投稿更新したのに更新時間が変わらない」なんてことがなくなると思います。
せっかくの企画なので普段使わない言語とか試してみようと思ったのですが、記事になりそうな事があったのでいつも通りWordPressでした。
明日はfujiharaです。どんな記事になるか楽しみですね。
以上