WP CLI ile Çoklu Site Yönetimi: WordPress Multisite Rehberi

Onlarca WordPress sitesini tek tek yönetmeye çalışmak, her sysadmin’in kabusu haline gelebilir. Güncelleme yapmak için sekiz farklı panele giriş yapmak, plugin yüklemek için her siteyi ayrı ayrı dolaşmak, kullanıcı eklemek için saatlerce uğraşmak… İşte tam bu noktada WordPress Multisite ve WP-CLI ikilisi hayat kurtarıcı oluyor. Bu yazıda, çoklu WordPress sitelerini WP-CLI ile nasıl verimli şekilde yöneteceğini, gerçek dünya senaryoları üzerinden adım adım anlatacağım.

WordPress Multisite Nedir ve Ne Zaman Kullanmalısın?

WordPress Multisite, tek bir WordPress kurulumu üzerinden birden fazla site yönetmeni sağlayan bir özelliktir. Tek bir veritabanı, tek bir dosya sistemi, ama birden fazla site. Bir ajans işletiyorsan, üniversitenin farklı departmanları için siteler yönetiyorsan ya da franchise yapısında çalışan bir işletmenin web altyapısını kuruyorsan Multisite tam sana göre.

Ancak şunu da söylemeliyim: Multisite her durumda doğru seçim değildir. Siteler birbirinden çok farklı yapıdaysa, farklı sunucularda barındırılması gerekiyorsa veya bağımsız güncellenme ihtiyacı varsa, ayrı ayrı kurulumlar daha mantıklı olabilir. Ama onlarca homojen siteyi yönetiyorsan, Multisite ile WP-CLI kombinasyonu işini ciddi ölçüde kolaylaştırır.

Multisite Kurulumu: Temelden Başlayalım

Önce mevcut bir WordPress kurulumunu Multisite’a dönüştürelim. wp-config.php dosyasına bazı satırlar eklemen gerekiyor ama bunu elle yapmak yerine WP-CLI kullanacağız.

# Mevcut WordPress kurulumunu Multisite'a dönüştür
wp core multisite-convert --title="Ana Ağ"

# Yeni bir Multisite kurulumu yap (sıfırdan)
wp core multisite-install 
  --url="https://anasitem.com" 
  --title="Site Ağım" 
  --admin_user="admin" 
  --admin_email="[email protected]" 
  --admin_password="guclu_sifre_123"

Kurulum tamamlandıktan sonra WP-CLI sana wp-config.php ve .htaccess dosyalarına eklenmesi gereken kod bloklarını gösterecek. Bu bloğu kopyalayıp ilgili dosyalara yapıştır.

Subdomains yapısı mı, subdirectory yapısı mı kullanacağın konusunda karar vermeni isterim. Eğer site1.anasitem.com gibi alt alan adları kullanacaksan subdomains, anasitem.com/site1 gibi dizin yapısı istiyorsan subdirectory seçmelisin. Çoğu barındırma ortamında wildcard DNS kaydı gerektiren subdomains yapısı biraz daha fazla yapılandırma gerektiriyor.

Yeni Alt Site Oluşturma ve Yönetme

Multisite ağına yeni bir site eklemek WP-CLI ile saniyeler alıyor.

# Yeni alt site oluştur (subdirectory yapısı)
wp site create --slug="istanbul" --title="İstanbul Şubesi" --email="[email protected]"

# Subdomain yapısında site oluştur
wp site create --slug="ankara" --title="Ankara Şubesi" --email="[email protected]"

# Belirli bir kullanıcıya admin olarak atayarak site oluştur
wp site create 
  --slug="izmir" 
  --title="İzmir Şubesi" 
  --email="[email protected]" 
  --network_id=1

# Tüm siteleri listele
wp site list

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

Bir ajans senaryosu düşün: Müşteriler için her ay birkaç yeni site açıyorsun. Her birini ayrı ayrı panelden açmak yerine yukarıdaki komutları bir shell scripti içine koyabilir ve süreci tamamen otomatize edebilirsin.

Tüm Sitelerde Toplu İşlem Yapmak: site list ile Döngüler

WP-CLI’nin gerçek gücü burada ortaya çıkıyor. --url parametresi ile hangi site üzerinde işlem yapacağını belirleyebilir, bunu bir döngüyle birleştirerek tüm sitelerde aynı işlemi uygulayabilirsin.

# Tüm sitelerin ID listesini al ve döngüye sok
wp site list --field=url | while read site_url; do
  echo "İşleniyor: $site_url"
  wp --url="$site_url" plugin update --all
done

Bu tek satır, ağındaki tüm sitelerin plugin’lerini günceller. Cuma gecesi sunucunun başında oturmak yerine bu scripti cron job’a ekle ve işi bitir.

