WP CLI ile WordPress Transient Verilerini Temizleme
WordPress siteniz zamanla yavaşlamaya başladıysa ve veritabanınız şişkinleştiyse, suçlulardan biri büyük ihtimalle birikmiş transient verileridir. Özellikle WooCommerce kullanan sitelerde bu durum daha da belirgin hale gelir. Transient’lar aslında WordPress’in kendi cache mekanizmasıdır, yani geçici verileri veritabanında saklamanın resmi yoludur. Ama “geçici” denen bu veriler bazen hiç temizlenmez ve wp_options tablosunu doldurmaya devam eder. Bu yazıda WP-CLI kullanarak transient verilerini nasıl temizleyeceğinizi, hangi durumlarda ne yapmanız gerektiğini ve bu işlemi nasıl otomatize edeceğinizi adım adım ele alacağız.
Transient Nedir ve Neden Sorun Olur?
WordPress transient sistemi, belirli bir süre geçerli olan geçici verileri saklamak için tasarlanmıştır. Bir eklenti harici bir API’den veri çektiğinde, bu veriyi her istekte tekrar çekmemek için transient olarak saklar. Süre dolduğunda teoride bu veri silinmeli ve yenilenmelidir.
Sorun şu ki, WordPress transient’ları iki farklı yerde saklayabilir:
- Standart kurulumda doğrudan wp_options tablosunda saklanır
- Redis veya Memcached gibi harici bir object cache sistemi varsa orada saklanır
Harici cache yoksa tüm transient’lar wp_options tablosuna yazılır. Her transient aslında iki satır oluşturur: biri değer için (_transient_anahtar), diğeri süre bilgisi için (_transient_timeout_anahtar). Yüzlerce, binlerce transient biriktiğinde wp_options tablosu devasa boyutlara ulaşabilir. Bu da her WordPress sayfa yüklemesinde bu tabloyu sorgulayan kodun yavaşlamasına neden olur.
WooCommerce tek başına onlarca farklı transient türü oluşturur: ürün cache, kategori sayaçları, stok durumu cache’leri, rapor verileri… Aktif bir e-ticaret sitesinde bunlar hızla birikir.
WP-CLI Olmadan Transient Yönetimi Neden Zordur?
phpMyAdmin’den elle SQL yazmak, eklenti kurmak ya da doğrudan PHP kodu çalıştırmak gibi yollar da var ama bunların hepsi ya zahmetli ya da risklidir. WP-CLI burada işleri çok kolaylaştırıyor.
Ayrıca paylaşımlı hosting’de değil de VPS veya dedicated sunucularda çalışıyorsanız, WP-CLI zaten standart araç setinizin parçası olmalı. SSH erişiminiz varsa ve WP-CLI kurulu değilse, şu an durdurun ve kurun. Sonra devam edin.
WP-CLI ile Temel Transient Komutları
WP-CLI’nin transient komutu oldukça kapsamlıdır. Tek tek transient yönetiminden toplu silme işlemlerine kadar her şeyi yapar.
Mevcut Transient’ları Listeleme
Önce durumu görmek için ne kadar transient biriktiğini listeleyelim:
wp transient list --path=/var/www/html/wordpress
Bu komut tüm transient’ları listeler. Ama çıktı çok uzun olabilir. Daha anlamlı bir çıktı için bazı parametreler ekleyelim:
wp transient list --fields=name,expiration --format=table --path=/var/www/html/wordpress
Sadece süresi dolmuş transient’ları görmek isterseniz:
wp transient list --expired --path=/var/www/html/wordpress
Bu komutla kaç tane süresi geçmiş transient beklediğini görebilirsiniz. 500’den fazlasını görüyorsanız ciddi bir temizlik zamanı gelmiş demektir.
Tek Bir Transient’ı Silmek
Spesifik bir transient’ı silmek için:
wp transient delete wc_products_onsale --path=/var/www/html/wordpress
Bu WooCommerce’in indirimli ürünler cache’ini siler. Sitede bir ürünü kampanyaya aldınız ama indirimli ürünler listesinde görünmüyor mu? Büyük ihtimalle bu transient hala eski veriyi tutuyor.
Tüm Transient’ları Temizlemek
Tek komutla tüm transient’ları silmek için --all parametresini kullanın:
wp transient delete --all --path=/var/www/html/wordpress
Bu komut hem süresi dolmuş hem de hala geçerli olan tüm transient’ları siler. WordPress ve eklentiler ihtiyaç duydukça bunları yeniden oluşturacaktır. Yani bu işlemi yaptıktan sonra sitenize birkaç istek geldiğinde transient’lar tekrar oluşmaya başlar.
Önemli not: Bu işlemi yoğun trafik saatlerinde yapmayın. Tüm cache temizlenince ilk gelen istekler hem veritabanını hem de dış servisleri sorgulayacak, kısa süreli bir yavaşlama yaşanabilir.
Sadece Süresi Dolmuş Transient’ları Silmek
Aktif ve geçerli transient’lara dokunmadan sadece süresi geçmişleri temizlemek için:
wp transient delete --expired --path=/var/www/html/wordpress
Bu daha güvenli bir seçenek. Geçerli cache verilerini korurken çöpleri temizler. Bunu production ortamında daha sık çalıştırabilirsiniz.
Gerçek Dünya Senaryoları
Senaryo 1: WooCommerce Sitesinde Performans Düşüşü
Bir müşterinin WooCommerce sitesi giderek yavaşlıyor. Sayfalar 3-4 saniyede açılıyor, hosting firması “veritabanınız şişmiş” diyor. SSH ile bağlandınız ve duruma bakıyorsunuz.
# Önce WordPress dizinine gidin
cd /var/www/html/muster-site
# wp_options tablosunun boyutunu kontrol edin
wp db query "SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '%transient%';"
# Çıktı: 3847 satır gibi bir şey göreceksiniz
3847 transient satırı demek yaklaşık 1900 transient demektir (her biri 2 satır tutuyor). Şimdi temizleyelim:
# Önce süresi dolmuşları silelim
wp transient delete --expired
# Kaç transient kaldığına bakalım
wp db query "SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '%transient%';"
# Hala çok fazlaysa hepsini temizleyelim
wp transient delete --all
Ardından veritabanını optimize etmeyi unutmayın:
wp db optimize
Bu işlemlerin ardından tablo boyutu önemli ölçüde küçülür ve sorgu süreleri düşer.
Senaryo 2: Eklenti Güncellemesi Sonrası Bozuk Cache
Bir eklentiyi güncellediniz ama site hala eski davranışı gösteriyor. Eklentinin eski versiyonuna ait transient’lar hala orada duruyor. Bu özellikle fiyatlandırma mantığını değiştiren WooCommerce eklentilerinde sık yaşanır.
# Belirli bir eklentiye ait transient'ları bulun
wp transient list | grep "wc_"
# Tümünü silmek yerine sadece ilgili olanları silebilirsiniz
# Ama pratikte hepsini silmek daha kolay
wp transient delete --all
# WordPress cache'ini de temizleyin
wp cache flush
Senaryo 3: Çoklu Site (Multisite) Kurulumunda Temizlik
WordPress Multisite kullanıyorsanız her alt site kendi transient’larına sahiptir. Hepsini temizlemek için:
# Tüm sitelerin ID'lerini listeleyin
wp site list --fields=blog_id,url
# Her site için ayrı ayrı temizlik yapın
wp transient delete --all --url=https://site1.example.com
wp transient delete --all --url=https://site2.example.com
# Ya da döngüyle tümünü temizleyin
for site_url in $(wp site list --field=url); do
echo "Temizleniyor: $site_url"
wp transient delete --all --url=$site_url
done
Bu döngü, multisite kurulumunuzda kaç alt site varsa hepsini tek seferde temizler.
Transient Temizliğini Otomatize Etmek
Manuel temizlik iyi ama asıl güç otomasyonda. Cron job kurarak bu işlemi periyodik olarak yapabilirsiniz.
Basit Cron Job
# Crontab'ı düzenleyin
crontab -e
# Her gece saat 03:00'te süresi dolmuş transient'ları temizle
0 3 * * * /usr/local/bin/wp transient delete --expired --path=/var/www/html/wordpress --quiet
# Haftada bir Pazar gecesi tüm transient'ları temizle ve veritabanını optimize et
0 4 * * 0 /usr/local/bin/wp transient delete --all --path=/var/www/html/wordpress --quiet && /usr/local/bin/wp db optimize --path=/var/www/html/wordpress --quiet
--quiet parametresi gereksiz çıktıyı bastırır, cron loglarınızı temiz tutar.
Daha Kapsamlı Bir Bakım Scripti
Sadece transient temizliğiyle sınırlı kalmayan, genel WordPress bakımı yapan bir script hazırlayalım:
#!/bin/bash
# wp-maintenance.sh
# WordPress bakım scripti
WP_PATH="/var/www/html/wordpress"
WP_CLI="/usr/local/bin/wp"
LOG_FILE="/var/log/wp-maintenance.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] WordPress bakimi basliyor..." >> $LOG_FILE
# Süresi dolmuş transient'ları sil
echo "[$DATE] Suresi dolmus transient'lar siliniyor..." >> $LOG_FILE
$WP_CLI transient delete --expired --path=$WP_PATH --quiet
echo "[$DATE] Transient temizligi tamamlandi." >> $LOG_FILE
# Revizyon verilerini temizle (son 5 revizyonu koru)
echo "[$DATE] Eski revizyonlar temizleniyor..." >> $LOG_FILE
$WP_CLI post delete $(wp post list --post_type='revision' --format=ids --path=$WP_PATH) --force --path=$WP_PATH --quiet 2>/dev/null
# Veritabanını optimize et
echo "[$DATE] Veritabani optimize ediliyor..." >> $LOG_FILE
$WP_CLI db optimize --path=$WP_PATH --quiet
# Otomatik taslakları temizle
echo "[$DATE] Otomatik taslaklar temizleniyor..." >> $LOG_FILE
$WP_CLI post delete $(wp post list --post_status=auto-draft --format=ids --path=$WP_PATH) --force --path=$WP_PATH --quiet 2>/dev/null
echo "[$DATE] Bakim tamamlandi." >> $LOG_FILE
Bu scripti çalıştırılabilir yapın ve cron’a ekleyin:
chmod +x /usr/local/bin/wp-maintenance.sh
crontab -e
# Her Pazar saat 02:00'de çalıştır
0 2 * * 0 /usr/local/bin/wp-maintenance.sh
WooCommerce Özelinde Transient Yönetimi
WooCommerce, WordPress’in en çok transient üreten eklentisi olma unvanını fazlasıyla hak ediyor. Ürün cache’leri, sepet verileri, raporlar, stok uyarıları… Bunların bir kısmını anlayalım.
WooCommerce transient’larının büyük çoğunluğu şu prefixleri taşır:
- wc_products_onsale: İndirimli ürünler listesi
- wc_term_counts: Kategori ve etiket ürün sayaçları
- wc_product_loop: Ürün listesi cache’leri
- woocommerce_product_query: Ürün sorgu sonuçları
- woocommerce_reports: WooCommerce rapor verileri
Belirli bir türdeki WooCommerce transient’larını hedefleyerek silmek isterseniz SQL ile yaklaşabilirsiniz:
# Sadece WooCommerce rapor transient'larını sil
wp db query "DELETE FROM wp_options WHERE option_name LIKE '%woocommerce_reports%' AND option_name LIKE '%transient%';"
# Sonrasında transient listesini kontrol et
wp transient list | grep "woocommerce_reports"
Ama genel kural olarak, WooCommerce eklentisini büyük güncelleme sonrasında tüm transient’ları temizlemek iyi bir pratiktir.
Transient Verilerini Düzenli İzlemek
Sadece temizlik yapmak yetmez, durumu düzenli izlemek de gerekir. Şu komutla anlık bir snapshot alabilirsiniz:
# Toplam transient sayısı
echo "Toplam transient sayisi:"
wp db query "SELECT COUNT(*)/2 as transient_count FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%';" --path=/var/www/html/wordpress
# Süresi dolmuş transient sayısı
echo "Suresi dolmus transient sayisi:"
wp db query "SELECT COUNT(*)/2 as expired_count FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP();" --path=/var/www/html/wordpress
# Transient'ların toplam boyutu (MB cinsinden)
echo "Transient veri boyutu (MB):"
wp db query "SELECT ROUND(SUM(LENGTH(option_value))/1024/1024, 2) AS size_mb FROM wp_options WHERE option_name LIKE '_transient_%';" --path=/var/www/html/wordpress
Bu üç sorguyu bir scripte koyup düzenli olarak çalıştırıp sonuçları loglarsanız, zamanla ne kadar hızlı biriktiğini görebilirsiniz. Bu veriler bakım sıklığınızı belirlemenize yardımcı olur.
Object Cache Kullanıyorsanız Durum Farklıdır
Eğer sitenizde Redis veya Memcached gibi bir object cache sistemi varsa, transient’lar wp_options tablosuna yazılmaz, doğrudan cache sistemine yazılır. Bu durumda wp transient delete --all komutu veritabanını değil, cache sistemini temizler.
Redis kullanıyorsanız şunu da yapabilirsiniz:
# Redis cache'ini WP-CLI üzerinden temizle
wp cache flush --path=/var/www/html/wordpress
# Sadece transient'ları değil tüm object cache'i temizler
Object cache kullanan bir sitede veritabanı şişkinliği yaşıyorsanız, transient’lardan şüphelenmeyin. Sorun başka bir yerde.
Sık Yapılan Hatalar
Temizliği Production’da Yoğun Saatte Yapmak
Tüm transient’ları peak hours sırasında silmek sitenizi anlık olarak yavaşlatabilir. Cache boşaldı, her şey yeniden oluşturulacak, yüzlerce eş zamanlı istek veritabanını ve dış API’leri aynı anda sorgulayacak. Bu “cache stampede” ya da “thundering herd” problemi olarak bilinir. Çözüm: bakımı gece yarun veya erken sabah saatlerinde yapın.
wp db optimize Yapmadan Bırakmak
Transient’ları sildikten sonra veritabanı dosyasındaki fiziksel alan hemen küçülmez. MySQL/MariaDB tablo içindeki boşlukları hemen geri vermez. wp db optimize komutu bu boşlukları geri kazanmanızı sağlar. Temizlik sonrası bunu yapmayı alışkanlık haline getirin.
Multisite’da Yanlış Hedefleme
Multisite kurulumunda --path parametresi tek başına yeterli değildir. Alt site transient’larını temizlemek için --url parametresini de belirtmeniz gerekir. Sadece --path ile yapılan temizlik genellikle sadece ana siteyi etkiler.
Transient Kullanımını Azaltmaya Yönelik Uzun Vadeli Çözümler
Temizlik reaktif bir çözümdür. Uzun vadeli çözüm, transient birikimini baştan önlemektir.
- Redis ya da Memcached kurun: Transient’lar veritabanı yerine memory’e yazılır, expire olduğunda otomatik silinir, veritabanı şişmez.
- Eklentilerinizi gözden geçirin: Bazı eklentiler gereğinden fazla transient oluşturur. WP-CLI ile hangi eklentinin ne kadar transient ürettiğini izleyin.
- WooCommerce rapor cache süresini ayarlayın: WooCommerce ayarlarından bazı cache sürelerini kısaltabilirsiniz.
- Autoload verilerini izleyin: Transient dışında da autoload=’yes’ olan büyük opsiyonlar performansı etkiler.
wp db query "SELECT option_name, LENGTH(option_value) FROM wp_options WHERE autoload='yes' ORDER BY LENGTH(option_value) DESC LIMIT 20;"sorgusuyla bunları da takip edin.
Sonuç
WordPress transient yönetimi, göz ardı edilince zamanla ciddi performans sorunlarına yol açan ama WP-CLI ile çok kolay halledilen bir konudur. Temel kullanım için wp transient delete --expired ile süresi dolmuşları düzenli temizlemek ve wp transient delete --all ile periyodik tam temizlik yapmak çoğu durumda yeterlidir. WooCommerce sitelerinde bu işlemleri haftada en az bir kez yapmanızı öneririm.
Cron job ile otomatize edin, bakım scriptine dahil edin ve veritabanı boyutunu izleyin. Uzun vadede Redis gibi bir object cache çözümüne geçerseniz bu sorunu büyük ölçüde ortadan kaldırmış olursunuz. Ama o geçişi yapmadan önce veya sonrasında bile WP-CLI’nin transient komutlarını bilmek, bir sysadmin olarak WordPress sitelerini yönetirken işinizi ciddi ölçüde kolaylaştırır.
