WP CLI ile WordPress Network Yönetimi

Eğer birden fazla WordPress sitesini tek bir kurulumdan yönetmek istiyorsanız, WordPress Multisite (Network) tam size göre. Ama asıl güç, bu yapıyı WP CLI ile yönetmeye başladığınızda ortaya çıkıyor. Tek tek admin paneline girip işlem yapmak yerine, terminal üzerinden tüm ağı kontrol edebiliyorsunuz. Bu yazıda wp network ve ilgili multisite komutlarını gerçek dünya senaryolarıyla ele alacağız.

WordPress Network Nedir, Ne Zaman Kullanılır?

WordPress Multisite, tek bir WordPress kurulumu üzerinden birden fazla site yönetmenizi sağlar. Bir ajans düşünün: 50 müşterinin sitesini ayrı ayrı güncellemek yerine, tek bir network üzerinden yönetebilirsiniz. Ya da bir üniversite: her fakülte için ayrı bir alt site, merkezi bir yönetim paneli.

Multisite kurulumunda iki tür yapı var:

  • Subdomain tabanlı: site1.domain.com, site2.domain.com
  • Subdirectory tabanlı: domain.com/site1, domain.com/site2

WP CLI’ın wp network ve ilgili komut grupları bu yapıyı terminal üzerinden tamamen yönetmenizi sağlıyor. Şimdi işin pratiğine geçelim.

WP CLI ile Network Kurulumu

Eğer henüz bir multisite kurulumunuz yoksa, WP CLI ile bunu birkaç adımda halledebilirsiniz.

# Önce standart WordPress kurulumu yapın
wp core download --locale=tr_TR

# wp-config.php oluşturun
wp config create --dbname=wpnetwork --dbuser=root --dbpass=sifre123 --dbhost=localhost

# Veritabanını oluşturun
wp db create

# WordPress kurulumu
wp core install --url=anasite.com --title="Ana Site" --admin_user=admin --admin_password=guvenli_sifre [email protected]

# Multisite'ı etkinleştirin (subdomain için)
wp core multisite-convert --subdomains

# Subdirectory için
wp core multisite-convert

Bu komutların ardından WP CLI size wp-config.php ve .htaccess dosyalarına eklemeniz gereken kodları gösterecek. O değişiklikleri yaptıktan sonra network hazır.

wp site Komutu ile Site Yönetimi

Network’teki siteleri yönetmenin ana komutu wp site. Bu komut altında site oluşturma, listeleme, silme ve çok daha fazlası var.

Yeni Site Oluşturma

# Temel site oluşturma
wp site create --slug=magazin --title="Haber Magazin" [email protected]

# Belirli bir kullanıcıya atayarak oluşturma
wp site create --slug=teknoloji --title="Teknoloji Blogu" [email protected] --user=teknoloji_editoru

# Subdomain tabanlı network için
wp site create --slug=teknoloji --title="Teknoloji" [email protected]
# Bu durumda teknoloji.anasite.com olarak erişilir

Mevcut Siteleri Listeleme

# Tüm siteleri listele
wp site list

# Sadece aktif siteleri göster
wp site list --field=url

# Belirli alanları göster
wp site list --fields=blog_id,url,last_updated

# Archived siteleri filtrele
wp site list --archived=1

Gerçek bir senaryoda bu çıktıyı bir script içinde kullanabilirsiniz. Mesela her sitede bir eklentiyi güncellemek istiyorsanız:

# Tüm site ID'lerini alıp döngüde işlem yap
for site_url in $(wp site list --field=url --format=csv); do
    echo "Güncelleniyor: $site_url"
    wp plugin update --all --url=$site_url
done

Bu tek satır (aslında birkaç satır) ile tüm network’teki sitelerin eklentilerini güncelliyorsunuz. Tek tek admin paneline girip “Güncelle” butonuna basmak yerine.

Site Silme ve Arşivleme

Bir site kapandığında onu silmek yerine arşivlemek genellikle daha güvenli bir yaklaşım.

# Siteyi arşivle (erişilemez yapar ama veri kalır)
wp site archive 5

# Siteyi aktifleştir
wp site unarchive 5

# Siteyi tamamen sil (geri dönüşü yok!)
wp site delete 5

# Onay sormadan sil
wp site delete 5 --yes

# Birden fazla siteyi sil
wp site delete 5 6 7 --yes

Önemli: wp site delete komutu veritabanından ilgili tabloları da siler. Üretim ortamında kullanmadan önce mutlaka yedek alın.

wp network Meta Yönetimi

Network seviyesindeki ayarları wp network meta ile yönetebilirsiniz.

# Network meta değerini oku
wp network meta get 1 site_name

# Network meta değeri ekle veya güncelle
wp network meta update 1 site_name "Yeni Network Adı"

# Tüm network meta değerlerini listele
wp network meta list 1

# Belirli bir meta değerini sil
wp network meta delete 1 eski_ayar

wp site meta ile Site Bazlı Ayarlar

Her sitenin kendi meta değerlerini de yönetebilirsiniz.

# Site 3 için özel meta değeri ekle
wp site meta add 3 ozel_tema_ayari "dark_mode"

# Değeri güncelle
wp site meta update 3 ozel_tema_ayari "light_mode"

# Değeri oku
wp site meta get 3 ozel_tema_ayari

# Sil
wp site meta delete 3 ozel_tema_ayari

Network Genelinde Eklenti Yönetimi

Multisite’ın en güçlü özelliklerinden biri eklentileri network genelinde etkinleştirme. WP CLI ile bu çok kolay.

# Eklentiyi network genelinde etkinleştir
wp plugin activate woocommerce --network

# Network genelinde devre dışı bırak
wp plugin deactivate woocommerce --network

# Belirli bir sitede etkinleştir
wp plugin activate contact-form-7 --url=teknoloji.anasite.com

# Tüm sitelerde tek tek etkinleştir
wp site list --field=url | xargs -I % wp plugin activate seo-plugin --url=%

Eklenti Durumunu Kontrol Etme

# Network genelinde yüklü eklentileri listele
wp plugin list --network

# Sadece network-aktif eklentileri göster
wp plugin list --status=active-network

# Belirli bir sitedeki eklenti durumunu kontrol et
wp plugin list --url=magazin.anasite.com --status=active

Network Genelinde Tema Yönetimi

Temalar da eklentiler gibi network seviyesinde yönetilebilir.

# Temayı network için etkinleştir (tüm sitelerin kullanabilmesi için)
wp theme enable astra --network

# Belirli bir temayı devre dışı bırak
wp theme disable twentytwentythree --network

# Belirli sitede tema değiştir
wp theme activate astra --url=magazin.anasite.com

# Tüm sitelerde aynı temayı etkinleştir
for site_url in $(wp site list --field=url); do
    wp theme activate astra --url=$site_url
done

Gerçek Dünya Senaryosu: Toplu Kullanıcı Yönetimi

Diyelim ki bir eğitim platformu işletiyorsunuz. Yeni dönem başladı ve 200 öğrenciyi belirli sitelere eklemeniz gerekiyor. Bunu manuel yapmak saatler alır.

#!/bin/bash
# toplu_kullanici_ekle.sh

NETWORK_URL="anasite.com"
CSV_DOSYA="ogrenciler.csv"

while IFS=, read -r email isim soyisim site_slug; do
    # Kullanıcı oluştur
    wp user create "${isim}.${soyisim}" "$email" 
        --role=subscriber 
        --first_name="$isim" 
        --last_name="$soyisim" 
        --url=$NETWORK_URL

    # Kullanıcıyı ilgili siteye ekle
    wp user set-role "${isim}.${soyisim}" subscriber 
        --url="${site_slug}.${NETWORK_URL}"

    echo "$isim $soyisim -> ${site_slug}.${NETWORK_URL} sitesine eklendi"
done < "$CSV_DOSYA"

Bu script ile CSV dosyasındaki tüm öğrencileri otomatik olarak oluşturup ilgili sitelere ekleyebilirsiniz.

Gerçek Dünya Senaryosu: Network Genelinde Seçenek Güncelleme

Tüm sitelerin zaman dilimini değiştirmeniz gerekiyor. 30 site varsa 30 kez admin paneline girmek yerine:

