[WordPress] 使用 set_transient 方法為你的請求做快取機制

這樣的需求來自於「又不是時時刻刻更新,為何要時時刻刻來詢問呢?」,反過來說「我又不知道你何時更新?你又不會主動跟我說。」,所以就會變成自己設定個時間去判斷是否有更新,時間到了後再去檢查。 WordPress 中 set_transient 方法就是這樣的一個用途!

上面對話很明顯就是兩個不同的角色,也可以解釋成為你可能再跟不同的窗口請求資料,可能是別的服務、別人的網站等等。

考量到你頻繁的請求可能會被對方服務視為攻擊而被封鎖,但邏輯實作中就是需要在某個環節去詢問,而套用 Transients API 機制後,詢問就不會這麼直接了!

使用方式也很簡單,分以下幾個流程步驟:

  1. 使用 get_transient 方法,詢問是否最近請求過資料
  2. (有)就用上次請求的資料吧!
  3. (沒有)那就現在請求一下吧!
  4. 如果查詢結果為(沒有),那就把當下回傳結果使用 set_transient 存進去,並且設定一組過期時間。

如此 1 ~ 4 的流程即可在使用者體驗上與穩定度上獲得提升!(節省請求時間、不會因為過度請求導致被資源提供者封鎖)

範例程式

// 1. 判斷是否在週期時間內有曾經取得過資料
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
    // 3. 沒有,所以現在來取得,以下舉例取得一些指定文章,至於要取得什麼其他的就自行撰寫囉!
    $special_query_results = new WP_Query( 'cat=5&order=random&tag=tech&post_meta_key=thumbnail' );
    // 4. 把結果存回去 transient 中並設定一天的時間內都以這份資料為主不再請求。
    set_transient( 'special_query_results', $special_query_results, DAY_IN_SECONDS );
}
// 2. 有曾經取過了,就直接用吧!

WordPress 在 3.5 版之後有定義幾個很方便的常數讓開發者呼叫,來帶入顯而易見的過期時間:

MINUTE_IN_SECONDS  = 60 (秒) //定義 1 分鐘
HOUR_IN_SECONDS    = 60 * MINUTE_IN_SECONDS //定義 1 小時
DAY_IN_SECONDS     = 24 * HOUR_IN_SECONDS //定義 1 天
WEEK_IN_SECONDS    = 7 * DAY_IN_SECONDS //定義 1 週
MONTH_IN_SECONDS   = 30 * DAY_IN_SECONDS //定義 1 個月(30天)
YEAR_IN_SECONDS    = 365 * DAY_IN_SECONDS //定義 1 年

至於方法的參數建議就是回官網好好看一下文件囉,很詳細~

Facebook 外掛整合


Share: