WP CLI ile Gönderi Oluşturma ve Toplu Gönderi Yönetimi

WordPress sitenizi terminal üzerinden yönetmek, özellikle yüzlerce gönderi ile uğraşıyorsanız hayat kurtarıcı bir beceri. WP CLI’nin wp post komutu, gönderi oluşturmaktan toplu silmeye, meta verileri güncellemekten durum değiştirmeye kadar neredeyse her şeyi komut satırından yapmanızı sağlıyor. Eğer hâlâ her gönderi için WordPress admin panelini açıyorsanız, bu yazıyı okuduktan sonra çok şeyin değişeceğini söyleyebilirim.

wp post Komutuna Genel Bakış

wp post komutu, WordPress’in gönderi sistemiyle doğrudan etkileşim kurmanızı sağlar. Standart blog yazıları, sayfalar, özel gönderi tipleri, ürünler (WooCommerce) gibi tüm post_type değerleriyle çalışır. Temel alt komutlar şunlar:

  • wp post create: Yeni gönderi oluşturur
  • wp post update: Mevcut gönderiyi günceller
  • wp post delete: Gönderi siler
  • wp post get: Gönderi detaylarını getirir
  • wp post list: Gönderileri listeler
  • wp post meta: Gönderi meta verilerini yönetir
  • wp post term: Gönderi kategori ve etiket ilişkilerini yönetir
  • wp post generate: Test amaçlı toplu gönderi üretir

Komutları çalıştırmadan önce doğru WordPress kök dizininde olduğunuzdan emin olun ya da --path parametresiyle dizini belirtin.

Temel Gönderi Oluşturma

En basit hâliyle bir blog yazısı oluşturmak için şu komutu kullanırsınız:

wp post create 
  --post_title="WP CLI ile Hayatı Kolaylaştırın" 
  --post_content="Bu yazıda WP CLI'nin gücünü keşfedeceğiz." 
  --post_status="publish" 
  --post_author=1

Bu komut çalıştıktan sonra terminal size oluşturulan gönderinin ID’sini verir. Örneğin Success: Created post 42. gibi bir çıktı görürsünüz. Bu ID’yi not etmek, ilerleyen adımlarda işinize yarayacak.

Gönderi oluştururken kullanabileceğiniz başlıca parametreler:

  • –post_title: Gönderi başlığı
  • –post_content: Gönderi içeriği (HTML de olabilir)
  • –post_excerpt: Gönderi özeti
  • –post_status: publish, draft, pending, private, trash
  • –post_type: post, page, özel tipler (default: post)
  • –post_author: Yazar kullanıcı ID’si
  • –post_date: Yayın tarihi (YYYY-MM-DD HH:MM:SS formatında)
  • –post_category: Virgülle ayrılmış kategori ID’leri
  • –tags_input: Virgülle ayrılmış etiket adları
  • –post_name: URL slug değeri
  • –menu_order: Sıralama değeri
  • –comment_status: open veya closed
  • –porcelain: Sadece ID döndürür, otomasyon için ideal

Dosyadan İçerik Yükleme

Uzun içerikli gönderiler için içeriği doğrudan komut satırına yazmak pek kullanışlı değil. Bunun yerine bir dosyadan okutabilirsiniz:

# Önce içerik dosyasını oluşturun
cat > /tmp/makale.txt << 'EOF'
<h2>Giriş</h2>
<p>Bu makalede Linux sistem yönetiminin temellerini ele alıyoruz.</p>
<h2>Temel Kavramlar</h2>
<p>Süreç yönetimi, dosya sistemi ve ağ yapılandırması kritik konulardır.</p>
EOF

# Dosyadan içerik yükleyerek gönderi oluşturun
wp post create 
  --post_title="Linux Sistem Yönetimi Temelleri" 
  --post_content="$(cat /tmp/makale.txt)" 
  --post_status="draft" 
  --post_author=1 
  --post_type="post"

Bu yaklaşım özellikle migration senaryolarında çok işe yarıyor. Eski sistemden export aldığınız içerikleri tek tek işleyebilirsiniz.

Gönderileri Listeleme ve Filtreleme

Toplu yönetim yapabilmek için önce hangi gönderilerle çalışacağınızı belirlemeniz gerekiyor. wp post list komutu bu iş için güçlü filtreleme seçenekleri sunuyor:

# Tüm yayınlanmış gönderileri listele
wp post list --post_status=publish --fields=ID,post_title,post_date

# Belirli bir yazara ait taslakları bul
wp post list 
  --post_status=draft 
  --author=3 
  --fields=ID,post_title,post_author

# Belirli kategorideki gönderileri listele (kategori ID: 5)
wp post list 
  --post_status=publish 
  --category=5 
  --fields=ID,post_title 
  --format=csv

# Son 30 günde oluşturulan tüm gönderileri bul
wp post list 
  --date_query_after="30 days ago" 
  --post_status=publish 
  --fields=ID,post_title,post_date

--format parametresi oldukça kullanışlı. table, csv, json, ids seçeneklerini kullanabilirsiniz. Özellikle --format=ids ile sadece ID listesi alıp bunu başka komutlara pipe etmek, toplu işlemlerin temel taşı.

Mevcut Gönderiyi Güncelleme

Gönderi güncelleme işlemleri de wp post update komutuyla yapılıyor. ID bilgisini bilmeniz yeterli:

# Tek bir gönderiyi güncelle
wp post update 42 
  --post_title="Yeni Başlık" 
  --post_status="publish"

# Birden fazla gönderiyi aynı anda güncelle
wp post update 42 56 78 
  --post_status="draft"

# Yorum durumunu tüm gönderilerde kapat (script ile)
wp post list --format=ids --post_status=publish | 
  xargs -I {} wp post update {} --comment_status=closed

Son örnekteki xargs kullanımı çok güçlü bir pattern. wp post list --format=ids çıktısını alıp her ID için wp post update komutunu çalıştırıyor. Bu yaklaşımı birçok senaryoda kullanacağız.

Toplu Gönderi Silme

Çöp gönderileri temizlemek, eski taslakları silmek ya da test içeriklerinden kurtulmak için toplu silme komutları:

# Tek bir gönderiyi çöp kutusuna taşı
wp post delete 42

# Kalıcı olarak sil (çöp kutusuna taşımadan)
wp post delete 42 --force

# Tüm taslakları sil
wp post delete $(wp post list --post_status=draft --format=ids) --force

# Belirli bir tarihten önce oluşturulan tüm gönderileri sil
wp post list 
  --post_status=publish 
  --date_query_before="2020-01-01" 
  --format=ids | 
  xargs wp post delete --force

# Tüm test gönderilerini temizle (başlığa göre filtreleme)
wp post list 
  --post_status=any 
  --search="Test Gönderisi" 
  --format=ids | 
  xargs -r wp post delete --force

Dikkat: --force parametresi gönderileri kalıcı olarak siler, geri dönüş yoktur. Toplu silme yapmadan önce mutlaka wp post list ile hangi gönderilerin etkileneceğini doğrulayın.

Meta Veri Yönetimi

Meta veriler WordPress’in güçlü özelliklerinden biri ve WP CLI ile bunları yönetmek oldukça kolaylaşıyor:

# Bir gönderiye meta veri ekle
wp post meta add 42 "_featured" "yes"

# Meta veriyi güncelle
wp post meta update 42 "_reading_time" "5 dakika"

# Meta veriyi oku
wp post meta get 42 "_featured"

# Tüm meta verileri listele
wp post meta list 42

# Meta veriyi sil
wp post meta delete 42 "_old_meta_key"

# Toplu meta güncelleme: Belirli bir gönderinin tüm meta verilerini gör
wp post meta list 42 --format=table

Gerçek dünya senaryosu olarak düşünelim: Diyelim ki SEO eklentinizi değiştirdiniz ve eski eklentinin _yoast_wpseo_metadesc anahtarını yeni eklentinin beklediği _rankmath_description anahtarına taşımanız gerekiyor. Bunu şu şekilde yapabilirsiniz:

#!/bin/bash
# SEO meta verilerini Yoast'tan RankMath formatına taşı

POST_IDS=$(wp post list --post_status=publish --format=ids --posts_per_page=9999)

for ID in $POST_IDS; do
    # Yoast meta açıklamasını oku
    META_DESC=$(wp post meta get $ID "_yoast_wpseo_metadesc" 2>/dev/null)
    
    if [ -n "$META_DESC" ]; then
        # RankMath formatına yaz
        wp post meta update $ID "_rankmath_description" "$META_DESC"
        echo "ID $ID: Meta taşındı -> $META_DESC"
    fi
done

echo "İşlem tamamlandı!"

Kategori ve Etiket Atama

Gönderi oluştururken kategori ve etiket atayabildiğiniz gibi, sonradan da wp post term komutuyla bu ilişkileri yönetebilirsiniz:

