JekCMS v1.5.0: Duplicate Engelleme, Akıllı Thumbnail ve Yönetim Araçları

v1.5.0 tüm API webhook'larına otomatik duplicate post tespiti, admin panele yerleşik duplicate bulma aracı ve image proxy ile akıllı öne çıkan görsel thumbnail fallback özelliği ekliyor. 14 kuruluma eş zamanlı uygulandı.

JekCMS v1.5.0: Duplicate Engelleme, Akıllı Thumbnail ve Yönetim Araçları

v1.5.0 tüm API webhook'larına otomatik duplicate post tespiti, admin panele yerleşik duplicate bulma aracı ve image proxy ile akıllı öne çıkan görsel thumbnail fallback özelliği ekliyor. 14 kuruluma eş zamanlı uygulandı.

Yinelenen Post Önleme (API)

Her içerik-oluşturan webhook artık yeni bir kayıt eklemeden önce aynı başlık veya slug'a sahip mevcut postları kontrol ediyor. Post::checkDuplicate() metodu her iki alana karşı sorgu yapıyor, çöp kutusundaki postları hariç tutuyor. Bir yinelenen tespit edildiğinde, API mevcut postun detaylarıyla (ID, başlık, slug, durum ve URL) HTTP 409 döndürüyor; böylece çağıran sistem nasıl devam edeceğine karar verebiliyor.

Beş webhook ucu korunuyor: webhookPublish, webhookSchedule, webhookDraft, webhookContentGenerate ve webhookBulkPublish. İlk dördü bir 409 hatası döndürür; toplu yayın (bulk publish) yinelenenleri sessizce atlar ve yanıtta bir skipped sayacı raporlar. Tüm uçlar, kasıtlı yinelenenler gerektiğinde kontrolü atlamak için istek gövdesindeki force_duplicate: true'yu dikkate alır.

// API 409 Yanıtı
{
 "success": false,
 "error": "duplicate_post",
 "existing": {
 "id": 142,
 "title": "Post Başlığı",
 "slug": "post-basligi",
 "status": "published",
 "url": "https://site.com/post-basligi"
 }
}

Yinelenen Bulucu (Yönetim Paneli)

Posts sayfasında yeni bir "Yinelenenler" butonu görünüyor. Tıklandığında, tüm yayınlanmış postları -N ile biten slug kalıpları için tarar (N, 1 ile 10 arasında) ve temel slug'ın ayrı bir post olarak da var olup olmadığını kontrol eder. Sonuçlar, yinelenen ve orijinali yan yana karşılaştıran, her postun editörüne bağlantı veren bir modalda görünür. Tek tek postlar çöp kutusuna atılabilir veya tespit edilen tüm yinelenenler tek bir işlemde kaldırılabilir.

Boyut Varyantı Olmadan Öne Çıkan Görsel Yedeği

get_featured_image() fonksiyonu eksik bir boyutlandırılmış varyantı zarifçe ele alıyor, ama isteğe bağlı yeniden boyutlandırma yapan bir proxy üzerinden değil. Belirli bir boyut (thumbnail, small, medium, large, full, pinterest veya og) belirli bir görsel için diskte üretilmemişse, fonksiyon bunun yerine format kademesine düşer: önce AVIF sürümünü dener, sonra WebP'yi, son olarak orijinal yüklemeyi — dinamik olarak yeniden boyutlandırılmış bir kopya veya 404 yerine, bunlardan gerçekten var olanı sunar.

jekcms yükleme sırasında yedi adlandırılmış boyut varyantı üretir: thumbnail (150×150), small (300×200), medium (600×400), large (1200×800), full (1920×1280), pinterest (1000×1500) ve og (1200×630).

Dağıtım Kapsamı

Tüm değişiklikler aynı anda 14 hedefe uygulandı: 11 aktif site, _template dizini ve hem kök hem native JekCMS kurulumları. Her hedef 5 dosya güncellemesi aldı — veritabanı migration'ı gerekmedi.

