關於 WordPress 的 Transients

內容更新於 — 2022-12-26 17:14

❝廣告,是為了讓這裡能夠永續經營,多多包容囉^v^❞

在 WordPress 生態系統中,Transients 是程式庫中很少被提及的那一塊;但是,對於開發人員來說,在編寫外掛或主題的程式碼類型中,Transients 可以大大提升程式庫的性能;尤其是當正要運行複雜的數據庫查詢,或者是調用不經常更改結果的外部 API,它將會直接提供調用臨時儲存的數據,這意味著頁面載入的速度會更快。

這篇文章將解釋什麼是 Transients ,它們又如何在 WordPress 中工作,以及如何在程式碼中運用 Transients 來提高主題和外掛的性能。

什麼是 Transients,為什麼需要它們?

WordPress Transients API 是 WordPress 程式庫的一部分,允許外掛和主題的開發人員存儲快取資料。 而這些資料最終會過期,之後也會被自動刪除。

Transients 通常用來快取〖來自可能引入延遲的外部 API 請求〗的數據,或者是來自〖緩慢的資料庫查詢〗的數據,因為這些數據在每次頁面載入的時候會降低網站的性能。

Transients 如何運作?

在 WordPress 數據庫中,Transients 會被儲存成後綴為〖 wp_options 〗的檔案,很類似於 Options API;不過,兩者的區別在於 Transients 有時效性,時效過了就會自動被刪除,而 WordPress Options 則不會。
正因為 Transients 有時效性,所以,編寫程式碼應考慮並計算 Transients 的時效,在可能需要再次調用之前重新填充 Transients ,以防在發出請求時瞬態不再存在。
編寫 Transients 程式碼,有 3 個主要函數:包含 set_transient()get_transient() 以及 delete_transient() ,依序為〖設定 Transients〗、〖取得 Transients〗以刪除 Transients〗。

函數範例如下:

// Setting a value
set_transient( $name, $value, $expiration );

// Accessing a value
get_transient( $name );

// Removing a value
delete_transient( $name );

舉個例子來示範 Transients 的工作原理,假設,你想要在網站顯示能夠每日自動更新的〖名人名言〗,Zen Quotes 是一個很棒的來源,不需要密鑰就可以透過 API 來取得服務。比如,Zen Quotes 提供了一組〖當日名言〗的 API 端點:https://zenquotes.io/api/today,我們可以透過 php 函式調用 API 來取得〖當日名言〗的實時更新,示範的函式如下:

$response = wp_remote_get( 'https://zenquotes.io/api/today );
$body     = json_decode( wp_remote_retrieve_body( $response ) );
$quote = $body->q;

而這段程式碼可以放在主題的 php 檔案中,不過,這時候問題就來了,因為每次有訪客載入頁面的時候,它都會調用 API,這將會造成過多的 API 請求,此外,根據 API 的響應時間,還可能減慢頁面載入的速度。所以,更好的作法是使用 Transients 來確保只有當 Zen Quotes 提供的端點更新的時候才需要調用實時 API,於是,加入 Transients 的程式碼,來設定 Transients 的到期時間如下:

$response = wp_remote_get( 'https://zenquotes.io/api/today' );
$body     = json_decode( wp_remote_retrieve_body( $response ) );
$quote = $body->q;

set_transient( 'quote', $quote, DAY_IN_SECONDS );

以上的 Transients 程式碼是將將 Transients 設置為 24 小時到期(WordPress DAY_IN_SECONDS)。
不過,事情還沒完,我們還要設定一個檢查機制告訴它:『只有在 Transients 到期的時候才需要調用實時 API。』,否則,前面設定的〖 24 小時到期〗也沒用,函式如下:

if( get_transient( 'quote' ) ) {
    $quote = get_transient( 'quote' );
} else {
    $response = wp_remote_get( 'https://zenquotes.io/api/today' );
    $body     = json_decode( wp_remote_retrieve_body( $response ) );
    $quote = $body->q;

    set_transient( 'quote', $quote, DAY_IN_SECONDS );
}

set_transient 和 get_transient 的用法類似 ,至於 delete_transient 的用法則是:假設,想在 Transients 到期之前自動刪除它,可以使用以下命令:

delete_transient( 'quote' );

在WordPress 中常見的 Transients 用法

以下是常見的幾種 Transients 的深入使用。

快取長時間運行的數據庫查詢

WordPress 的數據庫查詢的優化做得很好,像是 WP_Query。但是,如果要從 wp_postmeta 查詢大量數據,那麼,就會影響到前端網站載入的性能,尤其是擁有上萬或數十萬則文章的網站。

但是,如果這些文章並不是經常更改,就可以執行一次長時間運行的數據庫查詢,將查詢結果保存在 Transients ,並且為 Transients 設定到期時間,然後,從保存的 Transients 為每個頁面視圖執行查找,這將確保快速執行對該數據的後續調用,例如,可以設定瞬態的到期時間為一小時、一天甚至是更久的時間。

減少外部 API 請求的等待時間

另一個常見的瞬態用法則是透過 API 調用外部資源。因為我們無法控制外部資源的響應速度甚至是持續可用性,於是,使用 Transients 可以更好地控制這種情況。就像前面的〖當日名言〗的案例,我們可以將遠端 API 返回的數據暫時保存在 Transients ,之後的頁面載入就可以從預先保存的 Transients 中讀取數據,而不是重新調用,需要考慮的則是數據更改的頻率。

假設, API 調用的是〖天氣〗,幾乎可說是需要分秒更新的資料,那麼, Transients 將無濟於事。但是,如果要查詢或調用的資料數小時更新即可,那 Transients 便有機會幫助提高網站的性能,也能確保獲得所需的新數據。

❝廣告,是為了讓這裡能夠永續經營,多多包容囉^v^❞

Transients 的優缺點

Transients 可以大大提高程式碼性能,尤其是需要經常使用長時間運行的查詢或執行的渲染阻塞請求,Transients 改善的是程式碼中的潛在性能。

至於使用 Transients 最大的缺點則是,即使已設定了到期時間,也不能保證在到期之前的 Transients 一定可用,因此,如果有需要在準確時間轉換的數據,那麼 Transients 可能不是最佳選擇。

Transients 最理想的作用是在於,需要提取大量數據或與外部資源的主題或外掛,並且將在高流量的網站上運行時,那麼,Transients 是一個有用的概念,去快取需要長時間或緩慢的操作,以便在不需要更新數據的前提下保持較高的網站性能。此外,日益複雜的程式碼中,Transients 也可以確保從複雜的程式庫中獲得最佳性能。

原始發布日:
2022-11-15
最新留言
▍關於作者|MiriamMibao温唯
2019.02.11,我開始了這裡…
非網頁程式背景的 me 硬要WordPress架站一切自己來,所有的細節,從0開始,自己架站會遇到的問題,遇到了才知道!一路走來跌跌撞撞,摸索過國內外能夠解決問題的資料,是不是該好好紀錄這一段跌跌撞撞的探索日記?
或許,也能帶給你們一些幫助...
文章中所推薦或提及的架站產品或服務,部分是聯盟合作所提供的,如果你透過我所提供的聯盟網址去購買,我也能獲得收益,雖然金額很少,但是,你們的隨手點擊與購買,就能讓我繼續經營下去,提供更多免費的 WordPress 架站教學。
以下歡迎留言討論囉!
我只想當個旁觀者,有新的留言請通知我(按一下輸入Email信箱)
想Fallow哪種留言?
0 留言板
Inline Feedbacks
查看所有留言
❤ 謝謝你的咖啡 ❤
請温唯喝咖啡的可愛人兒
謝謝你們的溫暖與肯定
是我繼續分享下去的力氣
請温唯喝杯咖啡吧
Thank U ❤ 
米雪
NT$200
感謝您詳實資料的分享與問題解答,+小小心意,+望不嫌棄!+ 祝福您身體健康,+平安如意,+豐盛圓滿!
Thank U ❤ 
hope
NT$500
感謝贊助支持
Thank U ❤ 
Harry
NT$100
感謝回答我頁面問題
Thank U ❤ 
mira
NT$150
謝謝提供很多關於防曬產品的測試心得
Thank U ❤ 
路人
NT$49
感謝贊助支持
Thank U ❤ 
Ethan
NT$100
最近有留言詢問也快速獲得回復了~一點小心意給您:)
Thank U ❤ 
Annie
NT$60
謝謝溫唯
Thank U ❤ 
Mei
NT$49
謝謝你很用心的打很多實用的商品文章。讓我了解很多,謝謝你的熱心分享!
Thank U ❤ 
小Q
NT$150
謝謝溫唯~以後會繼續支持<3
Thank U ❤ 
游雅涵UU
NT$1000
溫唯您好~我是UU,感謝您這麼用心地分享,我也曾陷入精油保養的錯誤觀念裡,造成粉刺痘痘狂長,變成酒糟肌,雖然有看醫生擦藥-思媚、樂淨,但醫生不會與病患討論什麼保養品才合適,希望能向您學習,使肌膚更好~
Thank U ❤ 
小Q
NT$150
謝謝溫唯的細心解答,以後會繼續支持!🥰
Thank U ❤ 
Trista
NT$50
感謝分享~~~~
Thank U ❤ 
邱垂昀
NT$150
我是小Q也是小R啦~ 隨便亂取的綽號,結果在不同文章發問的時候忘記上次是用哪個英文字母XD 謝謝溫唯專業的文章和用心的回答!真的很有幫助,支持你繼續經營下去~~!!
Thank U ❤ 
匿名
NT$150
非常專業, 雖然只看幾篇而已,但我已受益良多. 倒是我對防水和防曬力那兩部分的實驗結果覺得非常驚訝. 乾性敏感肌的我十幾二十年以來一直都是混著資生堂的艷陽下50++++ 乳液(淺藍色深藍色都放)和歐系的兒童防曬霜(秋冬還會混一點維他命E油)在使用, 因為夠油夠防水, 中午補擦一下, 覺得我用了世界上最完美的防曬組合, 又有保護力又不會乾, 氣色看來也不錯, 不太顯老哩...不過看了你的實驗和說明, 我才了解, 是我一年一次的雷射和座位旁的厚窗簾救了我, 和我擦的防曬看來是沒太大關係. 三年多前換了工作岡位的我到了一間前面沒有窗簾可遮蔽窗戶的辦公室, 加上三年以上沒打雷射, 雖然不多, 但睽違很久的斑又回頭來找我了, 法令也變深一點了. 有點小難受 >_<. 剛剛根據你的實驗, 訂了一條德國製的妮維雅敏感肌的防曬霜, 打算來混一些防水力強的日系防曬(Alley我也買了一個小條的, 因為你說比安耐曬還防水耶...)和似乎除了油沒啥用的雅漾全效潤色來一起混用看看.期待他們能各司其職,讓我皺紋不要越來越深. 謝謝你. 噢,小小一杯咖啡而已, 請你笑納, 請不要公布姓名喔~
Thank U ❤ 
許亞盈
NT$150
感謝支持贊助
Thank U ❤ 
許亞盈
NT$300
感謝支持贊助
Thank U ❤ 
張惠雯
NT$45
感謝支持贊助
Thank U ❤ 
shelly
NT$250
我最近也非常喜歡艾莉莎公主的洗臉巾,質地非常棉柔,不傷害皮脂膜,也具有基礎的去脂力,是敏弱時期的清潔好夥伴唷!
Thank U ❤ 
麋鹿的夏天
NT$300
過敏和痘痘的情況有改善了嗎?透過正確的護膚方式,才能保護皮脂膜不被破壞,如此才有機會治療痘痘,希望下次能聽到妳傳來健康皮膚的消息唷!
Thank U ❤ 
蔡孟樵
NT$250
謝謝你的咖啡(愛心)如果有任何問題,歡迎在文章的留言板一起討論唷!
Thank U ❤ 
鄭俊
NT$500
網站有任何問題都可以再詢問唷!
Thank U ❤ 
邱英倢
NT$900
你們的網站進行到哪裡了呢?有沒有其他的問題呢?
Thank U ❤ 
謝正家
NT$900
不曉得是否更熟悉 soledad 和 Elementor 的操作呢?有任何問題都可以再詢問唷!
Thank U ❤ 
孫依賢
NT$900
過敏和痘痘的情況有改善了嗎?透過正確的護膚方式,才能保護皮脂膜不被破壞,如此才有機會治療痘痘,希望下次能聽到妳傳來健康皮膚的消息唷!
Thank U ❤ 
邱英倢
NT$900
新手架站真的很不容易,温唯也是過來人,有任何問題都歡迎切磋交流唷!
Thank U ❤ 
鄭俊維
NT$90
謝謝你信任温唯,之後若還有其他問題,都歡迎再提問唷!
Thank U ❤ 
鄭俊維
NT$500
謝謝你信任温唯,之後若還有其他問題,都歡迎再提問唷!
Thank U ❤ 
鄭俊維
NT$500
謝謝你信任温唯,之後若還有其他問題,都歡迎再提問唷!
Thank U ❤ 
翟翱
NT$150
謝謝你的咖啡(愛心)
如果有任何問題,歡迎在文章的留言板一起討論唷!
Thank U ❤ 
鄭俊維
NT$500
謝謝你信任温唯,協助你處理問題的過程中,也讓我更熟悉 Newspaper 這個主題的功能,之後若還有其他問題,都歡迎再提問唷!
Thank U ❤ 
陳麗妃
NT$45
謝謝你的咖啡(愛心)
如果有任何問題,歡迎在文章的留言板一起討論唷!
Thank U ❤ 
JIN
NT$150
最近得美登有一支高防禦力的防曬也非常透明唷!比美膚娜娜更透明,當然,一樣也有油光煥發的問題,不過,至少沒有美膚娜娜那麼嚴重,而且,泛白程度又更低了,有機會也可以試試唷!
Thank U ❤ 
黃紫茵
NT$150
謝謝你的咖啡(愛心)
如果有任何問題,歡迎在文章的留言板一起討論唷!
Thank U ❤ 
許惠雯
NT$150
謝謝你的咖啡(愛心)
如果有任何問題,歡迎在文章的留言板一起討論唷!
Thank U ❤ 
張晏婕
NT$500
過敏的狀況有沒有改善了呢?如果在清潔方面遇到瓶頸,歡迎隨時進一步討論唷
Thank U ❤ 
KT
NT$900
後來好久都沒和你聯繫,你寄給我的四支產品,有一支真的好讚,值得好好介紹,也有許多關於產品和品牌的想法想和你聊聊,過陣子忙完後再找你啦!
Thank U ❤ 
西尼
NT$45
謝謝你的咖啡(愛心)如果有任何問題,歡迎在文章的留言板一起討論唷!
Thank U ❤ 
菲菲
NT$700
不曉得你的網站目前的進度如何呢?有任何問題可以再諮詢唷!
Thank U ❤ 
FALA LING
NT$250
謝謝你的咖啡(愛心)如果有任何問題,歡迎在文章的留言板一起討論唷!
Thank U ❤ 
王小姐
NT$150
謝謝你的咖啡(愛心)如果有任何問題,歡迎在文章的留言板一起討論唷!
Thank U ❤ 
賈超然
NT$150
謝謝你的咖啡(愛心)如果有任何問題,歡迎在文章的留言板一起討論唷!
Thank U ❤ 
Vivian
NT$250
謝謝你的咖啡(愛心)不曉得是哪一類型的文章帶給你幫助呢?希望日後有機會與妳在文章留言板討論唷!
Thank U ❤ 
pegasus
NT$45
又見面囉!謝謝你的咖啡,也祝福妳一切順利唷!
Thank U ❤ 
温炯杰
NT$250
謝謝你的贊助,我會繼續撰寫更多關於WordPress架站過程中可能會遇到的各種疑難雜症。如果有任何問題,歡迎在文章的留言板中討論唷!
Thank U ❤ 
cloree
NT$250
謝謝你的鼓勵❤我會加油!!(Fighting!!)其實我有好多產品想要分享給大家,但是,苦於沒有太多時間撰寫完整的分析文章,因為我不想毫無依據地胡亂推薦,每個我自己持續使用的產品,背後都有各自的理由與故事...請放心,我一定會找時間妥善地整理這些資料,再完整地分享,我希望大家能夠在詳細的解說下,選擇真正符合需求的產品唷!
Thank U ❤ 
宥穎
NT$250
真的好開心你也踏上了「Less is more」的護膚路。 其實呀,護膚保養可以很簡單,也可以很難。 最簡單的作法就是「少做少錯」,而最難的就是找到「真正有效」+「不會出錯」的產品! 我也在尋找中,在這之前,「Less is more」是我們必須堅守的底線。 哪天真讓我找到了,我一定會迫不及待地分享,希望那天不會太久唷(笑)
Thank U ❤ 
黃秋逢
NT$45
雖然你沒有留下任何的痕跡,不曉得是哪一類的文章給了你幫助(我姑且猜著是WordPress架站相關吧!)謝謝你的贊助,如果有任何問題,歡迎在文章下方的留言板留下你的足跡,好讓我認識你唷!
Thank U ❤ 
Titi
NT$45
老實說,在你詢問的時候,我還沒有增減Server的經驗呢!於是我便自己操作一次,當然也遇到了和你一樣的問題(笑);立刻向客服求救,才有辦法完整地回覆你。Cloudways是我目前最滿意的主機,日後有其他操作上的問題,歡迎再回來討論唷
Thank U ❤ 
瑋瑋
NT$150
和你聊天真的很開心,相信我們都為彼此帶來許多更寬廣的護膚經驗。雖然我們各自都相當忙碌,但是每每看到你的留言,還是迫不及待地想要趕快與妳一起討論與分享唷❤
Thank U ❤ 
pegasus
NT$45
雖然你沒有留下隻字片語,留下的電話和Email信箱也是虛擬的...但是我相信你從温唯這裏帶走的,遠比這杯咖啡更有價值☺

Copyright ©miriammibao.com all rights reserved|Designed by MiriamMibao温唯 Since 2014.

-
CLOUDWAYS 專屬優惠☞註冊輸入推薦碼MMM8立即享首二月8折優惠點我複製優惠碼GO!!!
miriam wei design wp logo-4 circlemiriam wei design wp logo sticky
0
對文章有任何疑問或想法嗎?歡迎一起討論唷!x