WP CLI ile Veritabanında Toplu Metin Değiştirme: wp search-replace Kullanımı
WordPress site taşıma işlemlerinde en sık karşılaşılan sorunlardan biri, veritabanında eski domain adreslerinin veya yolların kalmasıdır. Yüzlerce post, binlerce meta kayıt, widget ayarları, theme options… Bunları tek tek değiştirmeye kalktığınızda saatlerce uğraşmanız gerekebilir. İşte tam bu noktada wp search-replace komutu hayat kurtarıcı oluyor. WP-CLI’ın belki de en güçlü ve en sık kullanılan komutu olan bu araçla, dakikalar içinde tüm veritabanını tarayıp toplu değişiklik yapabilirsiniz.
wp search-replace Nedir ve Neden Bu Kadar Önemli?
wp search-replace, WordPress veritabanındaki tüm tablolarda (ya da belirttiğiniz tablolarda) bir string’i bulup başkasıyla değiştiren WP-CLI komutudur. Ancak bunu sıradan bir “bul-değiştir” işlemi olarak düşünmeyin. WordPress veritabanında PHP’nin serialize ettiği veri yapıları vardır ve bunları düz metin editörüyle değiştirirseniz veritabanını bozabilirsiniz. wp search-replace bu serialize edilmiş verileri anlayarak, string uzunluklarını otomatik olarak güncelleyerek güvenli bir şekilde değişiklik yapar.
Bir WordPress veritabanında şu tür veriler serialize edilmiş halde bulunabilir:
- Theme options ve customizer ayarları
- Widget konfigürasyonları
- Plugin ayarları
- ACF (Advanced Custom Fields) verileri
- WooCommerce ayarları ve ürün meta verileri
Bu verileri phpMyAdmin’de veya doğrudan MySQL’de düz SQL sorgusuyla değiştirirseniz, serialize yapısı bozulur ve siteniz çöker. wp search-replace bunu önler.
Temel Kullanım
Komutun temel sözdizimi şöyledir:
wp search-replace 'aranacak_deger' 'yeni_deger' [tablo_adlari] [seçenekler]
En basit kullanım örneği, domain değişikliğidir:
wp search-replace 'http://eski-site.com' 'https://yeni-site.com'
Bu komut, WordPress kurulumunuzun tüm tablolarında http://eski-site.com değerini bulup https://yeni-site.com ile değiştirir. Kök dizinde çalıştırmanız yeterlidir, WordPress konfigürasyonunu otomatik olarak okur.
Dry Run ile Önce Test Edin
Gerçek bir değişiklik yapmadan önce kaç kayıt etkileneceğini görmek için --dry-run parametresini kullanın. Bu, üretim ortamında çalışırken mutlaka uygulamanız gereken bir alışkanlıktır:
wp search-replace 'http://eski-site.com' 'https://yeni-site.com' --dry-run
Çıktıda hangi tablolarda kaç kayıt etkileneceğini göreceksiniz. Beklenmedik bir sonuç varsa gerçek değişikliği yapmadan durabilirsiniz.
Önemli Parametreler
–dry-run: Değişiklik yapmadan sonuçları gösterir. Her zaman önce bunu çalıştırın.
–network: WordPress multisite kurulumlarında tüm siteleri kapsar.
–all-tables: WordPress prefix’i olmayan tablolar dahil tüm tabloları tarar.
–all-tables-with-prefix: Sadece WordPress prefix’ine sahip tabloları tarar (varsayılan davranış zaten budur ama açıkça belirtmek isterseniz).
–tables=: Hangi tablolarda arama yapılacağını virgülle belirtir.
–skip-tables=: Belirtilen tabloları atlayarak geri kalanları tarar.
–skip-columns=: Belirtilen sütunları atlar.
–include-columns=: Sadece belirtilen sütunlarda arama yapar.
–precise: Serialize edilmiş verilerde daha dikkatli, yavaş ama güvenli bir yöntem kullanır.
–recurse-objects: Nesneler içindeki nesneleri de recursive olarak işler.
–no-report: İşlem raporunu göstermez, daha temiz bir çıktı verir.
–regex: Arama değerini regex olarak yorumlar.
–regex-flags: Regex için flag belirtir (örneğin i büyük/küçük harf duyarsız).
–format=: Çıktı formatını belirler. table, json, csv değerlerini alabilir.
–export=: Değişiklikleri veritabanına uygulamak yerine SQL dosyasına yazar.
–export_insert_size=: Export işleminde her INSERT sorgusundaki satır sayısını belirler.
Gerçek Dünya Senaryoları
Senaryo 1: Site Taşıma – HTTP’den HTTPS’e Geçiş
Bir müşterinin sitesine SSL sertifikası kurdunuz ve artık HTTP’den HTTPS’e geçmeniz gerekiyor. Sadece WordPress ayarlarını değiştirmek yetmez, veritabanındaki tüm hardcoded URL’leri güncellemeniz gerekir:
# Önce backup alın!
wp db export backup-before-https.sql
# Dry run ile kontrol edin
wp search-replace 'http://musteri-sitesi.com' 'https://musteri-sitesi.com' --dry-run
# Onay gelirse gerçek değişikliği yapın
wp search-replace 'http://musteri-sitesi.com' 'https://musteri-sitesi.com'
# Cache'i temizleyin
wp cache flush
Bu işlemden sonra, bazı eski içeriklerde http:// ile başlayan resim URL’leri kalabilir. Bunlar için de ayrı bir komut çalıştırabilirsiniz:
wp search-replace 'http://musteri-sitesi.com/wp-content' 'https://musteri-sitesi.com/wp-content' --dry-run
Senaryo 2: Staging’den Production’a Geçiş
Staging ortamında geliştirme yaptınız, şimdi production’a geçiriyorsunuz. Veritabanını dışa aktardınız ve production sunucusuna import ettiniz. Şimdi URL’leri güncellemeniz gerekiyor:
# Staging URL'lerini production URL'leri ile değiştir
wp search-replace 'https://staging.musteri-sitesi.com' 'https://musteri-sitesi.com'
# Eğer staging'de farklı bir path kullandıysanız
wp search-replace '/home/staging/public_html' '/home/production/public_html'
Önemli not: Bazı sysadminler bu adımda sadece domain değiştirmeyi düşünür ama dosya yollarını unutur. ACF gibi pluginler absolute path saklayabilir. --all-tables parametresiyle tüm tabloları taramayı unutmayın.
Senaryo 3: Belirli Tablolarda Değişiklik
Bazen sadece belirli tablolarda değişiklik yapmak istersiniz. Örneğin sadece post içeriklerini güncellemek istiyorsanız:
# Sadece posts tablosunda değişiklik yap
wp search-replace 'eski-metin' 'yeni-metin' wp_posts
# Birden fazla tablo belirt
wp search-replace 'eski-metin' 'yeni-metin' wp_posts wp_postmeta
# Belirli tabloları atla
wp search-replace 'eski-metin' 'yeni-metin' --skip-tables=wp_users,wp_usermeta
Senaryo 4: WooCommerce Ürün URL Değişikliği
WooCommerce mağazanızda tüm ürünlerin bir özelliğini toplu güncellemek istiyorsunuz. Örneğin, ürün açıklamalarında geçen bir marka adı değişti:
# Önce hangi tablolarda bu marka adı geçiyor görelim
wp search-replace 'EskiMarka' 'YeniMarka' --dry-run
# Sadece ürün içeriklerinde değiştir
wp search-replace 'EskiMarka' 'YeniMarka' wp_posts wp_postmeta --dry-run
# Onay sonrası uygula
wp search-replace 'EskiMarka' 'YeniMarka' wp_posts wp_postmeta
WooCommerce’de dikkat edilmesi gereken bir nokta: Ürün fiyatları ve stok bilgileri de meta tablolarında tutulur. Bu bilgilerin üzerinde search-replace yaparken çok dikkatli olun, sayısal değerlerin yanlışlıkla değişmemesi için arama kriterlerinizi çok spesifik tutun.
Senaryo 5: Multisite Kurulumda Toplu Değişiklik
WordPress multisite kullanıyorsanız ve ağdaki tüm sitelerde değişiklik yapmanız gerekiyorsa:
# Tüm multisite ağında değişiklik yap
wp search-replace 'http://eski-network.com' 'https://yeni-network.com' --network
# Multisite'da belirli blog ID'si için
wp --url=http://alt-site.yeni-network.com search-replace 'eski-deger' 'yeni-deger'
Senaryo 6: Regex ile Gelişmiş Arama
Basit string eşleştirme yetmediğinde, regex kullanabilirsiniz. Örneğin, tüm HTTP URL’lerini HTTPS’e çevirmek ama sadece kendi domain’inizdekini değil, tüm HTTP URL’lerini değiştirmek istiyorsanız:
# HTTP ile başlayan tüm URL'leri HTTPS yap (sadece posts tablosunda)
wp search-replace 'http://' 'https://' wp_posts --dry-run
# Regex ile daha spesifik bir pattern
wp search-replace 'src="http://([^"]+)"' 'src="https://$1"' wp_posts --regex --dry-run
Regex kullanırken çok dikkatli olun. Üretim ortamında regex search-replace yapmadan önce mutlaka bir backup alın ve dry-run ile test edin.
Senaryo 7: Değişiklikleri SQL Dosyasına Export Etmek
Değişiklikleri doğrudan veritabanına uygulamak yerine bir SQL dosyasına kaydetmek isteyebilirsiniz. Bu özellikle değişiklikleri incelemek veya başka bir ortamda uygulamak için kullanışlıdır:
# Değişiklikleri SQL dosyasına yaz, veritabanına uygulama
wp search-replace 'eski-site.com' 'yeni-site.com' --export=degisiklikler.sql
# Sonra bu dosyayı inceleyip uygulamak istediğinizde
wp db import degisiklikler.sql
Büyük Veritabanlarında Performans
Büyük WooCommerce sitelerinde milyonlarca satır olabilir. Bu durumlarda wp search-replace çok uzun sürebilir ve zaman aşımı sorunları yaşanabilir. Birkaç strateji:
# Tablo tablo işlem yapın, her seferinde tek bir tablo
wp search-replace 'eski-deger' 'yeni-deger' wp_posts
wp search-replace 'eski-deger' 'yeni-deger' wp_postmeta
wp search-replace 'eski-deger' 'yeni-deger' wp_options
# Nohup ile background'da çalıştırın (uzun sürecek işlemler için)
nohup wp search-replace 'eski-deger' 'yeni-deger' wp_postmeta > search-replace-log.txt 2>&1 &
# İşlemin durumunu takip edin
tail -f search-replace-log.txt
Ayrıca --sleep parametresiyle işlemler arasına bekleme süresi ekleyebilirsiniz, bu sunucu yükünü azaltır:
wp search-replace 'eski-deger' 'yeni-deger' --sleep=0.1
Sık Yapılan Hatalar ve Çözümleri
Hata 1: wp_options tablosundaki siteurl ve home değişmedi
Bazen WordPress bu değerleri cache’ler. Search-replace sonrası:
wp cache flush
wp rewrite flush
komutlarını çalıştırın.
Hata 2: Resimler hala eski URL’leri gösteriyor
Resim URL’leri bazen wp_postmeta tablosında serialize edilmiş attachment metadata içinde saklanır:
# Attachment meta verilerini de güncelle
wp search-replace 'eski-site.com' 'yeni-site.com' wp_postmeta --dry-run
# Regenerate attachment metadata
wp media regenerate --yes
Hata 3: Multisite’da yanlış prefix
Multisite kurulumlarında her sitenin kendi tabloları vardır (wp_2_posts, wp_3_posts gibi). --network parametresi bunları otomatik olarak kapsar, ancak --all-tables-with-prefix kullanıyorsanız dikkat edin.
Hata 4: Büyük/küçük harf duyarlılığı
MySQL varsayılan olarak büyük/küçük harf duyarsız arama yapar ama WP-CLI PHP katmanında işlem yaptığı için duyarlıdır. Büyük/küçük harf farkını gözetmeden aramak isterseniz:
wp search-replace 'eskisite' 'yenisite' --regex --regex-flags=i
Backup Almayı Asla Atlamayın
Bu kadar güçlü bir komut kullanırken backup almak hayati önem taşır. WP-CLI ile backup almak çok kolay:
# Tam veritabanı yedeği
wp db export backup-$(date +%Y%m%d-%H%M%S).sql
# Sadece belirli tabloları yedekle
wp db export --tables=wp_posts,wp_postmeta backup-posts-$(date +%Y%m%d).sql
# Gzip ile sıkıştırılmış yedek
wp db export - | gzip > backup-$(date +%Y%m%d).sql.gz
Backup alıp almadığınızı doğrulayın:
# Dosya boyutunu kontrol edin
ls -lh backup-*.sql
# Hızlı bir integrity check
wp db check
Pratik Workflow: Site Taşıma Checklist
Bir site taşıma operasyonunda kullandığım standart workflow şöyle:
# 1. Backup al
wp db export backup-pre-migration-$(date +%Y%m%d-%H%M%S).sql
# 2. Mevcut siteurl ve home değerlerini kontrol et
wp option get siteurl
wp option get home
# 3. Dry run
wp search-replace 'https://eski-site.com' 'https://yeni-site.com' --dry-run
# 4. Değişikliği uygula
wp search-replace 'https://eski-site.com' 'https://yeni-site.com'
# 5. Dosya yollarını da güncelle (gerekirse)
wp search-replace '/var/www/eski-site' '/var/www/yeni-site' --dry-run
wp search-replace '/var/www/eski-site' '/var/www/yeni-site'
# 6. Options tablosunu doğrula
wp option get siteurl
wp option get home
# 7. Cache temizle
wp cache flush
wp rewrite flush --hard
# 8. Sonucu doğrula
wp option list --search='*url*'
–precise Parametresi Ne Zaman Kullanılmalı?
Varsayılan olarak wp search-replace, serialize edilmiş verileri PHP’nin unserialize fonksiyonu ile işler ve sonucu tekrar serialize eder. --precise parametresi ise regex tabanlı bir yaklaşım kullanarak serialize yapısını daha detaylı analiz eder. Bu yöntem daha yavaştır ama karmaşık, iç içe geçmiş serialize yapılarında daha güvenilirdir:
# Karmaşık serialize verileri içeren tablolarda --precise kullanın
wp search-replace 'eski-deger' 'yeni-deger' wp_options --precise
Özellikle ACF, Elementor, Beaver Builder gibi page builder verilerinde --precise kullanmanızı öneririm.
Sonuç
wp search-replace komutu, WordPress yönetiminde zaman kazandıran en kritik araçlardan biridir. Site taşımadan URL güncellemesine, içerik temizliğinden toplu düzenlemeye kadar onlarca senaryoda kullanabilirsiniz.
Özetlemek gerekirse:
- Her zaman önce
--dry-runile test edin - Büyük değişiklikler öncesi mutlaka
wp db exportile backup alın - Serialize edilmiş veriler içeren karmaşık yapılarda
--precisekullanın - Büyük veritabanlarında tablo tablo ilerleyin
- İşlem sonrası
wp cache flushvewp rewrite flushyapmayı unutmayın - Multisite’da
--networkparametresini kullanın
Bu komutu düzenli kullanan bir sysadmin olarak şunu söyleyebilirim: Bir kez alıştıktan sonra site taşıma işlemleri artık sizi korkutmuyor. Eski yöntemlerle saatler alan işlemler, WP-CLI ile dakikalar içinde halledilebiliyor. Kalan zamanı daha verimli işlere harcayabilirsiniz.