checkDuplicate() İç Yapıda Nasıl Çalışıyor

Metot sırayla iki SQL sorgusu çalıştırıyor. İlki, WHERE slug = ? AND status != 'trashed' kullanarak tam bir slug eşleşmesini kontrol ediyor. Eşleşme bulunamazsa, ikinci bir sorgu WHERE LOWER(title) = LOWER(?) AND status != 'trashed' ile büyük/küçük harf duyarsız bir başlık karşılaştırması yapıyor. Bu iki adımlı yaklaşım hem tam yeniden gönderimleri hem de biraz farklı bir slug'la yeniden yayınlanan içeriği yakalıyor. Her iki sorgu da indeksli sütunlara karşı çalıştığı için, kontrol yayın akışına ihmal edilebilir bir yük ekliyor; buna karşılık sonradan yinelenen içeriği elle tespit edip temizlemenin çok daha maliyetli sorununu önlüyor.

// Post.php - checkDuplicate metodu
public function checkDuplicate(string $title, string $slug): ?array
{
 // Once slug kontrol et (daha hizli, indeksli)
 $existing = $this->db->fetch(
 "SELECT id, title, slug, status FROM posts
 WHERE slug = ? AND status != 'trashed' LIMIT 1",
 [$slug]
 );
 if ($existing) return $existing;

 // Sonra basligi kontrol et (buyuk/kucuk harf duyarsiz)
 return $this->db->fetch(
 "SELECT id, title, slug, status FROM posts
 WHERE LOWER(title) = LOWER(?) AND status != 'trashed' LIMIT 1",
 [$title]
 );
}

Yinelenen Bulucu: Tespit Algoritması

Yönetim paneli tarafındaki yinelenen bulucu, API kontrolünden farklı bir yaklaşım kullanıyor. Gelen içerikle karşılaştırmak yerine, kazara yinelenmeyi işaret eden slug kalıpları için tüm posts tablosunu tarıyor. Algoritma -1 ile -10 arasında biten slug'ları tespit ediyor ve aynı tabloda temel slug'ı (sayısal ek olmadan) arıyor.

Neler İşaretleniyor

  • Hem example-post hem example-post-1'in var olduğu postlar
  • Birden fazla numaralı varyant: example-post-1, example-post-2, vb.
  • Yalnızca published veya draft durumundaki postlar kontrol ediliyor; çöp kutusundakiler hariç
  • Tarayıcı bir AJAX isteği olarak çalışıyor ve indeksli sütunlara karşı çalıştığı için daha büyük sitelerde bile hızlı kalıyor

14 Hedefte Eş Zamanlı Dağıtım

14 hedefe dağıtım yapmak yapılandırılmış bir yaklaşım gerektirdi. Her hedef aynı 5 dosyayı aldı:

  • classes/Post.php — checkDuplicate() metodu eklendi
  • api/v1/index.php — 5 webhook handler'ına 409 kontrolleri eklendi
  • admin/ajax/find-duplicates.php — yinelenen taraması için yeni dosya
  • admin/posts.php — yinelenen bulucu için UI butonu, modal ve JavaScript
  • includes/helpers.php — get_featured_image() yedek mantığı

Dağıtım yalnızca dosya bazlıydı — SQL migration yok, yapılandırma değişikliği yok, servis yeniden başlatması yok. Bu, geri almayı basit hale getirdi: beş dosyadan herhangi birini önceki sürümüyle değiştirmek, diğerlerini etkilemeden o belirli değişikliği geri alırdı.

Hemen Sipariş Verin

Tek seferlik ödeme, ömür boyu erişim. Kurulum 30 dakika.

Fiyatlara Bak
  • 30 dakikada kurulum ve yayın
  • 14+ profesyonel tema
  • n8n otomasyon entegrasyonu
  • Otomatik SEO — Sitemap, Schema.org
  • iyzico ödeme entegrasyonu

Yeniliklerden ilk sen haberdar ol

Yeni özellikler, sürüm notları ve CMS rehberleri — ayda birkaç e-posta, spam yok.