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_pagekullanın: WP CLI varsayılan olarak belirli sayıda gönderi getirir. Tüm gönderileri almak için--posts_per_page=-1veya yüksek bir sayı kullanın.
- İşlem öncesi yedek alın: Özellikle toplu güncelleme ve silme öncesinde mutlaka
wp db exportile veritabanı yedeği alın.
- Önce test edin:
--dry-runbenzeri bir parametre olmadığı içinwp post listile ö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.
--porcelainkullanı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.