#!/bin/bash
# tum_sitelerde_ayar_guncelle.sh

echo "Network'teki tüm sitelerin zaman dilimi güncelleniyor..."

wp site list --field=url --format=csv | while read site_url; do
    wp option update timezone_string "Europe/Istanbul" --url=$site_url
    wp option update gmt_offset "3" --url=$site_url
    echo "$site_url -> Güncellendi"
done

echo "Tamamlandı!"

Ya da belki SMTP ayarlarını güncellemek istiyorsunuz:

# Tüm sitelerde mail gönderici adresini güncelle
for site in $(wp site list --field=url); do
    wp option update admin_email "[email protected]" --url=$site
    echo "$site güncellendi"
done

Gerçek Dünya Senaryosu: Yedekleme Script’i

Network’teki her siteyi ayrı ayrı yedekleyen bir script:

#!/bin/bash
# network_yedek.sh

YEDEK_DIZIN="/var/backups/wordpress-network"
TARIH=$(date +%Y%m%d_%H%M%S)

mkdir -p $YEDEK_DIZIN

echo "=== WordPress Network Yedekleme Başladı ==="
echo "Tarih: $TARIH"

# Veritabanını yedekle
wp db export "$YEDEK_DIZIN/tam_veritabani_$TARIH.sql"
echo "Veritabanı yedeklendi."

# Her site için ayrı içerik yedeklemesi
wp site list --fields=blog_id,url --format=csv | tail -n +1 | while IFS=, read blog_id site_url; do
    echo "Site yedekleniyor: $site_url (ID: $blog_id)"
    
    # Site medya dosyalarını yedekle
    SITE_DIZIN="$YEDEK_DIZIN/site_${blog_id}_$TARIH"
    mkdir -p $SITE_DIZIN
    
    # Site seçeneklerini dışa aktar
    wp option export --url=$site_url > "$SITE_DIZIN/options.json" 2>/dev/null || true
    
    echo "  -> Tamamlandı"
done

# Eski yedekleri temizle (30 günden eski)
find $YEDEK_DIZIN -name "*.sql" -mtime +30 -delete
echo "Eski yedekler temizlendi."

echo "=== Yedekleme Tamamlandı ==="

wp super-admin Komutu

Network’te süper admin yönetimi için özel bir komut var.

# Kullanıcıya süper admin yetkisi ver
wp super-admin add kullanici_adi

# Birden fazla kullanıcıya aynı anda ver
wp super-admin add kullanici1 kullanici2 kullanici3

# Süper admin yetkisini kaldır
wp super-admin remove kullanici_adi

# Tüm süper adminleri listele
wp super-admin list

# Liste formatını değiştir
wp super-admin list --format=json

Güvenlik açısından önemli bir not: Süper admin listesini düzenli olarak gözden geçirin. Eski çalışanların ya da eski müşterilerin hâlâ süper admin yetkisi olup olmadığını kontrol etmek için:

# Süper adminleri JSON formatında al ve incele
wp super-admin list --format=json | python3 -m json.tool

wp signups ile Kayıt Yönetimi

Eğer network’te yeni üye kayıtlarına izin veriyorsanız, bekleyen kayıtları WP CLI ile yönetebilirsiniz.

# Bekleyen kayıtları listele
wp signups list

# Belirli bir kaydı onayla
wp signups activate ACTIVATION_KEY

# Bekleyen kayıt sayısını göster
wp signups count

Network Sağlık Kontrolü

Tüm network’ün durumunu hızlıca kontrol etmek için bir script yazalım:

#!/bin/bash
# network_saglik_kontrol.sh

echo "=============================="
echo "WordPress Network Sağlık Raporu"
echo "Tarih: $(date)"
echo "=============================="

# Toplam site sayısı
SITE_SAYISI=$(wp site list --count 2>/dev/null || wp site list --format=count)
echo "Toplam site sayısı: $SITE_SAYISI"

# Arşivlenmiş siteler
ARSIVLENEN=$(wp site list --archived=1 --format=count 2>/dev/null || echo "0")
echo "Arşivlenmiş siteler: $ARSIVLENEN"

