將 ACF 的日期時間使用 UNIX 時間儲存

在處理一個現有系統轉移的時候,因為之前是使用 UNIX 時間格式來儲存資料,轉換到使用 Advanced Custom Fields ( 以下稱 ACF ) 為基礎系統的時候,決定要繼續使用 UNIX 時間格式,這樣才不用改太多東西。

但是 ACF 對於日期或是日期時間欄位並不是使用 UNIX 時間格式來儲存時間,所以就要動手調整達成目標啦。

首先處理資料儲存的問題,透過以下的調整,就可以將日期或是日期時間的儲存內容,調整為 UNIX 時間格式。
如果是日期的情況下,會將時間調整為當日的零時。

add_filter('acf/update_value/type=date_picker', 'acf_time_to_unixtime', 10, 3);
add_filter('acf/update_value/type=date_time_picker', 'acf_time_to_unixtime', 10, 3);

function acf_time_to_unixtime($value, $post_id, $field)
{
   if (empty($value)) {
      return $value;
   }
   if (is_object($value) && $value instanceof DateTime) {
   } elseif (is_numeric($value)) {
      if (strlen($value) === 8) {
         $value = DateTime::createFromFormat('Ymd', $value, new DateTimeZone('UTC'));
      } else {
         $value = new DateTime('@' . $value);
      }
   } else {
      $value = new DateTime($value, new DateTimeZone('UTC'));
   }
 
   if ($field['type'] == 'date_picker') {
      $value->setTime(0, 0, 0);
   }
 
   return $value->format('U');
}

再來處理資料取出的問題。

真是開心什麼事情都不用做,因為原先 ACF 就有調整輸出格式的功能,而他的處理流程,是可以接受使用 UNIX 時間格式當作資料來源的。

另外,本次提供的調整範例,當你自行開發的部分使用 update_field 直接設定數值的情況下,是可以使用 PHP 的日期時間物件直接更新資料的。

發表留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料