WP CLI ile wp eval ve eval-file Komutları Kullanarak PHP Kodu Çalıştırma
WP-CLI kullanmaya başladığınızda, en çok işinize yarayacak komutlardan ikisi wp eval ve wp eval-file olacak. Bu iki komut, WordPress ortamınıza doğrudan PHP kodu çalıştırmanıza olanak tanıyor ve doğru kullanıldığında inanılmaz zaman kazandırıcı araçlara dönüşüyor. Veritabanı temizliğinden toplu içerik güncellemesine, özel fonksiyon testlerinden hata ayıklamaya kadar pek çok senaryoda bu komutlara başvuracaksınız.
wp eval ve wp eval-file Nedir?
wp eval, tek satır veya kısa PHP kod bloklarını doğrudan terminal üzerinden WordPress bağlamında çalıştırmanızı sağlayan bir WP-CLI komutudur. WordPress çekirdeği, tüm eklentiler ve tema tam olarak yüklenmiş şekilde kodunuz çalışır. Yani get_option(), WP_Query, wp_insert_post() gibi WordPress fonksiyonlarının tamamına erişiminiz olur.
wp eval-file ise aynı mantıkla çalışır, tek farkı kod bloğunu doğrudan terminale yazmak yerine bir PHP dosyasından okumasıdır. Daha uzun ve karmaşık scriptler için ideal bir yaklaşımdır.
Her ikisi de şu temel özelliği paylaşır: Çalıştırdığınız kod WordPress’in tam ortamında, yani wp-load.php yüklendikten sonra çalışır. Bu sayede WordPress’in bütün API’lerine erişebilirsiniz.
Temel Kullanım Syntax’ı
wp eval '<php kodu>'
wp eval-file <dosya-yolu> [--skip-wordpress]
Komutların alabileceği başlıca parametreler şunlar:
- –skip-wordpress: Sadece
wp eval-fileiçin geçerli, WordPress’i yüklemeden saf PHP ortamında kodu çalıştırır - –user=: Belirli bir WordPress kullanıcısı olarak kodu çalıştırır
- –url=: Çok siteli (multisite) kurulumlarda hangi sitenin bağlamında çalışacağını belirtir
- –path=: WordPress kurulum dizinini manuel olarak belirtir
- –quiet: Başarı mesajlarını gizler, sadece çıktıyı gösterir
Basit wp eval Örnekleri
Önce temel seviyeden başlayalım. WordPress sürümünüzü terminalde görüntülemek istiyorsunuz:
wp eval 'echo get_bloginfo("version");'
Çıktı: 6.4.2 gibi bir şey göreceksiniz. Basit görünüyor ama düşünün, production sunucusunda phpinfo’ya erişemiyorsunuz, wp-admin’e giremiyorsunuz ama SSH erişiminiz var. Bu komut dakikalar içinde ortam hakkında bilgi toplamanızı sağlar.
Bir seçeneğin değerini kontrol etmek de çok sık başvurulan bir kullanım:
wp eval 'var_dump(get_option("active_plugins"));'
Bu komut aktif eklentilerin listesini tam olarak döker. Hangi eklentinin aktif olduğunu görmek için wp plugin list de kullanabilirsiniz tabii, ama bazen ham PHP çıktısı daha fazla detay verir.
Birden fazla işlemi tek seferde yapmak istiyorsanız noktalı virgülle ayırabilirsiniz:
wp eval 'global $wpdb; echo $wpdb->prefix; echo "n"; echo $wpdb->dbname;'
Gerçek Dünya Senaryosu 1: Seçenekleri Hızlıca Güncellemek
Diyelim ki bir WooCommerce mağazanız var ve ödeme sayfasındaki bazı metinleri değiştirmeniz gerekiyor. Bunun için tek tek wp-admin’den girip kaydetmek yerine:
wp eval '
update_option("woocommerce_checkout_company_field", "optional");
update_option("woocommerce_checkout_phone_field", "required");
update_option("woocommerce_default_customer_address", "base");
echo "WooCommerce checkout ayarları güncellendi.n";
'
Bu örnekte birden fazla seçeneği tek seferde güncelledik ve sonunda onay mesajı bastırdık. Production ortamında bu tür toplu değişiklikler için wp eval gerçekten can kurtarır.
Gerçek Dünya Senaryosu 2: Transient Temizliği
WordPress siteleri zamanla çok sayıda transient biriktirir. Özellikle hatalı çalışan eklentiler süresi dolmuş transient’ları temizlemez. Bunları manuel temizlemek için:
wp eval '
global $wpdb;
$deleted = $wpdb->query(
"DELETE FROM $wpdb->options
WHERE option_name LIKE "_transient_%"
AND option_name NOT LIKE "%timeout%""
);
echo "Silinen transient sayisi: " . $deleted . "n";
'
Tabii bu işlem için wp transient delete --all komutu da var, ama bazen sadece belirli bir prefix ile başlayanları silmek isteyebilirsiniz. Örneğin sadece WooCommerce transient’larını temizlemek için:
wp eval '
global $wpdb;
$deleted = $wpdb->query(
"DELETE FROM $wpdb->options
WHERE option_name LIKE "_transient_wc_%""
);
echo "Silinen WooCommerce transient sayisi: " . $deleted . "n";
'
wp eval-file ile Daha Karmaşık Scriptler
Birden fazla satır kod yazmak gerektiğinde wp eval kullanışsız hale gelir. Tek tırnak içinde kaçış karakterleri, satır sonları ve kod okunabilirliği sorun çıkarmaya başlar. İşte burada wp eval-file devreye girer.
Önce bir PHP dosyası oluşturun, örneğin fix-orphaned-posts.php:
<?php
// wp eval-file ile çalışacak script
// Sahipsiz (orphaned) post meta kayıtlarını temizler
global $wpdb;
$orphaned = $wpdb->get_results(
"SELECT pm.meta_id, pm.post_id
FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE p.ID IS NULL"
);
if (empty($orphaned)) {
echo "Temizlenecek orphaned post meta bulunamadi.n";
exit;
}
echo count($orphaned) . " adet orphaned post meta kaydı bulundu.n";
$deleted = $wpdb->query(
"DELETE pm FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE p.ID IS NULL"
);
echo $deleted . " kayit basariyla silindi.n";
Sonra bu dosyayı çalıştırın:
wp eval-file fix-orphaned-posts.php
Bu yaklaşımın avantajları çok. Kodu bir editörde rahatça yazıp düzenleyebilirsiniz, versiyon kontrolüne alabilirsiniz, iş arkadaşlarınızla paylaşabilirsiniz ve aynı scripti farklı sunucularda tekrar kullanabilirsiniz.
Gerçek Dünya Senaryosu 3: Toplu Kullanıcı İşlemleri
Diyelim ki bir üyelik sitesi yönetiyorsunuz ve belirli bir tarihten önce üye olup hiç içerik oluşturmamış kullanıcıları silmeniz gerekiyor. Bu tür bir işlem için cleanup-inactive-users.php adında bir dosya oluşturun:
<?php
// Belirli kriterlerle toplu kullanıcı temizliği
// DİKKAT: Önce --dry-run ile test edin!
$dry_run = true; // Gerçek silme için false yapın
$args = array(
'role' => 'subscriber',
'date_query' => array(
array(
'before' => '2022-01-01',
'inclusive' => true,
),
),
'fields' => 'ID',
'number' => -1,
);
$users = get_users($args);
$delete_count = 0;
$skip_count = 0;
foreach ($users as $user_id) {
$post_count = count_user_posts($user_id);
if ($post_count > 0) {
$skip_count++;
continue;
}
if ($dry_run) {
echo "[DRY RUN] Silinecek kullanici ID: {$user_id}n";
} else {
wp_delete_user($user_id);
echo "Silindi: Kullanici ID {$user_id}n";
}
$delete_count++;
}
echo "n--- Ozet ---n";
echo "Silinecek/Silinen: {$delete_count}n";
echo "Atlanılan (icerigi var): {$skip_count}n";
if ($dry_run) {
echo "nNOT: Bu bir dry-run idi. Gercek silme icin dosyada dry_run=false yapın.n";
}
Çalıştırma:
wp eval-file cleanup-inactive-users.php
–skip-wordpress Parametresi Ne Zaman Kullanılır?
Bu parametre ilk başta kafa karıştırıcı gelebilir. Neden WordPress’i yüklemeden bir WP-CLI komutu çalıştırayım diye düşünebilirsiniz. Bunun birkaç mantıklı kullanım senaryosu var:
WordPress yüklenirken hata veren bir siteniz olduğunu düşünün. Fatal error alıyorsunuz ama hangi eklentinin sebep olduğunu bilmiyorsunuz. Bu durumda WordPress olmadan saf PHP ile log dosyalarını okuyabilirsiniz:
wp eval-file parse-error-log.php --skip-wordpress
Dosya içeriği:
<?php
// WordPress'ten bağımsız log analizi
$log_file = '/var/log/nginx/error.log';
if (!file_exists($log_file)) {
echo "Log dosyasi bulunamadi: {$log_file}n";
exit(1);
}
$lines = file($log_file);
$php_errors = array_filter($lines, function($line) {
return strpos($line, 'PHP Fatal error') !== false
|| strpos($line, 'PHP Warning') !== false;
});
echo "Toplam PHP hatasi: " . count($php_errors) . "nn";
foreach (array_slice($php_errors, -20) as $line) {
echo trim($line) . "n";
}
Multisite Ortamında wp eval Kullanımı
WordPress multisite kurulumlarında çalışıyorsanız --url parametresi kritik önem taşıyor. Belirli bir alt sitenin bağlamında kod çalıştırmak için:
wp eval 'echo get_option("blogname");' --url=magaza.orneksite.com
Tüm sitelerde aynı işlemi yapmak gerekiyorsa bir shell script yazabilirsiniz:
#!/bin/bash
SITES=$(wp site list --field=url --format=csv)
for SITE_URL in $SITES; do
echo "=== $SITE_URL ==="
wp eval '
$theme = wp_get_theme();
echo "Tema: " . $theme->get("Name") . "n";
echo "Versiyon: " . $theme->get("Version") . "n";
' --url="$SITE_URL"
done
Hata Ayıklama İçin wp eval Kullanımı
Production’da bir WooCommerce siparişi sorun çıkarıyor, wp-admin’den tam detayı göremiyorsunuz. Terminal üzerinden derin bir inceleme yapabilirsiniz:
wp eval '
$order_id = 12345;
$order = wc_get_order($order_id);
if (!$order) {
echo "Siparis bulunamadi!n";
exit;
}
echo "Siparis Durumu: " . $order->get_status() . "n";
echo "Musteri: " . $order->get_billing_first_name() . " " . $order->get_billing_last_name() . "n";
echo "Email: " . $order->get_billing_email() . "n";
echo "Toplam: " . $order->get_total() . " " . get_woocommerce_currency() . "n";
echo "Odeme Yontemi: " . $order->get_payment_method_title() . "n";
$items = $order->get_items();
echo "nUrunler:n";
foreach ($items as $item) {
echo "- " . $item->get_name() . " x" . $item->get_quantity() . "n";
}
$notes = wc_get_order_notes(array("order_id" => $order_id));
echo "nSiparis Notlari: " . count($notes) . " adetn";
'
Bu tek komutla siparişin tüm kritik bilgilerini görebilirsiniz. wp-admin açmadan, tarayıcı açmadan, sadece SSH üzerinden.
Performans Ölçümü ve Test
Bir fonksiyonun ne kadar sürede çalıştığını ölçmek için:
wp eval '
$start = microtime(true);
// Test edilecek işlem
$args = array(
"post_type" => "product",
"posts_per_page" => -1,
"post_status" => "publish",
"fields" => "ids",
);
$query = new WP_Query($args);
$end = microtime(true);
$elapsed = round(($end - $start) * 1000, 2);
echo "Bulunan urun sayisi: " . $query->found_posts . "n";
echo "Sorgu suresi: {$elapsed} msn";
echo "Bellek kullanimi: " . round(memory_get_peak_usage() / 1024 / 1024, 2) . " MBn";
'
Güvenlik ve En İyi Uygulamalar
wp eval ve wp eval-file son derece güçlü araçlar olduğu için dikkatli kullanılması gerekiyor. Birkaç kritik noktaya dikkat edin:
- Yetki kontrolü: Bu komutlar varsayılan olarak
sudogerektirmez ama WordPress admin yetkisi gerektirir. Kullanıcı izinlerini düzgün konfigüre edin - Dry run alışkanlığı: Veri silen veya değiştiren her scripti önce dry run moduyla test edin. Yukarıdaki kullanıcı temizleme örneğindeki yaklaşımı benimseyin
- Versiyon kontrolü:
wp eval-fileile kullandığınız scriptleri Git’e ekleyin. Hangi ortamda ne çalıştırdığınızı belgelemiş olursunuz - Ortam değişkeni kontrolü: Script içinde hangi ortamda çalıştığınızı kontrol edin. Production’da yanlış bir script çalıştırmak felaket olabilir
wp eval '
$site_url = get_site_url();
if (strpos($site_url, "localhost") === false && strpos($site_url, "staging") === false) {
echo "UYARI: Production ortami tespit edildi: {$site_url}n";
echo "Devam etmek icin bu kontrolü kaldirin.n";
exit(1);
}
echo "Ortam guvende, devam ediliyor...n";
'
- Output buffering: Uzun süren işlemler için progress göstergesi ekleyin, yoksa script çalışırken donmuş gibi görünebilir
- Hata loglama: Kritik scriptlerde hataları loglamayı unutmayın
Shell Script ile Entegrasyon
wp eval ve wp eval-file komutlarını bash scriptlerinizle entegre ederek otomasyonu bir üst seviyeye taşıyabilirsiniz. Örneğin her sabah çalışan bir cron job ile WooCommerce istatistiklerini çekebilirsiniz:
#!/bin/bash
# /etc/cron.daily/woo-daily-report
WP_PATH="/var/www/html/wordpress"
LOG_FILE="/var/log/woo-daily-$(date +%Y%m%d).log"
echo "=== WooCommerce Gunluk Rapor - $(date) ===" > $LOG_FILE
wp --path="$WP_PATH" eval '
$today = date("Y-m-d");
$args = array(
"status" => array("wc-completed", "wc-processing"),
"date_created" => $today,
"limit" => -1,
"return" => "ids",
);
$orders = wc_get_orders($args);
$total_revenue = 0;
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
$total_revenue += $order->get_total();
}
echo "Bugunun siparis sayisi: " . count($orders) . "n";
echo "Bugunun toplam geliri: " . number_format($total_revenue, 2) . " TLn";
' >> $LOG_FILE 2>&1
echo "Rapor olusturuldu: $LOG_FILE"
Yaygın Hatalar ve Çözümleri
“Error: This does not seem to be a WordPress install” hatası: WP-CLI’yi WordPress dizininin dışından çalıştırıyorsunuzdur. --path parametresini kullanın ya da wp-config.php‘nin olduğu dizine cd yapın.
PHP syntax hatası almak: wp eval içinde tek tırnak kullanırken PHP kodunda da tek tırnak kullanmaya çalışırsanız shell çakışması yaşarsınız. Ya çift tırnak ile değiştirin ya da wp eval-file kullanın.
Zaman aşımı sorunları: Uzun süren işlemler için PHP’nin zaman aşımı limitine takılabilirsiniz:
wp eval '
set_time_limit(0);
ini_set("memory_limit", "512M");
// Uzun süren işlem burada
echo "Tamamlandi.n";
'
Output görünmüyor: echo yerine print veya var_dump kullanıyorsanız ve çıktı buffer’lanıyorsa:
wp eval 'ob_end_flush(); echo "Testn";'
Sonuç
wp eval ve wp eval-file komutları, WordPress sistem yönetiminde olmazsa olmaz araçlar arasında yerini almış durumda. Günlük bakım işlemlerinden acil müdahalelere, toplu veri güncellemelerinden performans testlerine kadar pek çok senaryoda bu komutlar size ciddi zaman kazandırır.
Özellikle wp eval-file ile bir script kütüphanesi oluşturmanızı şiddetle tavsiye ederim. Orphaned meta temizliği, transient temizliği, kullanıcı yönetimi, WooCommerce sipariş işlemleri gibi sık tekrarlanan görevler için hazır scriptleriniz olsun. Bu scriptleri Git reponuza alın, ekibinizle paylaşın ve standart operasyon prosedürlerinizin bir parçası haline getirin.
Tek uyarı: Bu komutların gücü, beraberinde sorumluluk da getiriyor. Production ortamında çalıştırmadan önce daima staging’de test edin, veri değiştiren işlemlerde dry run yapın ve her zaman yedeğinizin güncel olduğundan emin olun. Bu kuralları uygularsanız wp eval ve wp eval-file, WordPress yönetiminin en sevdiğiniz araçları haline gelecek.