# Süper admin sayısı
echo "Süper admin sayısı: $(wp super-admin list | wc -l)"

# Her sitede WordPress çekirdeği sürümü
echo ""
echo "--- Site Durumları ---"
for site_url in $(wp site list --field=url); do
    echo -n "$site_url -> "
    WP_VER=$(wp core version --url=$site_url 2>/dev/null)
    PLUGIN_SAYI=$(wp plugin list --url=$site_url --format=count 2>/dev/null)
    echo "WP $WP_VER | $PLUGIN_SAYI eklenti"
done

echo ""
echo "--- Güncelleme Gerektiren Eklentiler ---"
for site_url in $(wp site list --field=url); do
    GUNCELLEME=$(wp plugin list --url=$site_url --update=available --format=count 2>/dev/null || echo "0")
    if [ "$GUNCELLEME" -gt "0" ]; then
        echo "$site_url: $GUNCELLEME eklenti güncellemesi bekliyor"
    fi
done

echo ""
echo "Rapor tamamlandı."

Performans İpuçları

WP CLI komutlarını network üzerinde çalıştırırken birkaç önemli nokta var.

–url parametresi: Multisite’da her zaman hangi site üzerinde işlem yaptığınızı belirtmeniz gerekiyor. Belirtmezseniz WP CLI ana siteyi kullanır.

# Ana siteye bağlı işlem
wp option get siteurl

# Alt siteye bağlı işlem
wp option get siteurl --url=magazin.anasite.com

–quiet parametresi: Script içinde gereksiz çıktıları bastırmak için kullanın.

wp plugin activate woocommerce --url=magazin.anasite.com --quiet

–allow-root: Docker container veya root kullanıcısıyla çalışıyorsanız gerekebilir.

wp site list --allow-root

Paralel işlem: Çok sayıda sitede işlem yapıyorsanız xargs ile paralel çalıştırabilirsiniz.

# 4 paralel işlemle tüm sitelerde eklenti güncelle
wp site list --field=url | xargs -P 4 -I % wp plugin update --all --url=% --quiet

Sık Yapılan Hatalar

Network yönetiminde en çok karşılaşılan sorunlardan biri --url parametresini unutmak. Özellikle gece yarısı acele bir işlem yaparken ana sitede işlem yapmak istiyorsunuz ama aklınızdan çıkıp başka bir sitede işlem yapıyorsunuz. Her zaman URL’yi açıkça belirtin.

Bir diğer yaygın hata ise eklentileri network seviyesinde devre dışı bırakmak yerine tek tek sitelerde devre dışı bırakmaya çalışmak. Eğer eklenti network genelinde aktifse, site bazlı devre dışı bırakamazsınız. Önce network seviyesinde devre dışı bırakmanız gerekir.

# Yanlış yaklaşım (network-aktif eklenti için çalışmaz)
wp plugin deactivate woocommerce --url=magazin.anasite.com

# Doğru yaklaşım
wp plugin deactivate woocommerce --network

Sonuç

WordPress Network yönetimi, başta karmaşık görünebilir ama WP CLI ile bu işler son derece sistematik hale geliyor. Tek tek admin panellerine girmek yerine, terminal üzerinden tüm ağı kontrol edebilmek hem zaman kazandırıyor hem de insan hatası riskini önemli ölçüde azaltıyor.

Özellikle birden fazla müşteri sitesi yöneten ajanslar için ya da kurumsal multisite kurulumları için bu komutları içeren otomasyon scriptleri hazırlamak, bakım işlerini ciddi ölçüde kolaylaştırır. Cronjob ile birleştirdiğinizde, güncellemeler, yedeklemeler ve sağlık kontrolleri tamamen otomatik hale gelebilir.

Burada anlattığımız wp site, wp network meta, wp super-admin ve diğer komutların tam parametre listesi için wp help site veya wp site list --help komutlarını kullanabilirsiniz. Her komutun kendi man sayfası var ve orada çok daha fazla örnek bulabilirsiniz. Pratik yaparken önce staging ortamında deneyin, üretim sistemlerinde doğrudan uygulamadan önce ne yaptığınızdan emin olun.

Bir yanıt yazın

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