Biraz daha karmaşık bir örnek verelim. Diyelim ki tüm sitelerde WooCommerce plugin’ini aktif etmen ve ardından belirli bir ayarı yapılandırman gerekiyor:

#!/bin/bash
# multisite_woo_setup.sh
# Tüm Multisite sitelerinde WooCommerce'i aktif et ve yapılandır

SITES=$(wp site list --field=url --format=csv 2>/dev/null)

for SITE_URL in $SITES; do
  echo "=============================="
  echo "Site işleniyor: $SITE_URL"
  
  # Plugin'i aktif et
  wp --url="$SITE_URL" plugin activate woocommerce
  
  # Temel ayarları yapılandır
  wp --url="$SITE_URL" option update woocommerce_currency "TRY"
  wp --url="$SITE_URL" option update woocommerce_currency_pos "right_space"
  wp --url="$SITE_URL" option update blogname "$(wp --url="$SITE_URL" option get blogname) - Mağaza"
  
  echo "$SITE_URL tamamlandı."
done

echo "Tüm siteler güncellendi!"

Bu scripti çalıştırmadan önce bir test sitesinde dene. Üretim ortamında toplu işlem yapmak her zaman biraz risklidir.

Network Düzeyinde Plugin ve Tema Yönetimi

Multisite’ın en güzel özelliklerinden biri, plugin ve temaları network düzeyinde yönetebilmen. Bir plugin’i network’te aktif ettiğinde tüm sitelerde otomatik olarak aktif oluyor.

# Plugin'i network düzeyinde aktif et
wp plugin activate wordfence --network

# Network düzeyinde aktif plugin'leri listele
wp plugin list --network

# Belirli bir sitede plugin'i devre dışı bırak
wp --url="https://anasitem.com/istanbul" plugin deactivate contact-form-7

# Tema yükle ve network'te aktif et
wp theme install twentytwentyfour --activate
wp theme enable twentytwentyfour --network

# Belirli bir sitede tema aktif et
wp --url="https://anasitem.com/ankara" theme activate twentytwentyfour

Burada dikkat etmen gereken önemli bir nokta var: Network düzeyinde aktif etmek ile site düzeyinde aktif etmek farklı şeylerdir. Network düzeyinde aktif edilen plugin’ler site adminleri tarafından devre dışı bırakılamaz. Bu bazen istediğin şeydir (güvenlik plugin’leri gibi), bazen de kullanıcılara esneklik tanımak isteyebilirsin.

Kullanıcı Yönetimi: Multisite’da Roller ve Yetkiler

Multisite’da kullanıcı yönetimi biraz farklı çalışır. Network düzeyinde “Super Admin” rolü bulunur ve bu kişiler tüm sitelere erişebilir.

# Yeni kullanıcı oluştur ve ağa ekle
wp user create ahmet.yilmaz [email protected] 
  --user_pass="guclu_sifre" 
  --first_name="Ahmet" 
  --last_name="Yılmaz"

# Kullanıcıyı belirli bir siteye ekle
wp --url="https://anasitem.com/istanbul" user set-role ahmet.yilmaz editor

# Kullanıcıya Super Admin yetkisi ver
wp super-admin add ahmet.yilmaz

# Super Admin listesini görüntüle
wp super-admin list

# Kullanıcının tüm sitelerdeki rollerini kontrol et
wp user list --network --fields=ID,user_login,user_email,roles

Gerçek dünyada şöyle bir senaryo sık karşılaşılan bir durum: Bir müşteri, kendi sitesini yönetebilmeli ama diğer sitelere erişememeli. Bu durumda müşteriyi yalnızca kendi site URL’si ile ilişkilendirmen ve Super Admin yetkisi vermemen gerekiyor.

Veritabanı Yönetimi ve Tablo Yapısı

Multisite kurulumunda her site kendi tablo setine sahiptir. Ana site wp_options, wp_posts gibi standart tabloları kullanırken diğer siteler wp_2_options, wp_2_posts, wp_3_posts gibi ID’li tablolar kullanır.

# Belirli bir sitenin seçeneklerini sorgula
wp --url="https://anasitem.com/istanbul" option get siteurl

# Tüm sitelerde belirli bir seçeneği güncelle (toplu)
wp site list --field=url | while read SITE; do
  wp --url="$SITE" option update default_pingback_flag 0
  wp --url="$SITE" option update default_ping_status closed
  wp --url="$SITE" option update default_comment_status closed
done

# Multisite veritabanını dışa aktar
wp db export multisite_backup_$(date +%Y%m%d).sql

# Belirli bir sitenin tablolarını dışa aktar
wp db export --tables=$(wp --url="https://anasitem.com/istanbul" db tables --format=csv) istanbul_backup.sql

