Bugünkü yazımızda bir veriyi önbellekte tutmak için kullanabileceğimiz en kolay ve etkili yöntemlerden biri olan WordPress Transients API’e değineceğiz.
Öncelikle yazıyı okurken diğer taraftanda API’nin kendi döküman sayfası açık kalsın. Transients API temel olarak 6 fonksiyondan oluşur. Aslında teknik olarak 3 fonksiyondan bahsedebiliriz, çünkü set_site_transient() ile set_transient() arasındaki temel fark _site_ fonksiyonlarının multisite için tasarlanmış olmasıdır. Bu açısından bakınca 3 fonksiyonu incelememiz yeterli gelecektir.
set_transient()
Bir veriyi önbelleğe alırken şu şekilde;
set_transient( $transient, $value, $expiration );
3 parametre ile çalışan fonksiyonumuz. Birincisi transent’in ismi oluyor, ikincisi tutacağı değer, ve son olarakta saniye cinsinden ömrünü ayarlıyoruz.
Not: Saniye cinsinden değer girerken WordPress 3.5 te eklenen zaman sabitlerinden faydalanabilirsiniz.
MINUTE_IN_SECONDS = 60 (seconds) HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS
get_transient()
Transient olarak tutulan veriyi çağırmaya yarar. Şu şekilde;
get_transient( $transient );
şeklinde kullanılır. Aldığı tek parametre, çağırdığı transient’in adıdır.
delete_transient()
Transient’ olarak tutulan verilerin zaten yaşam aralığını biz belirlediğimiz için belirli bir süre sonra kendi kendini imha edecektir.
Bu yüzden en az kullanılan fonksiyon delete_transient() fonksiyonu olsa da, bazı durumlarda (silme, güncelleme vs… gibi) yardımcı olabilmekte. Gelelim kullanımına;
delete_transient( $transient );
aynı get_transient’te olduğu gibi tek parametre alır, onda da silinecek transient’in adını tutar.
Örnek Senaryo
Transient API’i temanızda eklentinizde vs.. pek çok yerde yaygın olarak kullanabilirsiniz, temelde Options API ile aynı şekilde çalışsa da, kendi kendini yok etme özelliği cache için güzel bir ortam sunar.
Özellikle pahalı sorgular diyebileceğimiz bir değerin hesaplanmasının uzun süre aldığı yada sistem kaynağını yorduğu değerler, sürekli güncel olmak zorunda değilse bu gibi noktalarda çok faydasını görürsünüz.
Yada bir başka örnek vermek gerekirse Uzak bir sunucudan aldığınız veriyi transient’te tutabilir, böylece her isteği uzaktaki sunucuya yapıp performans kaybına neden olmazsınız ( şahsen kullandım, çok faydasını gördüm ) .
Hakan der ki
Gerçekten faydalı bir yazı olmuş, teşekkürler. Bu fonksiyonu anasayfadaki yazılar için kullandığımda sayfalama olayına çözüm bulamamıştım. Acaba sitedeki yazıları listelerken örneğin 40 postu cache’e alıp, bunları sayfalama yöntemiyle 10’ar 10’ar ayırmamız mümkün müdür? Kullanıcı ilk 4 sayfada cache’den içeriği görüntüleyip kalan sayfaları da cache olmadan görüntüleyebilir mi?
Mustafa Uysal der ki
Transient’te mümkün olduğunca cache’i küçük tutmaya çalışın. Çünkü sizin bahsettiğiniz örnekte 40 post’u tek bir database field’ına serialize etmiş olarak tutuyorsunuz ki şahsen bunun çok faydalı olduğunu düşünmüyorum. Onun yerine html output cache yada lazy load tekniğini araştırmanızı öneririm.
borantula der ki
Ben en çok twitterdan data çektiğim durumlarda kullanmıştım bu özelliği. Böylece twitter sorgu limitlerini de aşmadan saat başı tweetleri çekip gösteriyordu
Mustafa Uysal der ki
Aynen, özellikle API ile etkileşimli işlerde kullanışlı olabiliyor.