WP CLI ile WordPress Önbellek Yönetimi ve Temizleme
WordPress sitenizin yavaşladığını fark ettiğinizde aklınıza gelen ilk şey genellikle “önbelleği temizleyeyim” oluyor. Bu doğru bir içgüdü, ama işin sadece yüzeysel kısmı. WP-CLI’nin wp cache komutu, önbellek yönetimini terminal üzerinden, scriptlerle, cron job’larla ve otomatize sistemlerle entegre şekilde yapmanızı sağlıyor. Bir kez alışınca kontrol panelinden önbellek temizlemek neredeyse anlamsız geliyor.
WP Cache Nedir, WP-CLI ile Neden Kullanmalısınız?
WordPress’in önbellek sistemi birkaç katmandan oluşuyor. Object cache, transient cache, page cache bunların başında geliyor. Her birinin farklı bir görevi var ve her biri farklı bir sorunun kaynağı olabiliyor.
Object cache: WordPress’in veritabanı sorgularını bellekte tuttuğu yerdir. Redis veya Memcached kuruluysa kalıcı object cache devreye giriyor. Yoksa sadece istek başına geçici bellekte tutuluyor.
Transient cache: Geçici verilerin saklandığı yer. Eklentiler burayı çok seviyor, bazen de kötüye kullanıyor. API yanıtları, hesaplama sonuçları, widget verileri burada birikebiliyor.
Page cache: W3 Total Cache, WP Rocket, LiteSpeed Cache gibi eklentilerin yönettiği tam sayfa önbelleği. Bu katman WP-CLI ile doğrudan yönetilebilir olmayabiliyor, ama object ve transient cache komutları her zaman çalışıyor.
WP-CLI kullanmanın temel faydası şu: SSH erişiminiz varsa kontrol panelinize girmenize gerek kalmıyor. Cron job ile otomatik önbellek temizleme yapabiliyorsunuz. Birden fazla siteyi tek scriptle yönetebiliyorsunuz. Ve en önemlisi, sorun yaşadığınız anlarda web arayüzü yerine terminal çok daha güvenilir.
Temel wp cache Komutları
WP-CLI’nin wp cache alt komutu birkaç temel operasyonu destekliyor. Bunları teker teker inceleyelim.
# Tüm önbelleği temizle
wp cache flush
# Belirli bir önbellek anahtarını sil
wp cache delete <key> [--group=<group>]
# Önbelleğe veri ekle
wp cache add <key> <value> [--group=<group>] [--expiration=<expiration>]
# Önbellekteki bir değeri güncelle
wp cache set <key> <value> [--group=<group>] [--expiration=<expiration>]
# Önbellekten bir değer oku
wp cache get <key> [--group=<group>]
# Önbellek anahtarının değerini artır
wp cache incr <key> [--group=<group>] [--offset=<offset>]
# Önbellek anahtarının değerini azalt
wp cache decr <key> [--group=<group>] [--offset=<offset>]
# Önbellek türü bilgisini görüntüle
wp cache type
wp cache type komutu çok kullanışlı. Çalıştırdığınızda object cache’in Redis, Memcached veya standart WordPress cache olduğunu anlıyorsunuz. Bu bilgi troubleshooting’de hayat kurtarıyor.
wp transient ile Geçici Önbellek Yönetimi
Transient’lar ayrı bir alt komutla yönetiliyor ve çoğu zaman asıl sorun kaynağı bunlar oluyor. Eklentiler bazen yüzlerce transient yaratıp temizlemeyi unutuyor.
# Tüm transient'ları listele
wp transient list
# Süresi dolmuş transient'ları listele
wp transient list --expiration-time=0
# Belirli bir transient'ı sil
wp transient delete my_transient_key
# Tüm transient'ları temizle
wp transient delete --all
# Süresi dolmuş transient'ları temizle
wp transient delete --expired
# Bir transient'ın değerini oku
wp transient get my_transient_key
# Transient sayısını öğren
wp transient list | wc -l
Gerçek dünya senaryosu: Bir müşteri sitesinde sayfa yüklemesi 8 saniyenin üzerine çıkmıştı. wp transient list | wc -l komutu 4.300’den fazla transient döndürdü. Büyük çoğunluğu süresi dolmuş ama silinmemiş kayıtlardı. wp transient delete --expired ile birkaç saniyede temizledik, site anında normale döndü. Sonrasında wp-cron’un düzgün çalışmadığını tespit ettik, çünkü transient temizleme görevi wp-cron’a bağlıydı.
Gerçek Dünya Senaryosu 1: WooCommerce Sonrası Önbellek Temizleme
WooCommerce sitenizde toplu ürün güncellemesi yaptınız. Fiyatlar, stok durumu veya ürün açıklamaları değişti. Bu değişiklikler önbelleğe takılı kalırsa müşteriler eski bilgileri görmeye devam ediyor.
#!/bin/bash
# woocommerce-cache-flush.sh
# WooCommerce güncellemesi sonrası çalıştırın
WP_PATH="/var/www/html/siteniz"
echo "=== WooCommerce Önbellek Temizleme Başladı ==="
echo "Tarih: $(date)"
# WordPress object cache temizle
wp --path=$WP_PATH cache flush
echo "Object cache temizlendi."
# WooCommerce ile ilgili transient'ları temizle
wp --path=$WP_PATH transient delete --all
echo "Tüm transient'lar temizlendi."
# Ürün sorgularını etkileyen cache gruplarını hedefle
wp --path=$WP_PATH cache delete wc_product_loop woocommerce
wp --path=$WP_PATH cache delete woocommerce_product_query woocommerce
# Rewrite kurallarını yenile (bazen gerekli oluyor)
wp --path=$WP_PATH rewrite flush
echo "=== Temizleme Tamamlandı ==="
Bu scripti WooCommerce bulk edit işleminizin hemen ardından çalıştırın. Cron ile de tetikleyebilirsiniz ama toplu işlem sonrası manuel tetikleme daha güvenli.
Gerçek Dünya Senaryosu 2: Redis Object Cache ile Çalışmak
Sunucunuzda Redis kuruluysa ve WordPress Redis Object Cache eklentisi aktifse, işler biraz daha katmanlı oluyor. wp cache flush komutu Redis’i de temizliyor ama bazen daha cerrahi bir müdahale gerekiyor.
# Önce cache türünü doğrula
wp cache type
# Çıktı: Redis
# Redis bağlantı durumunu kontrol et
wp redis status
# Redis cache'i flush et
wp redis flush
# Redis istatistiklerini gör
wp redis info
# Cache hit/miss oranını öğren
wp redis info | grep -E "keyspace_hits|keyspace_misses"
Redis kullanırken dikkat etmeniz gereken bir nokta var: wp cache flush ile wp redis flush arasındaki fark. wp cache flush WordPress’in cache API’si üzerinden gidiyor. wp redis flush ise doğrudan Redis’e bağlanarak tüm veritabanını temizliyor. Çoklu site (multisite) kurulumlarında aynı Redis instance’ını paylaşıyorsanız wp redis flush diğer siteleri de etkiliyor. O yüzden dikkatli kullanın.
Belirli Cache Gruplarını Hedefleme
Tüm cache’i temizlemek nükleer seçenek gibidir. Bazen sadece belirli bir grubun temizlenmesi yeterli ve çok daha hızlı oluyor.
# Belirli bir grup içindeki anahtarı sil
wp cache delete my_key --group=my_plugin_group
# Posts cache grubunu hedefle
wp cache delete last_changed --group=posts
# Terms cache'ini hedefle
wp cache delete last_changed --group=terms
# Users cache'ini temizle
wp cache delete last_changed --group=users
# Options cache'ini hedefle
wp cache delete alloptions --group=options
wp cache delete notoptions --group=options
last_changed anahtarı WordPress’in cache invalidation mekanizmasının kalbi. Bu değer değiştiğinde o gruba ait tüm sorgular geçersiz sayılıyor ve yeniden çekiliyor. Tüm cache’i flush etmek yerine sadece last_changed değerini silerek ilgili grubun yenilenmesini sağlayabilirsiniz.
Cron Job ile Otomatik Önbellek Yönetimi
Yoğun trafik alan sitelerde önbelleğin periyodik olarak yönetilmesi gerekiyor. İşte production’da kullandığım bir yaklaşım:
# /etc/cron.d/wordpress-cache-management
# Her gece 03:00'da süresi dolmuş transient'ları temizle
0 3 * * * www-data /usr/local/bin/wp --path=/var/www/html/siteniz transient delete --expired --quiet
# Her 6 saatte bir object cache'i flush et (yoğun içerik siteleri için)
0 */6 * * * www-data /usr/local/bin/wp --path=/var/www/html/siteniz cache flush --quiet
# Haftalık tam temizlik (Pazar 04:00)
0 4 * * 0 www-data /bin/bash /opt/scripts/weekly-cache-cleanup.sh
Haftalık cleanup scripti:
#!/bin/bash
# weekly-cache-cleanup.sh
WP_PATH="/var/www/html/siteniz"
LOG_FILE="/var/log/wordpress-cache.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
log "Haftalık cache temizliği başladı"
# Transient sayısını logla
TRANSIENT_COUNT=$(wp --path=$WP_PATH transient list 2>/dev/null | wc -l)
log "Temizlik öncesi transient sayısı: $TRANSIENT_COUNT"
# Süresi dolmuş transient'ları sil
wp --path=$WP_PATH transient delete --expired --quiet
log "Süresi dolmuş transient'lar silindi"
# Object cache flush
wp --path=$WP_PATH cache flush --quiet
log "Object cache temizlendi"
# Orphan meta kayıtlarını temizle (dikkatli kullanın)
# wp --path=$WP_PATH post meta clean-duplicates
TRANSIENT_COUNT_AFTER=$(wp --path=$WP_PATH transient list 2>/dev/null | wc -l)
log "Temizlik sonrası transient sayısı: $TRANSIENT_COUNT_AFTER"
log "Haftalık cache temizliği tamamlandı"
Multisite Ortamında Cache Yönetimi
WordPress Multisite kullanıyorsanız her site için ayrı ayrı işlem yapmanız gerekiyor. WP-CLI bunu kolaylaştırıyor ama dikkatli olunması gereken noktalar var.
# Tüm ağdaki sitelerin listesi
wp site list --fields=blog_id,url --format=csv
# Belirli bir alt siteye özgü cache temizleme
wp --url=alt-site.siteniz.com cache flush
# Tüm ağdaki siteleri döngüyle temizle
wp site list --field=url | while read SITE_URL; do
echo "Temizleniyor: $SITE_URL"
wp --url=$SITE_URL cache flush
wp --url=$SITE_URL transient delete --expired
done
# Network admin seviyesindeki transient'ları temizle
wp transient delete --all --network
Multisite’ta dikkat edilmesi gereken: Her alt sitenin kendi transient’ları var, bir de network seviyesinde transient’lar bulunuyor. --network flag’i olmadan sadece ana sitenin transient’ları etkileniyor. Özellikle ağ genelinde bir eklenti (WPMU Dev gibi) kullanıyorsanız network transient’larını da temizlemeniz gerekebilir.
Cache Debug ve Troubleshooting
Sorun yaşadığınızda cache durumunu anlamak için kullanabileceğiniz komutlar:
# Cache türü ve backend bilgisi
wp cache type
# Tüm transient'ları incele, büyüklük ve süre bilgisiyle
wp transient list --fields=name,expiration,value_length --format=table 2>/dev/null | head -50
# Belirli bir eklentiye ait transient'ları bul
wp transient list | grep "woo_"
wp transient list | grep "elementor_"
wp transient list | grep "wpml_"
# Bir transient'ın içeriğini oku
wp transient get my_plugin_data
# Object cache'teki belirli bir değeri kontrol et
wp cache get my_key --group=my_group
# WordPress options tablosundaki transient'ları veritabanından sorgula
wp db query "SELECT option_name FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%' ORDER BY option_name;" 2>/dev/null | wc -l
Gerçek bir troubleshooting vakası: Bir e-ticaret sitesinde sepete ürün ekleyince fiyatlar yanlış görünüyordu. Sorunu araştırırken şu adımları izledim:
# 1. Adım: Cache türünü doğrula
wp cache type
# Çıktı: Redis
# 2. Adım: Fiyatla ilgili transient'ları bul
wp transient list | grep -i "price"
wp transient list | grep -i "cart"
# 3. Adım: Şüpheli transient'ı oku
wp transient get wc_var_prices_hash_XXXXXXXX
# 4. Adım: Önce hedefli temizlik dene
wp cache delete wc_product_* woocommerce
# 5. Adım: Düzelmezse tam flush
wp cache flush
wp transient delete --all
# 6. Adım: Sorunu doğrula, WooCommerce ürün fiyat cache'ini yeniden oluşturmasını izle
wp wc tool run clear_transients --user=admin
Page Cache Eklentileriyle Entegrasyon
WP-CLI wp cache komutu WordPress’in built-in object cache’ini yönetiyor. Ama W3 Total Cache, WP Rocket, LiteSpeed Cache gibi eklentilerin page cache’leri için de WP-CLI komutları mevcut.
# W3 Total Cache
wp w3-total-cache flush all
wp w3-total-cache flush pgcache
wp w3-total-cache flush dbcache
wp w3-total-cache flush objectcache
# WP Rocket
wp rocket clean --confirm
# LiteSpeed Cache
wp litespeed-purge all
# Autoptimize
wp autoptimize clear
# Cache Enabler
wp cache-enabler clear
Bu komutların çalışması için ilgili eklentinin kurulu ve aktif olması gerekiyor. Deploy pipeline’ınıza veya cron job’larınıza bu komutları ekleyerek tüm cache katmanlarını tek seferde temizleyebilirsiniz.
Production Deploy Sonrası Cache Temizleme Akışı
Bir WordPress sitesini güncelledikten veya yeni bir versiyon deploy ettikten sonra kullandığım standart akış:
#!/bin/bash
# post-deploy-cache-flush.sh
# Deploy pipeline'ının son adımı olarak çalıştırın
WP_PATH="/var/www/html/siteniz"
SITE_URL="https://siteniz.com"
echo "Deploy sonrası cache temizleme başlıyor..."
# 1. WordPress core cache flush
wp --path=$WP_PATH cache flush
echo "[OK] Object cache temizlendi"
# 2. Tüm transient'ları temizle (deploy sonrası tam temizlik şart)
wp --path=$WP_PATH transient delete --all
echo "[OK] Transient cache temizlendi"
# 3. Rewrite kurallarını yenile (permalink değişikliği olduysa)
wp --path=$WP_PATH rewrite flush
echo "[OK] Rewrite kuralları yenilendi"
# 4. Autoloader cache yenile (composer kullanıyorsanız)
# composer dump-autoload -o
# 5. Page cache eklentisini flush et
if wp --path=$WP_PATH plugin is-active wp-rocket 2>/dev/null; then
wp --path=$WP_PATH rocket clean --confirm
echo "[OK] WP Rocket cache temizlendi"
elif wp --path=$WP_PATH plugin is-active litespeed-cache 2>/dev/null; then
wp --path=$WP_PATH litespeed-purge all
echo "[OK] LiteSpeed cache temizlendi"
elif wp --path=$WP_PATH plugin is-active w3-total-cache 2>/dev/null; then
wp --path=$WP_PATH w3-total-cache flush all
echo "[OK] W3 Total Cache temizlendi"
fi
# 6. Opcache yenile (PHP opcache)
php -r "if(function_exists('opcache_reset')) { opcache_reset(); echo 'Opcache resetlendin'; }"
echo ""
echo "=== Tüm cache katmanları temizlendi ==="
echo "Site: $SITE_URL"
echo "Tarih: $(date)"
Bu scripti Git hook’larınıza, Ansible playbook’larınıza veya CI/CD pipeline’ınıza ekleyebilirsiniz.
Dikkat Edilmesi Gereken Noktalar
Cache yönetiminde kaçınılması gereken hatalar ve akılda tutulması gerekenler:
Cache flush sıklığı: Çok sık flush yapmak performansı artırmak bir yana düşürüyor. Her flush sonrası WordPress veritabanını ve harici servisleri yeniden sorguluyor. Özellikle yüksek trafikli sitelerde ani flush işlemleri database’e yük bindiriyor.
--allow-root kullanımı: Root kullanıcısıyla WP-CLI çalıştırıyorsanız --allow-root flag’i gerekiyor. Ama mümkünse www-data veya site sahibi kullanıcıyla çalışın.
Multisite ve network transient farkı: wp transient delete --all sadece current site’ın transient’larını siliyor. Network transient’ları için --network flag’ini unutmayın.
Redis database seçimi: Redis birden fazla veritabanı destekliyor (0-15 arası). WordPress’in hangi veritabanını kullandığını wp-config.php‘deki WP_REDIS_DATABASE sabitiyle belirleyebilirsiniz. wp redis flush sadece WordPress’in kullandığı veritabanını temizliyor.
Transient değer boyutu: Bazı eklentiler transient’lara çok büyük veriler yazıyor. wp transient list --fields=name,value_length ile büyük transient’ları tespit edip ilgili eklentiyi optimize edebilirsiniz.
Sonuç
wp cache ve wp transient komutları, WordPress önbellek yönetimini gerçek anlamda kontrol altına almanızı sağlıyor. Kontrol panelindeki “Cache Temizle” düğmesine basmak çoğu zaman yeterli gelmiyor çünkü sadece page cache’i etkiliyor. Object cache, transient cache ve Redis gibi persistent cache backend’leri ayrıca yönetilmesi gereken katmanlar.
Pratikte önerim şu: Sunucularınıza bir cache monitoring scripti kurun, transient sayısını haftalık loglayın ve süresi dolmuş transient temizliğini cron’a bağlayın. Deploy workflow’unuza cache flush adımını ekleyin. Ve sorun yaşadığınızda önce wp cache type ile başlayın, cache türünü bilmeden troubleshooting yapmak çok zaman kaybettiriyor.
WP-CLI ile cache yönetimi alışkanlık haline geldiğinde, sunucunun ne yaptığını gerçekten görmeye başlıyorsunuz. Siyah kutu olmaktan çıkıyor, anlaşılır bir sistem haline geliyor. Bu da hem performans optimizasyonunu hem de sorun çözmeyi çok daha kolay kılıyor.