# Gönderiye kategori ekle (ID ile)
wp post term add 42 category 5

# Gönderiye etiket ekle (slug ile)
wp post term add 42 post_tag "wordpress,wpcli,sysadmin"

# Gönderinin tüm terimlerini listele
wp post term list 42 category --fields=term_id,name,slug

# Kategorileri toplu atama
wp post list --format=ids --post_status=publish | 
  xargs -I {} wp post term add {} category 7

Gerçek Dünya Senaryosu: CSV’den Toplu Gönderi İçe Aktarma

Bu senaryo çok sık karşılaşılan bir durum. Müşteri size Excel’de 200 ürün veya makale gönderdi, bunları WordPress’e aktarmanız gerekiyor. CSV’den okuyarak toplu gönderi oluşturan bir bash script:

#!/bin/bash
# csv_import.sh - CSV dosyasından WordPress gönderisi oluştur
# CSV formatı: baslik,icerik,kategori_id,yazar_id,durum

CSV_FILE="/tmp/gonderiler.csv"
LOG_FILE="/tmp/import_log.txt"
BASARI=0
HATA=0

echo "İçe aktarma başlıyor: $(date)" > $LOG_FILE

# CSV'nin ilk satırını (başlık) atla
tail -n +2 "$CSV_FILE" | while IFS=',' read -r BASLIK ICERIK KATEGORI YAZAR DURUM; do
    
    # Boş satırları atla
    [ -z "$BASLIK" ] && continue
    
    # Gönderiyi oluştur ve ID'yi al
    POST_ID=$(wp post create 
        --post_title="$BASLIK" 
        --post_content="$ICERIK" 
        --post_category="$KATEGORI" 
        --post_author="$YAZAR" 
        --post_status="${DURUM:-draft}" 
        --porcelain 2>/dev/null)
    
    if [ $? -eq 0 ] && [ -n "$POST_ID" ]; then
        echo "BAŞARI: '$BASLIK' oluşturuldu (ID: $POST_ID)" | tee -a $LOG_FILE
        BASARI=$((BASARI + 1))
    else
        echo "HATA: '$BASLIK' oluşturulamadı" | tee -a $LOG_FILE
        HATA=$((HATA + 1))
    fi
    
    # Sunucuyu yormamak için kısa bekleme
    sleep 0.1
    
done

echo "Tamamlandı. Başarı: $BASARI, Hata: $HATA" | tee -a $LOG_FILE

--porcelain parametresi burada kritik öneme sahip. Sadece oluşturulan gönderinin ID’sini döndürür, fazladan çıktı üretmez. Bu sayede ID’yi değişkene atayabiliyoruz.

wp post generate ile Test Verisi Oluşturma

Yeni bir tema test ederken ya da sayfalama yapısını kontrol ederken çok sayıda test gönderisine ihtiyaç duyarsınız. wp post generate bu iş için biçilmiş kaftan:

# 50 adet test gönderisi oluştur
wp post generate --count=50 --post_status=draft

# Belirli bir kategoride test gönderileri oluştur
wp post generate 
  --count=100 
  --post_type=post 
  --post_status=publish 
  --post_author=1

# Özel gönderi tipi için test verisi
wp post generate 
  --count=30 
  --post_type=product 
  --post_status=draft

# Test bitti, temizle
wp post delete $(wp post list 
  --post_status=draft 
  --format=ids 
  --posts_per_page=200) --force

Gönderi Durumu Toplu Değiştirme

Onlarca taslağı bir anda yayınlamak ya da yayınlanmış gönderileri özel (private) yapmak çok yaygın bir senaryo:

# Tüm taslakları yayınla
for ID in $(wp post list --post_status=draft --format=ids); do
    wp post update $ID --post_status=publish
    echo "ID $ID yayınlandı"
done

# Belirli bir yazar ID'sine ait gönderileri askıya al
wp post list 
  --author=5 
  --post_status=publish 
  --format=ids | 
  xargs -I {} wp post update {} --post_status=pending

# 2019'dan eski gönderileri private yap
wp post list 
  --post_status=publish 
  --date_query_before="2019-12-31" 
  --format=ids 
  --posts_per_page=9999 | 
  xargs -r -I {} wp post update {} --post_status=private

Özel Gönderi Tipleri ile Çalışma

