WP CLI ile wp rewrite Kullanarak Kalıcı Bağlantı Yapılandırması

WordPress sitenizin URL yapısı, hem kullanıcı deneyimi hem de SEO açısından kritik bir öneme sahiptir. Yeni bir tema kurduğunuzda, eklenti değiştirdiğinizde ya da sunucu taşıması yaptığınızda “404 Not Found” hataları almaya başlarsınız. Klasik çözüm WordPress yönetim paneline girip Ayarlar > Kalıcı Bağlantılar sayfasını açmak ve kaydet butonuna tıklamaktır. Ama onlarca, yüzlerce siteniz varsa? İşte tam burada wp rewrite komutu hayat kurtarır.

wp rewrite Nedir ve Neden Kullanmalısınız?

WP CLI’ın wp rewrite modülü, WordPress’in yeniden yazma (rewrite) kurallarını komut satırından yönetmenizi sağlar. Sunucuya SSH ile bağlandığınızda, tarayıcı açmadan, panel görmeden tüm kalıcı bağlantı yapılandırmasını dakikalar içinde halledebilirsiniz.

Özellikle şu senaryolarda vazgeçilmezdir:

  • Toplu WordPress güncellemeleri sonrası bozulan permalink yapıları
  • Yeni sunucuya taşınan sitelerde .htaccess sorunları
  • Deployment pipeline’larınızda otomatik yapılandırma adımları
  • Staging’den production’a geçiş süreçleri
  • Multisite kurulumlarında merkezi yönetim

wp rewrite komutunun temel alt komutları şunlardır:

  • wp rewrite flush: Mevcut rewrite kurallarını temizler ve yeniden oluşturur
  • wp rewrite list: Sistemde kayıtlı tüm rewrite kurallarını listeler
  • wp rewrite structure: Kalıcı bağlantı yapısını ayarlar

Temel Kullanım: wp rewrite flush

En çok kullanılan komut budur. Permalink yapısını kaydettikten sonra kuralların aktif hale gelmesi için rewrite kurallarının yenilenmesi gerekir.

wp rewrite flush

Bu komut çalıştırıldığında WordPress’in wp_rewrite->flush_rules() fonksiyonunu tetikler. .htaccess dosyasını otomatik olarak günceller (eğer yazma izni varsa).

Eğer .htaccess dosyasına yazma iznini vermek istemiyorsanız ya da Nginx kullanıyorsanız, --hard parametresi olmadan çalıştırabilirsiniz:

wp rewrite flush --hard

–hard parametresi ile çalıştırdığınızda komut, veritabanındaki rewrite kurallarını tamamen siler ve WordPress’i tüm kuralları sıfırdan oluşturmaya zorlar. Bu, özellikle sorunlu kuralları temizlemek için idealdir.

Pratik bir senaryo düşünelim: Müşterinizin sitesine yeni bir WooCommerce eklentisi kurdunuz ve ürün sayfaları 404 dönmeye başladı.

# Önce sitenizin dizinine gidin
cd /var/www/html/musterisitesi

# Rewrite kurallarını sert sıfırlama ile yenileyin
wp rewrite flush --hard

# Başarılı çıktı şöyle görünür:
# Success: Rewrite rules flushed.

Kalıcı Bağlantı Yapısını Ayarlamak: wp rewrite structure

Bu komut, WordPress yönetim panelindeki “Kalıcı Bağlantılar” sayfasının komut satırı karşılığıdır. Permalink yapınızı tek satırda belirleyebilirsiniz.

Popüler Permalink Yapıları

Yazı adına göre (en yaygın SEO dostu yapı):

wp rewrite structure '/%postname%/'

Tarih ve yazı adına göre:

wp rewrite structure '/%year%/%monthnum%/%day%/%postname%/'

Kategori ve yazı adına göre:

wp rewrite structure '/%category%/%postname%/'

Sayısal yapı (eski sitelerde performans için tercih edilebilir):

wp rewrite structure '/%post_id%'

Özel karma yapı (bazı kurumsal sitelerde kullanılır):

wp rewrite structure '/%year%/%postname%/'

wp rewrite structure komutunu çalıştırdıktan sonra her zaman wp rewrite flush ile kuralları yenileyin:

wp rewrite structure '/%postname%/' && wp rewrite flush --hard

Bu tek satır komut, yapıyı ayarlayıp hemen kuralları yeniler. Bash’te && operatörü ilk komut başarılı olursa ikincisini çalıştırır, yani bir hata varsa flush adımı atlanır.

Mevcut Kuralları Listelemek: wp rewrite list

Sisteminizde hangi rewrite kurallarının aktif olduğunu görmek için bu komutu kullanırsınız. Özellikle hata ayıklarken çok işe yarar.

wp rewrite list

Çıktı uzun olabilir çünkü WordPress ve eklentiler onlarca kural ekler. Çıktıyı daha okunabilir hale getirmek için filtreler kullanabilirsiniz:

# Sadece belirli bir pattern'i içeren kuralları görmek için
wp rewrite list | grep "product"

# Kuralları CSV formatında kaydetmek için
wp rewrite list --format=csv > rewrite_rules.csv

# JSON formatında çıktı almak için
wp rewrite list --format=json

WooCommerce kurulu bir sitede bu komutu çalıştırdığınızda product, product-category, shop gibi onlarca kuralın listelendiğini görürsünüz. Bu kurallardan birinin eksik olması o URL’nin 404 dönmesine yol açar.

Gerçek Dünya Senaryosu 1: Toplu Site Yapılandırması

Diyelim ki bir ajans olarak 20 müşteri sitesi yönetiyorsunuz. Sunucu taşıması yaptınız ve tüm sitelerin permalink kurallarını yenilemeniz gerekiyor. Her site için ayrı ayrı panele girmeniz saatler alır. Bunun yerine şu Bash scriptini kullanabilirsiniz:

#!/bin/bash
# Tüm WordPress sitelerinde rewrite flush uygula

SITES_DIR="/var/www/html"
LOG_FILE="/var/log/wp_rewrite_flush.log"

echo "=== Rewrite Flush Başlıyor: $(date) ===" >> $LOG_FILE

for site_dir in $SITES_DIR/*/; do
    if [ -f "$site_dir/wp-config.php" ]; then
        site_name=$(basename $site_dir)
        echo "İşleniyor: $site_name"
        
        result=$(wp rewrite flush --hard --path="$site_dir" 2>&1)
        
        if [ $? -eq 0 ]; then
            echo "[BAŞARILI] $site_name" >> $LOG_FILE
        else
            echo "[HATA] $site_name: $result" >> $LOG_FILE
        fi
    fi
done

echo "=== İşlem Tamamlandı: $(date) ===" >> $LOG_FILE
echo "Log dosyası: $LOG_FILE"

Bu scripti çalıştırmak için:

chmod +x rewrite_flush_all.sh
./rewrite_flush_all.sh

Script, her WordPress dizinini kontrol eder, wp-config.php dosyası varsa WordPress sitesi olarak tanır ve --path parametresiyle doğru dizinde komutu çalıştırır. Tüm işlemler log dosyasına yazılır.

Gerçek Dünya Senaryosu 2: Deployment Pipeline’ına Entegrasyon

Modern WordPress geliştirme süreçlerinde deployment sonrası rewrite flush şart haline gelmiştir. Bir GitHub Actions ya da basit bir deployment script’inde şu adımları kullanabilirsiniz:

#!/bin/bash
# deploy.sh - WordPress deployment sonrası adımlar

set -e  # Hata olursa dur

DEPLOY_PATH="/var/www/html/production"
WP_CLI="wp --path=$DEPLOY_PATH"

echo "Deployment sonrası adımlar başlıyor..."

# 1. Veritabanı güncellemelerini çalıştır
$WP_CLI core update-db

# 2. Kalıcı bağlantı yapısını doğrula ve ayarla
echo "Permalink yapısı ayarlanıyor..."
$WP_CLI rewrite structure '/%postname%/'

# 3. Rewrite kurallarını yenile
echo "Rewrite kuralları yenileniyor..."
$WP_CLI rewrite flush --hard

# 4. Önbelleği temizle (eğer WP Super Cache veya W3TC varsa)
if $WP_CLI plugin is-active wp-super-cache 2>/dev/null; then
    $WP_CLI super-cache flush
fi

echo "Deployment tamamlandı!"

Bu yaklaşımın güzelliği, deployment her çalıştığında tutarlı bir yapılandırma sağlamasıdır. İnsan hatasını ortadan kaldırır.

Gerçek Dünya Senaryosu 3: WooCommerce Permalink Sorunlarını Çözmek

WooCommerce’in shop, product, cart ve checkout URL’leri bazen karışabilir. Özellikle tema değişikliği ya da eklenti güncellemesinden sonra ürün sayfaları çalışmayı durdurabilir.

# Önce mevcut WooCommerce sayfalarını kontrol edin
wp option get woocommerce_shop_page_id
wp option get woocommerce_cart_page_id
wp option get woocommerce_checkout_page_id

# WooCommerce endpoint'lerini kontrol edin
wp option get woocommerce_myaccount_page_id

# Rewrite kurallarını sıfırlayın
wp rewrite flush --hard

# WooCommerce'e özgü rewrite kurallarını kontrol edin
wp rewrite list | grep -E "(product|shop|cart|checkout)"

Eğer sorun devam ediyorsa WooCommerce’in kendi ayarlarını da sıfırlamak gerekebilir:

# WooCommerce endpoint'lerini sıfırla
wp option update woocommerce_checkout_pay_endpoint "order-pay"
wp option update woocommerce_checkout_order_received_endpoint "order-received"
wp option update woocommerce_myaccount_orders_endpoint "orders"

# Tekrar flush yapın
wp rewrite flush --hard

# Kontrol amaçlı product kurallarını listeleyin
wp rewrite list | grep product | head -20

Nginx Kullananlar İçin Özel Notlar

Eğer sunucunuzda Apache yerine Nginx kullanıyorsanız, .htaccess dosyası çalışmaz. WordPress rewrite kurallarını Nginx konfigürasyonuna elle eklemeniz gerekir. wp rewrite flush komutu bu durumda veritabanını günceller ama Nginx config dosyasını değiştirmez.

Nginx için temel WordPress konfigürasyonu şöyle olmalıdır:

server {
    listen 80;
    server_name example.com;
    root /var/www/html/wordpress;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Bu konfigürasyonla try_files $uri $uri/ /index.php?$args; satırı WordPress’in URL yönlendirmesini sağlar. wp rewrite flush komutunu Nginx’te çalıştırırsanız --hard olmadan kullanın, çünkü .htaccess‘e yazma girişimi hata üretebilir.

# Nginx'te güvenli flush
wp rewrite flush
# veya
wp rewrite flush --hard 2>/dev/null && echo "Flush tamamlandı"

Sık Yapılan Hatalar ve Çözümleri

Hata 1: “Error: WordPress is not installed” mesajı

Bu hata, yanlış dizinde komutu çalıştırdığınız anlamına gelir. Çözüm:

# --path parametresini açıkça belirtin
wp rewrite flush --path=/var/www/html/wordpress

Hata 2: “.htaccess dosyası yazılamıyor”

WordPress dizininde .htaccess dosyası yoksa ya da yazma izni yoksa sorun çıkar:

# .htaccess dosyasını oluşturun ve izin verin
touch /var/www/html/wordpress/.htaccess
chown www-data:www-data /var/www/html/wordpress/.htaccess
chmod 644 /var/www/html/wordpress/.htaccess

# Sonra flush yapın
wp rewrite flush --hard

Hata 3: Çok sayıda 404 hatası flush sonrası da devam ediyor

Bu durumda Apache’nin mod_rewrite modülünün aktif olup olmadığını kontrol edin:

# mod_rewrite durumunu kontrol et
apache2ctl -M | grep rewrite

# Aktif değilse etkinleştirin
a2enmod rewrite
systemctl restart apache2

# Sonra tekrar flush yapın
wp rewrite flush --hard

Hata 4: Multisite kurulumlarında flush sorunu

WordPress Multisite kurulumlarında her site için ayrı flush gerekebilir:

# Network'teki tüm sitelerin ID'lerini listele
wp site list --field=blog_id

# Her site için ayrı flush yap
for blog_id in $(wp site list --field=blog_id); do
    echo "Site $blog_id için flush yapılıyor..."
    wp rewrite flush --hard --url=$(wp site url $blog_id)
done

Otomatik Crontab ile Periyodik Flush

Bazı durumlarda, özellikle aktif geliştirme ortamlarında, periyodik olarak rewrite kurallarını yenilemek isteyebilirsiniz. Bunu crontab ile otomatize edebilirsiniz:

# Crontab düzenlemesi için
crontab -e

# Her gece 03:00'da rewrite flush (production için önerilmez, staging için ideal)
0 3 * * * /usr/local/bin/wp rewrite flush --hard --path=/var/www/html/staging --allow-root >> /var/log/wp_daily_flush.log 2>&1

Önemli not: Production ortamında periyodik flush kullanmayın. Bu işlem anlık bir yük oluşturabilir ve çok ziyaretçili sitelerde kısa süreli sorunlara yol açabilir. Production’da yalnızca gerektiğinde manuel flush yapın.

wp rewrite ile Özel Kural Ekleme

Standart WordPress kurulumuna ek olarak özel URL yapıları oluşturmanız gerekirse, bu kuralları functions.php ile ekleyebilir ve ardından flush ile aktif hale getirebilirsiniz. Örneğin özel bir portfolio post type için:

# Özel post type'ın rewrite kurallarını kayıt ettikten sonra
# functions.php'de register_post_type çağrısı yapıldığında
# aşağıdaki komut yeterlidir

wp rewrite flush --hard

# Kuralların geldiğini doğrulayın
wp rewrite list | grep portfolio

Kurallar listede görünüyorsa her şey yolundadır. Görünmüyorsa register_post_type çağrısında 'rewrite' => array('slug' => 'portfolio') parametresini kontrol edin.

Performans Optimizasyonu: Gereksiz Rewrite Kurallarını Temizlemek

Fazla eklenti kurulumu, veritabanında binlerce gereksiz rewrite kuralının birikmesine yol açar. Bu durum WordPress’in her istek öncesinde kuralları kontrol etmesini yavaşlatır.

# Mevcut kural sayısını öğrenin
wp rewrite list | wc -l

# Kullanılmayan eklentileri devre dışı bırakın
wp plugin deactivate kullanilmayan-eklenti

# Sert sıfırlama ile kuralları temizleyin
wp rewrite flush --hard

# Kural sayısının azaldığını doğrulayın
wp rewrite list | wc -l

Eğer kural sayısı devre dışı bırakılan eklentilerden sonra düşmüyorsa, söz konusu eklentinin kaldırma işlemini (wp plugin delete) deneyebilirsiniz.

Sonuç

wp rewrite komutu, WordPress yönetiminin en pratik araçlarından biridir. Sadece teknik bir komut değil, sistemin sağlığını koruyan bir rutin işlemin parçası olarak düşünün.

Günlük sysadmin hayatında bunu hatırlayın:

  • Yeni eklenti kurdunuzsa mutlaka wp rewrite flush --hard çalıştırın
  • Sunucu taşıması ya da PHP güncellemesi sonrasında flush atlamamak ciddi SEO kayıplarına yol açar
  • 404 hataları alıyorsanız ve sebebini bulamıyorsanız ilk çalıştırmanız gereken komut budur
  • Birden fazla siteyi yönetiyorsanız flush adımını Bash scriptlerinize dahil edin

Komut satırından WordPress yönetmek başta karmaşık görünse de zamanla panele hiç girmeden siteleri yapılandırdığınızı fark edeceksiniz. wp rewrite de bu verimliliğin temel taşlarından biridir. Bir dahaki sunucu taşımasında ya da siteye yeni eklenti kurduğunuzda artık “Permalink sayfasını açıp kaydet butonuna basacağım” demek yerine tek satır komut yeterli olacak.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir