WP CLI ile WordPress Navigasyon Menüsü Yönetimi
WordPress sitelerinde navigasyon menülerini yönetmek, özellikle birden fazla siteniz varsa ya da deployment süreçlerinizde menü yapılandırmalarını otomatize etmeniz gerekiyorsa ciddi bir zaman alıcı iş haline gelebilir. WP-CLI’nin wp menu komutu tam da bu noktada hayat kurtarıcı oluyor. Admin paneline girmeden, fare tıklamalarıyla boğulmadan, terminal üzerinden tüm menü operasyonlarını halledebiliyorsunuz.
Bu yazıda wp menu komutunu gerçek dünya senaryolarıyla ele alacağız. Sadece “şu komutu çalıştır, şu çıktıyı alırsın” yaklaşımıyla değil, gerçekten kullandığınızda ne işinize yarar diye düşünerek.
wp menu Komutuna Genel Bakış
WP-CLI kuruluysa wp menu komutu hemen kullanıma hazır. Menü ile ilgili tüm alt komutlara bakacak olursak:
- wp menu create: Yeni menü oluşturur
- wp menu delete: Menü siler
- wp menu list: Mevcut menüleri listeler
- wp menu item: Menü öğelerini yönetir (add, list, update, delete)
- wp menu location: Menü konumlarını yönetir (assign, remove, list)
Hepsinin detayına gireceğiz ama önce temel bir konuyu netleştirelim. WordPress’te menü yönetimi üç katmandan oluşuyor: menünün kendisi, menü içindeki öğeler ve menünün temanın hangi konumuna atandığı. Bu üçünü birbirinden ayırt etmek, wp menu komutunu doğru kullanmanın anahtarı.
Mevcut Menüleri Listeleme
Her şeyden önce mevcut durumu görmek gerekiyor. Hangi menüler var, hangi konumlara atanmış?
wp menu list
Bu komut size menü ID’lerini, isimlerini, slug’larını, konumlarını ve kaç öğe içerdiklerini gösterir. Çıktıda locations sütununa dikkat edin; eğer bir menü herhangi bir konuma atanmamışsa bu sütun boş görünür.
Daha fazla detay için --fields parametresini kullanabilirsiniz:
wp menu list --fields=term_id,name,slug,locations,count
Birden fazla sitenin olduğu bir WordPress Multisite kurulumunda ise her site için --url parametresini kullanmanız gerekiyor:
wp menu list --url=https://alt-site.example.com
Yeni Menü Oluşturma
Diyelim ki yeni bir müşteri sitesi kuruyorsunuz ve standart menü yapısını hızlıca oluşturmanız gerekiyor. wp menu create komutuyla başlayalım:
wp menu create "Ana Menü"
Bu komut başarılı olursa menünün term_id’sini döndürür. Bu ID’yi sonraki adımlarda kullanacaksınız. Eğer script içinde çalışıyorsanız, bu ID’yi bir değişkene atamak mantıklı olacak:
MENU_ID=$(wp menu create "Ana Menü" --porcelain)
echo "Oluşturulan menü ID: $MENU_ID"
--porcelain flag’i sadece ham çıktıyı (ID’yi) verir, başka bir şey yazmaz. Script yazarken çok işinize yarar.
Menüye Öğe Ekleme
Menüyü oluşturdunuz, şimdi içini dolduracaksınız. Menüye ekleyebileceğiniz üç temel öğe türü var: sayfa/yazı (post), özel link (custom) ve kategori/etiket (taxonomy). Her birini ayrı ayrı görelim.
Sayfa Ekleme
# Önce sayfanın ID'sini bulalım
wp post list --post_type=page --fields=ID,post_title
# Sonra menüye ekleyelim
wp menu item add-post ana-menu 42 --title="Hakkımızda" --position=1
Buradaki ana-menu menünün slug’ı. ID yerine slug kullanmak daha okunabilir scriptler yazmanızı sağlar. --position parametresi menüdeki sırayı belirliyor, 1’den başlıyor.
Özel Link Ekleme
Harici bir siteye veya özel bir URL’e link eklemek istediğinizde:
wp menu item add-custom ana-menu "https://blog.example.com" "Blog" --position=5
Bu özellikle kurumsal sitelerde sık kullanılıyor. Ana site ile blog subdomain’i farklı WordPress kurulumlarında olduğunda, birbirlerine menüden link vermek için ideal.
Kategori/Taksonomi Ekleme
WooCommerce sitelerinde ürün kategorilerini menüye eklemek çok yaygın:
# Ürün kategorisi ID'sini bul
wp term list product_cat --fields=term_id,name
# Menüye ekle
wp menu item add-term ana-menu product_cat 15 --title="Elektronik" --position=3
Normal blog kategorileri için product_cat yerine category kullanıyorsunuz.
Gerçek Dünya Senaryosu 1: Yeni Site Kurulumunu Otomatize Etme
Bu senaryoda bir ajans için düşünelim. Her yeni müşteri sitesi kurulduğunda aynı temel menü yapısını oluşturmak zorundalar. Ana menü, footer menüsü ve sosyal medya menüsü. Her seferinde admin panelinden yapmak yerine bir script yazdılar:
#!/bin/bash
# WordPress site kurulumu sonrası menü setup scripti
SITE_URL=$1
echo "Menüler oluşturuluyor: $SITE_URL"
# Ana menüyü oluştur
ANA_MENU_ID=$(wp menu create "Ana Menü" --url=$SITE_URL --porcelain)
# Footer menüsü
FOOTER_MENU_ID=$(wp menu create "Footer Menü" --url=$SITE_URL --porcelain)
# Anasayfa ID'sini bul (genellikle 'homepage' slug'ına sahip sayfa)
ANASAYFA_ID=$(wp post list --post_type=page --name=anasayfa --field=ID --url=$SITE_URL)
if [ ! -z "$ANASAYFA_ID" ]; then
wp menu item add-post $ANA_MENU_ID $ANASAYFA_ID
--title="Anasayfa"
--position=1
--url=$SITE_URL
fi
# Hakkımızda sayfası
HAKKIMIZDA_ID=$(wp post list --post_type=page --name=hakkimizda --field=ID --url=$SITE_URL)
if [ ! -z "$HAKKIMIZDA_ID" ]; then
wp menu item add-post $ANA_MENU_ID $HAKKIMIZDA_ID
--title="Hakkımızda"
--position=2
--url=$SITE_URL
fi
# İletişim sayfası
ILETISIM_ID=$(wp post list --post_type=page --name=iletisim --field=ID --url=$SITE_URL)
if [ ! -z "$ILETISIM_ID" ]; then
wp menu item add-post $ANA_MENU_ID $ILETISIM_ID
--title="İletişim"
--position=3
--url=$SITE_URL
fi
echo "Menüler başarıyla oluşturuldu!"
echo "Ana Menü ID: $ANA_MENU_ID"
echo "Footer Menü ID: $FOOTER_MENU_ID"
Bu script’i ./setup-menus.sh https://yeni-musteri.example.com şeklinde çalıştırıyorsunuz ve işlemler 10 saniyede bitiyor.
Menü Konumlarını Yönetme
Menüyü oluşturdunuz, öğeleri eklediniz. Ama henüz temada görünmüyor çünkü herhangi bir konuma atamadınız. wp menu location alt komutu devreye giriyor.
Önce temanın desteklediği konumları listeleyelim:
wp menu location list
Bu size temanın register_nav_menus() ile kaydettiği tüm konumları gösterir. Genelde primary, footer, social gibi isimler görürsünüz. Türkçe Türkçe temalarda farklı isimler olabilir.
Menüyü bir konuma atamak için:
wp menu location assign ana-menu primary
Birden fazla konuma atama yapılabilir. Footer menüsünü atayalım:
wp menu location assign footer-menu footer
Bir konumdan menüyü kaldırmak için:
wp menu location remove primary
Menü Öğelerini Listeleme ve Güncelleme
Mevcut bir menünün içindeki öğeleri görmek için:
wp menu item list ana-menu
Bu komut her öğenin DB ID’sini, tipini, başlığını, URL’ini ve pozisyonunu listeler. Öğeleri güncellemek gerektiğinde bu ID’leri kullanacaksınız.
Diyelim ki bir menü öğesinin başlığını değiştirmeniz gerekiyor, pozisyonunu değiştirmeniz gerekiyor ya da CSS class eklemeniz gerekiyor:
# Başlık güncelleme
wp menu item update 247 --title="Kurumsal"
# Pozisyon güncelleme
wp menu item update 247 --position=2
# CSS class ekleme
wp menu item update 247 --classes="highlighted-menu-item"
# Yeni sekmede açma
wp menu item update 247 --target=_blank
wp menu item update komutunun kabul ettiği parametreler:
- –title: Menü öğesinin görünen adı
- –url: Öğenin yönlendirdiği URL (custom linkler için)
- –description: Öğe açıklaması (bazı temalar gösterir)
- –attr-title: HTML title attribute değeri
- –target: Link hedefi (_blank, _self vb.)
- –classes: CSS sınıfları
- –position: Sıra numarası
- –parent-id: Üst öğenin DB ID’si (dropdown menüler için)
Alt Menü (Dropdown) Oluşturma
Hiyerarşik menüler için --parent-id parametresi kritik. Bir üst menü öğesi altına child öğeler ekleyelim:
# Önce üst öğeyi ekle (Hizmetler)
HIZMETLER_ITEM_ID=$(wp menu item add-custom ana-menu "#" "Hizmetler" --position=2 --porcelain)
# Alt sayfaları üst öğeye bağla
WEB_TASARIM_ID=$(wp post list --post_type=page --name=web-tasarim --field=ID)
wp menu item add-post ana-menu $WEB_TASARIM_ID
--title="Web Tasarım"
--parent-id=$HIZMETLER_ITEM_ID
--position=1
MOBIL_ID=$(wp post list --post_type=page --name=mobil-uygulama --field=ID)
wp menu item add-post ana-menu $MOBIL_ID
--title="Mobil Uygulama"
--parent-id=$HIZMETLER_ITEM_ID
--position=2
Üst öğe için URL olarak # kullanmak yaygın bir pratik. Tıklandığında hiçbir yere gitmiyor, sadece dropdown’u açıyor.
Gerçek Dünya Senaryosu 2: Staging’den Production’a Menü Taşıma
Bu senaryo gerçekten sık karşılaşılan bir durum. Müşteri staging’de içerik düzenlemeler yapmış, kategoriler eklemiş, yeni sayfalar oluşturmuş ve menüleri güncellemiş. Siz de bu değişiklikleri production’a almanız gerekiyor.
Tam veritabanı yedeği almak yerine sadece menü yapısını taşımak istiyorsanız, önce staging’deki durumu anlayın:
# Staging'deki menüleri ve öğeleri incele
wp menu list --url=https://staging.example.com
wp menu item list ana-menu --url=https://staging.example.com --fields=db_id,type,title,url,position,menu_item_parent
Production’da yeni öğelerin ID’leri farklı olacağından, sayfa slug’larına göre eşleştirme yapan bir script yazmanız gerekiyor. Bu tür işlerde WP-CLI’yi bir dil betiğiyle (Python ya da bash) kombinlemek en pratik yöntem.
#!/bin/bash
# Menü öğelerini slug bazlı sync eden script
PROD_URL="https://production.example.com"
MENU_SLUG="ana-menu"
# Production'da mevcut menü öğelerini temizle (dikkatli kullanın!)
for ITEM_ID in $(wp menu item list $MENU_SLUG --url=$PROD_URL --field=db_id); do
wp menu item delete $ITEM_ID --url=$PROD_URL
done
echo "Eski öğeler silindi, yeniler ekleniyor..."
# Hakkımızda sayfasını slug ile bul ve ekle
HAKKIMIZDA=$(wp post list --post_type=page --name=hakkimizda --field=ID --url=$PROD_URL)
wp menu item add-post $MENU_SLUG $HAKKIMIZDA --title="Hakkımızda" --position=1 --url=$PROD_URL
# Blog sayfasını ekle
BLOG=$(wp post list --post_type=page --name=blog --field=ID --url=$PROD_URL)
wp menu item add-post $MENU_SLUG $BLOG --title="Blog" --position=2 --url=$PROD_URL
echo "Sync tamamlandı!"
Bu scripti çalıştırmadan önce mutlaka yedek alın. Menü öğelerini toplu silmek geri alınamaz.
Menü Silme
Artık kullanılmayan menüleri silmek için:
wp menu delete eski-menu
Birden fazla menüyü aynı anda silmek istiyorsanız:
wp menu delete eski-menu1 eski-menu2 eski-menu3
Ya da belirli bir kritere göre (örneğin boş menüler) toplu silme yapabilirsiniz:
# Öğesi olmayan menüleri bul ve sil
for MENU in $(wp menu list --field=slug); do
COUNT=$(wp menu item list $MENU --field=db_id | wc -l)
if [ "$COUNT" -eq "0" ]; then
echo "$MENU menüsü boş, siliniyor..."
wp menu delete $MENU
fi
done
Gerçek Dünya Senaryosu 3: WooCommerce Kategori Menüsü Güncelleme
E-ticaret sitelerinde yeni sezon gelince ya da kampanya dönemlerinde menüyü güncellemek çok sık yapılan bir işlem. Diyelim ki Ramazan kampanyası için özel bir ürün kategorisi oluşturdunuz ve bunu menüye eklemeniz gerekiyor, kampanya bitince de kaldırmanız gerekecek.
#!/bin/bash
# Kampanya menü öğesi ekle/kaldır scripti
ACTION=$1 # "add" veya "remove"
MENU_SLUG="ana-menu"
CATEGORY_SLUG="ramazan-kampanyasi"
CAMPAIGN_ITEM_CLASS="kampanya-menu-item"
if [ "$ACTION" = "add" ]; then
# Kategori ID'sini bul
CATEGORY_ID=$(wp term list product_cat
--name="$CATEGORY_SLUG"
--field=term_id 2>/dev/null)
if [ -z "$CATEGORY_ID" ]; then
# Kategori yoksa oluştur
CATEGORY_ID=$(wp term create product_cat "Ramazan Kampanyası"
--slug=$CATEGORY_SLUG
--porcelain)
echo "Kategori oluşturuldu: $CATEGORY_ID"
fi
# Menüye ekle
wp menu item add-term $MENU_SLUG product_cat $CATEGORY_ID
--title="🎉 Ramazan Kampanyası"
--classes=$CAMPAIGN_ITEM_CLASS
--position=1
echo "Kampanya menü öğesi eklendi!"
elif [ "$ACTION" = "remove" ]; then
# Kampanya öğesini class'a göre bul ve sil
# Önce tüm öğeleri listele, class'a göre filtrele
ITEM_IDS=$(wp menu item list $MENU_SLUG
--fields=db_id,classes
--format=csv | grep $CAMPAIGN_ITEM_CLASS | cut -d',' -f1)
for ID in $ITEM_IDS; do
wp menu item delete $ID
echo "Öğe silindi: $ID"
done
echo "Kampanya menü öğeleri kaldırıldı!"
fi
Kullanımı:
./kampanya-menu.sh add
# Kampanya bitince:
./kampanya-menu.sh remove
WP-CLI ile Menü Exportu ve Yedekleme
Menü yapısını bir JSON dosyasına export etmek için WP-CLI’nin --format=json parametresini kullanabilirsiniz:
# Menü listesini JSON olarak kaydet
wp menu list --format=json > menus-backup.json
# Belirli bir menünün öğelerini kaydet
wp menu item list ana-menu --format=json > ana-menu-items-backup.json
Bu çıktıları version control sisteminize (Git gibi) ekleyebilirsiniz. Özellikle ajans ortamlarında farklı müşterilerin menü şablonlarını repository’de tutmak ve yeni kurulumda hızlıca uygulamak için kullanışlı bir yaklaşım.
Sık Yapılan Hatalar ve Çözümleri
Menü slug’ı mı ID mi kullanmalıyım? Scriptlerde slug kullanmak daha güvenli çünkü ID’ler farklı ortamlarda (dev, staging, prod) değişebilir. Slug’lar genelde tutarlı kalır.
Pozisyon numaraları neden karışıyor? Pozisyon numaraları ardışık olmak zorunda değil. 1, 2, 3 yerine 10, 20, 30 kullanmak arasına öğe eklemeyi kolaylaştırır.
--url parametresini unutmak: Multisite kurulumlarında her wp menu komutuna --url eklemeyi unutursanız, komutlar ana site üzerinde çalışır. Bunu önlemek için script başına WP_CLI_URL ortam değişkeni set edebilirsiniz.
Silinmiş kategorilere bağlı menü öğeleri: Bir kategori veya sayfa silindiğinde, ona bağlı menü öğesi otomatik silinmez. “Orphan” menü öğeleri kalabilir. Bunları temizlemek için:
# Geçersiz öğeleri bul (URL'i boş veya # olanlar dahil bazı orphan'lar)
wp menu item list ana-menu --fields=db_id,type,object_id,title | grep "post_type|taxonomy"
Bu çıktıyı inceleyip geçersiz olanları wp menu item delete ID ile silebilirsiniz.
Sonuç
wp menu komutu ilk bakışta basit görünse de gerçek gücü otomasyon senaryolarında ortaya çıkıyor. Tek seferlik işlemler için admin paneli yeterli, ama şu durumlarda WP-CLI zorunlu hale geliyor:
- Çok sayıda site için aynı menü yapısını kurmanız gerektiğinde
- CI/CD pipeline’ınızda menü konfigürasyonunu kod olarak yönetmek istediğinizde
- Kampanya dönemlerinde menüleri otomatik güncellemeniz gerektiğinde
- Staging’den production’a seçici içerik taşıması yaparken
Bu yazıda ele aldığımız temel komutları ve senaryoları kendi iş akışınıza uyarlayın. Her ortam farklı, her proje farklı gereksinimler getiriyor. Ama wp menu create, wp menu item add-post, wp menu item add-custom, wp menu item add-term ve wp menu location assign komutlarını ezberleyip üzerine mantık kurabilirseniz, WordPress menü yönetiminde terminal sizin en iyi arkadaşınız olacak.
Bir sonraki yazıda wp post ve wp term komutlarıyla içerik yönetimi konusuna gireceğiz. O zamana kadar terminaliniz açık kalsın.