Veritabanı boyutu zamanla büyüyecektir. Özellikle yüksek trafikli sitelerde revision temizliği yapman önemlidir:

# Tüm sitelerde post revision'larını temizle
wp site list --field=url | while read SITE; do
  echo "Temizleniyor: $SITE"
  wp --url="$SITE" post delete 
    $(wp --url="$SITE" post list --post_type=revision --format=ids) 
    --force
done

Gerçek Dünya Senaryosu: Ajans Workflow’u

Bir dijital ajans için tipik bir Multisite workflow’u şöyle görünebilir. Ayın başında yeni müşteri geliyor, site oluşturulacak, temel plugin’ler yüklenecek, demo içerik girilecek ve müşteri erişimi açılacak.

#!/bin/bash
# yeni_musteri_site.sh
# Kullanım: ./yeni_musteri_site.sh musteri_adi musteri_email

MUSTERI_SLUG=$1
MUSTERI_EMAIL=$2
MUSTERI_TITLE="$1 Web Sitesi"
ANA_URL="https://ajansim.com"

if [ -z "$MUSTERI_SLUG" ] || [ -z "$MUSTERI_EMAIL" ]; then
  echo "Kullanım: $0 <slug> <email>"
  exit 1
fi

echo "Yeni müşteri sitesi oluşturuluyor: $MUSTERI_SLUG"

# Siteyi oluştur
wp site create 
  --slug="$MUSTERI_SLUG" 
  --title="$MUSTERI_TITLE" 
  --email="$MUSTERI_EMAIL"

SITE_URL="${ANA_URL}/${MUSTERI_SLUG}"

# Temel plugin'leri aktif et
wp --url="$SITE_URL" plugin activate 
  yoast-seo 
  wordfence 
  contact-form-7 
  wp-super-cache

# Temaı aktif et
wp --url="$SITE_URL" theme activate anasitem-tema

# Temel sayfaları oluştur
wp --url="$SITE_URL" post create 
  --post_type=page 
  --post_title="Hakkımızda" 
  --post_status=publish

wp --url="$SITE_URL" post create 
  --post_type=page 
  --post_title="İletişim" 
  --post_status=publish

# Müşteri kullanıcısı oluştur
wp user create 
  "${MUSTERI_SLUG}_admin" 
  "$MUSTERI_EMAIL" 
  --user_pass=$(openssl rand -base64 12) 
  --role=administrator

wp --url="$SITE_URL" user set-role "${MUSTERI_SLUG}_admin" administrator

echo "Site hazır: $SITE_URL"
echo "Kullanıcı oluşturuldu: ${MUSTERI_SLUG}_admin"

Bu script ile yeni müşteri onboarding sürecini dakikalar içinde tamamlayabilirsin.

Güvenlik: Multisite’da Dikkat Edilmesi Gerekenler

Multisite yapısında güvenlik tek bir kurulumu etkiliyor demektir. Bir güvenlik açığı tüm ağı tehdit edebilir. Bu yüzden bazı pratikler uygulamalısın.

# Tüm sitelerde güvenlik kontrolü yap
wp site list --field=url | while read SITE; do
  echo "=== $SITE ==="
  
  # Güncel olmayan plugin'leri listele
  wp --url="$SITE" plugin list --update=available --fields=name,version,update_version
  
  # Güncel olmayan temaları listele  
  wp --url="$SITE" theme list --update=available --fields=name,version,update_version
done

# WordPress core'u güncelle (tüm ağı etkiler)
wp core update
wp core update-db --network

# Kullanıcı şifrelerini sıfırla (güvenlik ihlali durumunda)
wp user list --field=ID | while read USER_ID; do
  wp user update $USER_ID --user_pass=$(openssl rand -base64 16)
done

Ayrıca dosya yükleme izinlerini kontrol etmeyi unutma. Multisite’da her sitenin upload dizini wp-content/uploads/sites/SITE_ID/ altında tutulur. Bu dizinlerin doğru permission’lara sahip olduğundan emin ol:

# Upload dizinlerinin izinlerini düzenle
find /var/www/html/wp-content/uploads -type d -exec chmod 755 {} ;
find /var/www/html/wp-content/uploads -type f -exec chmod 644 {} ;

Performans Optimizasyonu: Büyük Ağlarda Verimlilik

Onlarca hatta yüzlerce site barındırıyorsan performans kritik hale gelir. WP-CLI ile periyodik bakım işlemleri yapabilirsin.

#!/bin/bash
# haftalik_bakim.sh
# Her Pazar gece 02:00'de cron job olarak çalıştır

LOG_FILE="/var/log/wp_multisite_maintenance.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")

echo "[$DATE] Bakım başladı" >> $LOG_FILE