WP CLI’nin wp post komutları sadece standart blog yazılarıyla değil, tüm özel gönderi tipleriyle çalışır. WooCommerce kuruluysa ürünlerle de çalışabilirsiniz:

# WooCommerce ürünlerini listele
wp post list 
  --post_type=product 
  --post_status=publish 
  --fields=ID,post_title,post_status

# Tüm özel gönderi tiplerini gör
wp post list 
  --post_type=any 
  --fields=ID,post_title,post_type 
  --format=table

# Sayfa oluştur
wp post create 
  --post_type=page 
  --post_title="Hakkımızda" 
  --post_content="Biz kimiz ve ne yapıyoruz..." 
  --post_status="publish" 
  --post_name="hakkimizda"

# Belirli bir parent sayfasına alt sayfa ekle
wp post create 
  --post_type=page 
  --post_title="Ekibimiz" 
  --post_parent=15 
  --post_status="publish"

Performans İpuçları ve Dikkat Edilmesi Gerekenler

Toplu işlemlerde birkaç önemli nokta var:

  • Büyük toplu işlemlerde --posts_per_page kullanın: WP CLI varsayılan olarak belirli sayıda gönderi getirir. Tüm gönderileri almak için --posts_per_page=-1 veya yüksek bir sayı kullanın.
  • İşlem öncesi yedek alın: Özellikle toplu güncelleme ve silme öncesinde mutlaka wp db export ile veritabanı yedeği alın.
  • Önce test edin: --dry-run benzeri bir parametre olmadığı için wp post list ile önce hangi gönderilerin etkileneceğini gözlemleyin, sonra güncelleme veya silme yapın.
  • Sleep kullanın: Çok sayıda gönderiyle çalışırken döngüye küçük bekleme süreleri ekleyin, sunucunuzu aşırı yüklemeyin.
  • Log tutun: Önemli toplu işlemlerin çıktısını bir dosyaya kaydedin. Tee komutu bu iş için idealdir.
  • --porcelain kullanın: Script içinde ID veya veri işleyecekseniz bu parametre fazladan çıktı üretmez, scripting için güvenlidir.

Gönderi İçeriğini Güncelleme: Arama ve Değiştirme

WP CLI’nin wp search-replace komutu gönderi içeriklerinde toplu arama-değiştirme yapmanın en doğru yolu, ama bazen meta veriler veya başlıklar için wp post üzerinden de işlem yapabilirsiniz:

# Belirli bir metni içeren gönderileri bul
wp post list 
  --search="eski-domain.com" 
  --post_status=publish 
  --fields=ID,post_title

# Her gönderinin içeriğini okuyup güncelleme (küçük ölçekli)
for ID in $(wp post list --format=ids --post_status=publish); do
    CONTENT=$(wp post get $ID --field=post_content)
    if echo "$CONTENT" | grep -q "eski-domain.com"; then
        NEW_CONTENT=$(echo "$CONTENT" | sed 's/eski-domain.com/yeni-domain.com/g')
        wp post update $ID --post_content="$NEW_CONTENT"
        echo "ID $ID güncellendi"
    fi
done

Büyük ölçekli domain değişikliği için bu yöntem yerine wp search-replace kullanmak çok daha verimli olacaktır, ancak küçük ve özel düzenlemeler için bu pattern işe yarıyor.

Sonuç

wp post komutu, WordPress gönderi yönetimini terminalden yapmanın en etkili yolu. Günde beş gönderi yazıyorsanız belki çok da gerekmiyor, ama içerik migrasyonu, toplu durum değişikliği, meta veri güncelleme veya rutin temizlik işlemleri söz konusu olduğunda saatlerce sürecek admin panel tıklamalarını dakikalara indirebilirsiniz.

Özellikle vurgulayalım: CSV import scripti, meta veri taşıma ve toplu durum değiştirme senaryoları pratikte en çok karşılaştığınız durumlar. Bu üç pattern’i iyi anladığınızda wp post komutunun geri kalanını da kolayca öğrenirsiniz. Komutları üretim ortamında denemeden önce mutlaka yerel ortamda veya staging’de test edin, toplu silme ve güncelleme öncesinde her zaman yedek alın.

WP CLI’nin gücü tek bir komuttan değil, komutları birleştirip otomasyona dönüştürmekten geliyor. Yukarıdaki örnekleri kendi ihtiyaçlarınıza göre uyarlayarak işlerinizi otomatize etmeye başlayın, zaman kazandıkça WP CLI’ye olan bağımlılığınız da artar.

Bir yanıt yazın

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