Eklendi
-
İçerik Fabrikası:
direction.site_domain(sitenin kendi alan adı). Ayar dosyasındakidirection.site_domaindeğerijobsyanıtındasite_alan_adiolarak VPS'e gider; VPS CTA ve bağlantılarda bu alan adı dışında bir alan adı içeren yazıyı reddeder. Boş bırakılırsa davranış değişmez. Ayrıntı:docs/Packages/RbnFactory.md. -
İçerik Fabrikası: eski yazıları yenileme (
renew). Ayar dosyasına'renew' => ['enabled', 'per_day', 'hours', 'order']eklendi.jobsyanıtı, günlük sınır dolmadıysa yayındaki ve henüz yenilenmemiş (is_rewritten = 0) en eski yazı içinkind: "renew"işi sunar (eski içerik gönderilmez). Sonuç yazıya hemen yazılmaz; iş kaydında bekler, yayın cron'urenew.hourssaatinde sitenin içerik servisiyle (savePost) yazının içeriğini günceller, yazı aktif kalır veis_rewritten = 1olur. Bir yazıya ikinci renew işi açılması iş tablosundaki benzersiz indeksle (uq_factory_renew_post) veritabanı düzeyinde engellenir. İş tablosu ilk kullanımda kilit altında otomatik genişler (kind,renew_payload,renew_post_id;draft_idboş olabilir). -
Eski içerik adresleri için otomatik 301. Yeni
app_content_redirectstablosu (proje migration'ı) veapp.contentRedirectmodel/repository kaydı.ContentServiceTrait::savePost()bir yazının slug'ı ya da kategorisi değiştiğinde eski adresi bu tabloya yazar (panelden elle düzenleme ve fabrika yenilemesi aynı yoldan).resolveLegacyPostRedirect()önce bu tabloya bakar (kesin eşleşme, yazının güncel adresine tek adımda 301), yoksa eski benzer-slug yolu aynen sürer. Tablo olmayan projede davranış değişmez. -
Global temizliğe hedefli tablo temizliği.
system_global_cleanupcron satırınınparamsalanına"targets": {"<proje>": {"<tablo>": {"days": N, "column": "<tarih_sütunu>"}}}yazılırsaCleanupJobyalnız o proje ve tablolardancolumn < şimdi-dayssatırlarını siler; başka proje taranmaz. Tablo/sütun/proje adı yalnız[a-z0-9_]olabilir; projede olmayan tablo ya da sütun atlanır ve sonuç cron günlüğüneproje·tablo=silinenolarak yazılır.params.targetdeğeritargetsise yalnız bu hedefli dal çalışır. Mevcut genel temizlik değişmedi. -
İçerik Fabrikası: yazı içi görseller
imageslistesinde.resultgövdesindekiimages(src,alt,after_section,width,height) içeriğe<img>olarak gömülmez; yazı tablosununimagessütununa JSON yazılır (yeni yazıda en çok 2, yenilemede tam 1 öğe; sütun yoksa422). Yenilemede kapak (image) değişmez. Yayın denetimiimagesdosyalarının varlığını da denetler; yenilemeden sonra eski gömülü<img>ve eskiimagesdosyaları (kapak ve başka yazıda geçenler hariç) silinir. -
BaseModel::hasColumn()veContentServiceTrait::hasPostColumn(). Projeye göre değişen isteğe bağlı sütunlar yazılmadan önce denetlenir. RbnStudio görsel üretimiimage_promptsütunu olmayan tabloda bu alanı yazmaz (kayıt hata vermez). -
İçerik yazıları: yayın tarihi (
published_at). Yazı tablosuna isteğe bağlıpublished_at DATETIME NULLsütunu. Fabrika yayın cron'u yazıyı açarken tarihi yalnız ilk yayında yazar (FactoryPostRepository::publishPost(),created_atile aynı saat dilimi). Okuma kuralıFormatHelper::publishedAt():published_at, yoksacreated_at(pasif satırdacreated_at); sayfa tarihi, BlogPosting JSON-LD (datePublished, ayrıcadateModified=updated_at), kategori sırası veContentQueryTrait::getPosts()varsayılan sırası (COALESCE(published_at, created_at) DESC) bunu kullanır. Yeni komutrbn factory:published-at [--project=… --type=… --apply]sütunu ve indeksi ekler, yayındaki yazıları geriye dönük doldurur (idempotent). Sütunu olmayan sitelerde davranış değişmez. Ayrıntı:docs/Packages/RbnFactory.md. RSSpubDate(FeedResolver) aynı kuralı kullanır; genel sitemap içerik girdisininlastmoddeğeripublished_atdoluykenupdated_atile yayın tarihinden büyük olandır (yayın tarihi yoksa eski kural:created_at, yoksaupdated_at; girdinin açıklastmodverisi önceliklidir). Sayfa (/sayfa/…) girdileri değişmez.
Değişti
- RbnApi / Shopier: ödeme linki üreten akış kaldırıldı, yerine ilan açma ve fiyat güncelleme geldi. Shopier REST API'de ödeme linki yok, satış mağaza ilanı üzerinden yapılıyor.
ShopierService::createListing()ilanı açar (POST /products).updateListingPrice()fiyatı günceller (PUT /products/{id}); ilanın kimliği ve linki değişmez. İlanı ürüne kalıcı olarak bağlamak projenin işi; servis her istekte ilan açmaz.ShopierProvider::call()artık PUT ve DELETE isteklerini de JSON gövdeyle gönderiyor.
Kaldırıldı
ShopierService::generatePaymentUrl()veverifyOrderOnline(). Her ödeme isteğinde stoku 1 olan yeni bir herkese açık ilan açıyorlardı ve mağazayı ilanla dolduruyorlardı.