wp site list --field=url | while read SITE; do
  echo "[$DATE] İşleniyor: $SITE" >> $LOG_FILE
  
  # Geçici dosyaları temizle
  wp --url="$SITE" cache flush
  
  # Spam yorumları sil
  wp --url="$SITE" comment delete 
    $(wp --url="$SITE" comment list --status=spam --format=ids) 
    --force 2>/dev/null
  
  # Çöp kutusundaki içerikleri temizle
  wp --url="$SITE" post delete 
    $(wp --url="$SITE" post list --post_status=trash --format=ids) 
    --force 2>/dev/null
  
  # Veritabanını optimize et
  wp --url="$SITE" db optimize 2>/dev/null
  
done

echo "[$DATE] Bakım tamamlandı" >> $LOG_FILE

Bu scripti crontab’a eklemek için:

# Crontab düzenleme
crontab -e

# Şu satırı ekle:
0 2 * * 0 /bin/bash /root/scripts/haftalik_bakim.sh

Site Klonlama ve Staging Ortamı

Geliştirme sürecinde sıkça ihtiyaç duyduğun şeylerden biri de mevcut bir siteyi kopyalamak. WP-CLI bunu doğrudan desteklemese de birkaç komut kombinasyonuyla başarabilirsin.

# Mevcut siteyi klonla (örnek: istanbul sitesini izmir için kopyala)
# Önce yeni siteyi oluştur
wp site create --slug="izmir" --title="İzmir Şubesi" --email="[email protected]"

# Kaynak sitenin export'unu al
wp --url="https://anasitem.com/istanbul" export 
  --dir=/tmp/istanbul_export 
  --post_type=post,page 
  --with_attachments

# Hedef siteye import et
wp --url="https://anasitem.com/izmir" import 
  /tmp/istanbul_export/*.xml 
  --authors=create

# Ayarları kopyala
KAYNAK_SITE_URL="https://anasitem.com/istanbul"
HEDEF_SITE_URL="https://anasitem.com/izmir"

# Önemli seçenekleri kopyala
for OPTION in blogdescription admin_email timezone_string date_format time_format; do
  DEGER=$(wp --url="$KAYNAK_SITE_URL" option get $OPTION)
  wp --url="$HEDEF_SITE_URL" option update $OPTION "$DEGER"
done

Monitoring ve Raporlama

Tüm ağı izlemek için basit bir raporlama scripti hazırlayabilirsin:

#!/bin/bash
# network_rapor.sh

echo "WordPress Multisite Ağ Raporu"
echo "Tarih: $(date)"
echo "================================"

TOPLAM_SITE=$(wp site list --format=count)
echo "Toplam Site Sayısı: $TOPLAM_SITE"

echo ""
echo "Site Durumları:"

wp site list --fields=blog_id,url,last_updated | while read SATIR; do
  echo "  $SATIR"
done

echo ""
echo "Güncelleme Gerektiren Plugin'ler:"

wp site list --field=url | while read SITE; do
  GUNCELLEME=$(wp --url="$SITE" plugin list --update=available --format=count 2>/dev/null)
  if [ "$GUNCELLEME" -gt "0" ] 2>/dev/null; then
    echo "  $SITE: $GUNCELLEME plugin güncellemesi bekliyor"
  fi
done

echo ""
echo "Disk Kullanımı:"
du -sh /var/www/html/wp-content/uploads/sites/* 2>/dev/null | sort -rh | head -10

Sonuç

WordPress Multisite ve WP-CLI kombinasyonu, çoklu site yönetimini gerçekten farklı bir boyuta taşıyor. Tek tek site panelleri arasında gezip saatler harcamak yerine birkaç satır bash kodu ile tüm ağını yönetebiliyorsun. Güvenlik güncellemelerini anında uygulayabilir, yeni müşteri siteleri oluşturmayı tamamen otomatize edebilir, haftalık bakım işlemlerini cron job’larla halledebilirsin.

Başlarken küçük adımlarla ilerlemeni öneririm. Önce birkaç sitelik küçük bir ağ kur, WP-CLI komutlarını öğren, sonra scriptleri oluşturmaya başla. Üretim ortamında her toplu işlem öncesi mutlaka yedek al. wp db export ile tüm veritabanını, rsync ile dosyaları yedeklemek dakikalar alıyor ve seni büyük felaketlerden kurtarıyor.

Multisite her ortam için doğru seçim olmayabilir ama doğru kullanıldığında, özellikle ajans veya çok şubeli kurumsal yapılarda, zamandan ve emekten ciddi tasarruf sağlıyor. WP-CLI olmadan Multisite’ı yönetmeyi hayal bile etmiyorum artık.

Bir yanıt yazın

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