WooCommerce CLI ile Süresi Dolan Kuponları Tespit Etme ve Temizleme

Yoğun bir WooCommerce mağazası yönetiyorsanız, zamanla biriken süresi dolmuş kuponların veritabanınızı nasıl şişirdiğini muhtemelen fark etmişsinizdir. Yüzlerce, hatta binlerce kullanılmayan veya süresi geçmiş kupon kaydı, sorgu sürelerini uzatır, wp_posts tablosunu gereksiz yere büyütür ve sitenizin genel performansını olumsuz etkiler. WP-CLI ile bu temizlik işini hem hızlı hem de güvenli bir şekilde otomatize edebilirsiniz.

WooCommerce’de Kuponlar Nasıl Depolanır?

WooCommerce kuponları, WordPress’in standart post sistemi üzerinde çalışır. Her kupon aslında shop_coupon post type’ına sahip bir kayıttır ve meta verileri wp_postmeta tablosunda saklanır. Bu yapıyı anlamak, CLI komutlarını doğru kullanmak açısından kritiktir.

Bir kuponun temel meta alanları şunlardır:

  • coupon_amount: İndirim miktarı
  • discount_type: İndirim türü (percent, fixed_cart, fixed_product)
  • expiry_date: Kuponun son kullanma tarihi (eski format, WooCommerce 3.x öncesi)
  • date_expires: Son kullanma tarihi (yeni format, timestamp olarak saklanır)
  • usage_count: Kaç kez kullanıldığı
  • usage_limit: Maksimum kullanım sayısı

Süresi dolmuş kupon tespitinde date_expires alanına bakacağız. Bu alan, Unix timestamp formatında saklanır ve 0 değeri “süre sınırı yok” anlamına gelir.

WP-CLI Ortamını Hazırlamak

Başlamadan önce WP-CLI’nin düzgün kurulu olduğundan emin olun. Sunucuya SSH ile bağlandıktan sonra şunu çalıştırın:

wp --info

Bu komut WP-CLI sürümünü, PHP versiyonunu ve WordPress kurulum yolunu gösterir. Eğer çok sayıda siteniz varsa ve belirli bir site için çalışıyorsanız --path parametresini kullanmayı unutmayın:

wp --path=/var/www/html/magaza --info

Ayrıca büyük temizlik işlemlerinde her zaman önce veritabanı yedeği alın:

wp db export /tmp/magaza-backup-$(date +%Y%m%d).sql

Bu adımı atlamayın. Gerçek bir üretim ortamında çalışıyorsunuz ve bir şeyler ters gidebilir.

Mevcut Kuponları Listelemek

İlk olarak mağazanızda kaç adet kupon bulunduğunu öğrenelim:

wp post list --post_type=shop_coupon --post_status=any --format=count

Daha detaylı bir liste için:

wp post list --post_type=shop_coupon --post_status=publish --fields=ID,post_title,post_date,post_status --format=table

Bu komut size mevcut tüm kuponların ID’sini, başlığını (kupon kodu), oluşturulma tarihini ve durumunu gösterir. Eğer 500’den fazla kupon görüyorsanız, ciddi bir temizlik zamanı gelmiş demektir.

Şimdi sadece süresi dolmuş kuponları görmek için biraz daha spesifik olmamız gerekiyor. WP-CLI’nin wp post list komutu meta sorgularını destekler, ancak tarih karşılaştırmaları için doğrudan SQL kullanmak daha pratik olacak:

wp db query "
SELECT p.ID, p.post_title, pm.meta_value as expiry_date
FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'shop_coupon'
AND pm.meta_key = 'date_expires'
AND pm.meta_value != ''
AND pm.meta_value != '0'
AND pm.meta_value < UNIX_TIMESTAMP(NOW())
ORDER BY pm.meta_value ASC
LIMIT 50;
"

Bu sorgu, date_expires değeri günümüzden küçük olan, yani süresi geçmiş tüm kuponları listeler. UNIX_TIMESTAMP(NOW()) fonksiyonu anlık Unix timestamp’ini verir.

Süresi Dolmuş Kupon ID’lerini Tespit Etmek

Temizlik işlemi için önce silinecek kupon ID’lerini bir değişkene veya dosyaya alalım:

EXPIRED_IDS=$(wp db query --skip-column-names "
SELECT p.ID
FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'shop_coupon'
AND pm.meta_key = 'date_expires'
AND pm.meta_value != ''
AND pm.meta_value != '0'
AND pm.meta_value < UNIX_TIMESTAMP(NOW())
" | tr 'n' ' ')

echo "Bulunan süresi dolmuş kupon sayısı: $(echo $EXPIRED_IDS | wc -w)"
echo "Kupon ID'leri: $EXPIRED_IDS"

Çıktı şöyle görünmeli:

Bulunan süresi dolmuş kupon sayısı: 47
Kupon ID'leri: 1234 1456 1789 2001 ...

Eski WooCommerce formatını kullanan siteler için (3.x öncesi) expiry_date meta anahtarını da kontrol etmek gerekir:

wp db query --skip-column-names "
SELECT p.ID, p.post_title,
    pm1.meta_value as date_expires,
    pm2.meta_value as expiry_date_legacy
FROM wp_posts p
LEFT JOIN wp_postmeta pm1 ON p.ID = pm1.post_id AND pm1.meta_key = 'date_expires'
LEFT JOIN wp_postmeta pm2 ON p.ID = pm2.post_id AND pm2.meta_key = 'expiry_date'
WHERE p.post_type = 'shop_coupon'
AND (
    (pm1.meta_value != '0' AND pm1.meta_value != '' AND pm1.meta_value < UNIX_TIMESTAMP(NOW()))
    OR
    (pm2.meta_value != '' AND pm2.meta_value < CURDATE())
)
ORDER BY p.ID;
"

Güvenli Silme İşlemi: Önce Trash, Sonra Kalıcı Silme

Syresi dolmuş kuponları hemen kalıcı olarak silmek yerine, önce çöp kutusuna almak daha güvenli bir yaklaşımdır. Böylece yanlışlıkla sildiğiniz bir kupon varsa geri getirebilirsiniz.

Tekil Kupon Silme ve İnceleme

Silmeden önce bir kuponu inceleyelim:

# Belirli bir kuponun detaylarını görüntüle
wp post get 1234 --format=json
# Kuponun meta verilerine bak
wp post meta list 1234

Bu çıktıda date_expires, usage_count ve usage_limit değerlerini görebilirsiniz.

Toplu Çöp Kutusuna Alma

# Bash döngüsü ile tüm süresi dolmuş kuponları trash'e taşı
for ID in $EXPIRED_IDS; do
    wp post delete $ID --force=false
    echo "Kupon $ID çöp kutusuna taşındı"
done

Ya da daha verimli bir yöntemle:

# Tüm expired kupon ID'lerini tek satırda trash'e taşı
echo $EXPIRED_IDS | xargs wp post delete --force=false

--force=false parametresi (veya sadece --force olmadan) postu trash’e taşır, kalıcı olarak silmez. Eğer --force kullanırsanız post direkt silinir ve geri dönüş yoktur.

Kalıcı Silme İşlemi

Çöp kutusundaki kuponları inceledikten sonra kalıcı silme işlemine geçebilirsiniz:

# Trash'teki shop_coupon postlarını listele
wp post list --post_type=shop_coupon --post_status=trash --format=count

# Trash'teki tüm shop_coupon postlarını kalıcı sil
TRASHED_COUPON_IDS=$(wp post list --post_type=shop_coupon --post_status=trash --field=ID --format=csv)

if [ -n "$TRASHED_COUPON_IDS" ]; then
    echo $TRASHED_COUPON_IDS | tr ',' ' ' | xargs wp post delete --force
    echo "Trash'teki tüm süresi dolmuş kuponlar kalıcı olarak silindi."
else
    echo "Trash'te silinecek kupon bulunamadı."
fi

Gelişmiş Senaryo: Kullanılmamış ve Süresi Dolmuş Kuponları Tespit Etmek

Bazı durumlarda sadece süresi dolmakla kalmayıp hiç kullanılmamış kuponları da temizlemek istersiniz. Bu biraz daha spesifik bir sorgu gerektirir:

# Süresi dolmuş VE hiç kullanılmamış kuponları bul
wp db query "
SELECT
    p.ID,
    p.post_title as kupon_kodu,
    FROM_UNIXTIME(pm_expire.meta_value) as son_kullanim_tarihi,
    COALESCE(pm_usage.meta_value, '0') as kullanim_sayisi
FROM wp_posts p
LEFT JOIN wp_postmeta pm_expire ON p.ID = pm_expire.post_id
    AND pm_expire.meta_key = 'date_expires'
LEFT JOIN wp_postmeta pm_usage ON p.ID = pm_usage.post_id
    AND pm_usage.meta_key = 'usage_count'
WHERE p.post_type = 'shop_coupon'
AND p.post_status = 'publish'
AND pm_expire.meta_value != '0'
AND pm_expire.meta_value != ''
AND pm_expire.meta_value < UNIX_TIMESTAMP(NOW())
AND (pm_usage.meta_value IS NULL OR pm_usage.meta_value = '0')
ORDER BY pm_expire.meta_value ASC;
"

Bu sorgu size hem süresi dolmuş hem de hiç kullanılmamış kuponların listesini verir. Kullanılmamış ve süresi dolmuş kuponlar genellikle güvenle silinebilir çünkü zaten herhangi bir sipariş kaydına bağlı değillerdir.

Öte yandan, sipariş geçmişine bağlı kuponlara dokunmamanızı öneririm. Bir müşteri o kuponu kullanarak sipariş vermişse, sipariş detaylarında hala referans olarak görünür. Siparişe bağlı kuponları tespit etmek için:

# Sipariş meta verilerinde referans edilen kuponları bul
wp db query "
SELECT DISTINCT meta_value as kupon_kodu
FROM wp_postmeta
WHERE meta_key = '_coupon_data'
LIMIT 20;
"

Otomatik Temizlik Script’i Oluşturmak

Tüm bu adımları birleştirerek, cron job olarak çalıştırabileceğiniz bir bash script’i hazırlayalım. Bu script’i /usr/local/bin/wc-coupon-cleanup.sh olarak kaydedin:

#!/bin/bash

# WooCommerce Süresi Dolmuş Kupon Temizleme Script'i
# Kullanim: /usr/local/bin/wc-coupon-cleanup.sh

WP_PATH="/var/www/html/magaza"
LOG_FILE="/var/log/wc-coupon-cleanup.log"
BACKUP_DIR="/tmp/coupon-backups"
DATE=$(date +%Y%m%d_%H%M%S)
DRY_RUN=false

# Parametreleri kontrol et
if [ "$1" == "--dry-run" ]; then
    DRY_RUN=true
    echo "DRY RUN modu aktif - hicbir sey silinmeyecek"
fi

mkdir -p $BACKUP_DIR

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

log "=== WooCommerce Kupon Temizleme Basliyor ==="

# WP-CLI kontrolu
if ! command -v wp &> /dev/null; then
    log "HATA: wp-cli bulunamadi!"
    exit 1
fi

# WordPress kontrolu
if ! wp --path=$WP_PATH core is-installed 2>/dev/null; then
    log "HATA: WordPress kurulumu bulunamadi: $WP_PATH"
    exit 1
fi

# Toplam kupon sayisi
TOTAL_COUPONS=$(wp --path=$WP_PATH post list --post_type=shop_coupon --post_status=any --format=count 2>/dev/null)
log "Toplam kupon sayisi: $TOTAL_COUPONS"

# Suresi dolmus kupon ID'lerini al
EXPIRED_IDS=$(wp --path=$WP_PATH db query --skip-column-names "
SELECT p.ID
FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'shop_coupon'
AND pm.meta_key = 'date_expires'
AND pm.meta_value != ''
AND pm.meta_value != '0'
AND pm.meta_value < UNIX_TIMESTAMP(NOW())
" 2>/dev/null | tr 'n' ' ')

EXPIRED_COUNT=$(echo $EXPIRED_IDS | wc -w)
log "Suresi dolmus kupon sayisi: $EXPIRED_COUNT"

if [ "$EXPIRED_COUNT" -eq 0 ]; then
    log "Silinecek suresi dolmus kupon bulunamadi. Cikiliyor."
    exit 0
fi

# Yedek al
if [ "$DRY_RUN" == "false" ]; then
    log "Veritabani yedegi aliniyor..."
    wp --path=$WP_PATH db export $BACKUP_DIR/pre-cleanup-$DATE.sql 2>/dev/null
    log "Yedek alindi: $BACKUP_DIR/pre-cleanup-$DATE.sql"
fi

# Suresi dolmus kuponlari trash'e tasI
if [ "$DRY_RUN" == "true" ]; then
    log "[DRY RUN] $EXPIRED_COUNT adet kupon trash'e tasinacakti"
else
    log "Kuponlar trash'e tasiniyor..."
    DELETED=0
    for ID in $EXPIRED_IDS; do
        if wp --path=$WP_PATH post delete $ID --force=false 2>/dev/null; then
            DELETED=$((DELETED + 1))
        fi
    done
    log "$DELETED adet kupon trash'e tasindt"

    # Trash'i temizle
    sleep 5
    TRASHED=$(wp --path=$WP_PATH post list --post_type=shop_coupon --post_status=trash --field=ID --format=csv 2>/dev/null)
    if [ -n "$TRASHED" ]; then
        echo $TRASHED | tr ',' ' ' | xargs wp --path=$WP_PATH post delete --force 2>/dev/null
        log "Trash kalici olarak temizlendi"
    fi
fi

# Veritabani optimize et
if [ "$DRY_RUN" == "false" ]; then
    log "Veritabani optimize ediliyor..."
    wp --path=$WP_PATH db optimize 2>/dev/null
    log "Optimizasyon tamamlandi"
fi

log "=== Temizleme Islemi Tamamlandi ==="

Script’e çalıştırma izni verin ve test edin:

chmod +x /usr/local/bin/wc-coupon-cleanup.sh

# Once dry-run ile test et
/usr/local/bin/wc-coupon-cleanup.sh --dry-run

# Gercek temizlik
/usr/local/bin/wc-coupon-cleanup.sh

Cron Job ile Otomatizasyon

Script’i her ayın ilk günü gece yarısı çalışacak şekilde cron’a ekleyin:

crontab -e

Şu satırı ekleyin:

# Her ayin 1'inde gece 02:00'de WooCommerce kupon temizleme
0 2 1 * * /usr/local/bin/wc-coupon-cleanup.sh >> /var/log/wc-coupon-cleanup.log 2>&1

Log dosyasını takip etmek için:

tail -f /var/log/wc-coupon-cleanup.log

Temizlik Sonrası Veritabanı Sağlığını Kontrol Etmek

Büyük bir temizlik işleminden sonra wp_posts ve wp_postmeta tablolarının boyutunu kontrol etmek iyi bir alışkanlıktır:

wp db query "
SELECT
    table_name AS 'Tablo',
    ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Boyut (MB)'
FROM information_schema.TABLES
WHERE table_schema = DATABASE()
AND table_name IN ('wp_posts', 'wp_postmeta', 'wp_woocommerce_order_itemmeta')
ORDER BY (data_length + index_length) DESC;
"

Ayrıca WooCommerce’in kendi transient’larını ve önbelleğini temizlemek de faydalıdır:

# WooCommerce transient'larini temizle
wp transient delete --all

# WooCommerce cache'i temizle (WooCommerce 3.x+)
wp cache flush

Gerçek Dünya Senaryosu: 2000 Kuponlu Bir Mağaza

Bir e-ticaret müşterimizin mağazasında, 3 yıl boyunca birikmiş 2.347 adet kupon vardı. Bunların 1.891’inin süresi dolmuştu ve yalnızca 203’ü en az bir kez kullanılmıştı. Yani 1.688 adet kupon hem hiç kullanılmamış hem de süresi dolmuştu.

Yukarıdaki script’i çalıştırmadan önce wp_posts tablosu 145 MB tutuyordu. Temizlik ve optimize işleminden sonra bu 67 MB’a düştü. Kupon listesi sayfasının yönetici panelinde açılış süresi 4.2 saniyeden 0.9 saniyeye indi. Checkout sayfasındaki kupon doğrulama sorgularının süresi de %60 civarında azaldı.

Bu rakamlar büyük bir mağaza için değil, orta ölçekli bir mağaza için. Büyük mağazalarda bu oran çok daha dramatik olabiliyor.

Dikkat Edilmesi Gereken Noktalar

  • Aktif kampanyaları kontrol edin: Silmeden önce pazarlama ekibine danışın. Süresi yeni dolmuş ama müşterilere gönderilmiş olan kuponlar hakkında şikayetler gelebilir.
  • Multisite ortamlarda dikkatli olun: --url parametresini doğru belirtin, aksi takdirde yanlış sitenin verilerini etkileyebilirsiniz.
  • Yüksek trafikli saatlerde çalıştırmayın: Büyük silme işlemleri veritabanına anlık yük bindirabilir.
  • Staging’de test edin: Script’i ilk kez production’da değil, staging ortamında deneyin.
  • --allow-root kullanımı: Root kullanıcısıyla WP-CLI çalıştırıyorsanız bu parametreyi eklemek gerekebilir, ancak genellikle web sunucusu kullanıcısıyla çalışmak daha güvenlidir.

Sonuç

WP-CLI, WooCommerce yönetiminin en pratik araçlarından biri. Süresi dolmuş kuponları elle tek tek silmek yerine, burada anlattığım yöntemi bir kez kurduğunuzda bu iş tamamen otomatikleşiyor. Özellikle düzenli promosyon kampanyaları yürüten, toplu kupon dağıtan mağazalarda bu temizlik rutini performans açısından ciddi fark yaratıyor.

Sistemi kurarken mutlaka önce --dry-run modunu kullanın, log dosyalarını takip edin ve ilk çalıştırma öncesinde veritabanı yedeğinizi aldığınızdan emin olun. Bir kez otomasyonu kurduğunuzda, veritabanı şişkinliğiyle uğraşmak yerine gerçekten önemli olan işlere odaklanabilirsiniz.

Bir yanıt yazın

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