=== SEOYEN SEO Platform ===
Contributors: tevfikgulep
Tags: seo, redirects, schema, internal linking, ai content
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 2.2.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

One-click WordPress integration for the SEOYEN SEO platform. AI content, internal links, redirects, schema, audit auto-fix, instant indexing.

== Description ==

SEOYEN SEO Platform is the official WordPress companion plugin for the SEOYEN SEO platform (https://seoyen.com/). It lets you apply decisions made in the SEOYEN panel to your WordPress site with a single click — publish AI-generated articles, add internal links from SEOYEN suggestions, fix audit issues, manage 301/302/307/308/410 redirects, write meta descriptions that work with every major SEO plugin, and much more.

Use the plugin alongside an active SEOYEN account to turn panel recommendations into live site changes without copying and pasting, editing templates, or juggling multiple SEO tools. A guided welcome screen greets you right after activation and walks you through connecting the plugin to your SEOYEN account.

**Highlights**

* Publish AI-generated content (articles and paragraphs) from the SEOYEN panel straight to WordPress as drafts, scheduled posts, or published articles.
* Apply internal link suggestions with a single click. The inserter first tokenizes the existing `<a>` elements in your content, then links only the first still-unlinked occurrence of the anchor text — so it never writes a link inside an existing link, and never double-links the same phrase.
* Manage 301/302/307/308/410 redirects with per-hit analytics, support for exact, prefix, and regex matching, CSV bulk import, and automatic capture of broken backlinks.
* Auto-fix common SEO audit issues on 58 supported check types (title, meta description, canonical, robots.txt, schema Article/Breadcrumb/Organization/WebSite/Product/FAQPage, Open Graph + Twitter Card expansion, hreflang, alt text, viewport, apple-touch-icon, theme-color, llms.txt, AI bot management, broken-link 301 capture, redirect chains, WooCommerce product and category copy, and more).
* Notify IndexNow (Bing/Microsoft) the moment content is published — optional and disabled by default, with a verification key generated inside the plugin.
* Submit published URLs to the Google Indexing API using your own Google Cloud service-account credentials — optional and disabled by default.
* Apply AI-generated meta descriptions across Yoast SEO, Rank Math, SEOPress, or the built-in native fallback — the plugin detects your active SEO plugin automatically.
* Set image alt text in bulk, including featured images and media library entries.
* Manage JSON-LD schema markup per post (append, replace, upsert) and output it in a single clean `<script type="application/ld+json">` block.
* Convert content into social media drafts ready for your editorial workflow.
* Serve a custom `robots.txt` and `llms.txt` through virtual routes — no file permission changes required.
* Outbound webhook dispatcher with HMAC-SHA256 signing so you can forward activity to Zapier, Make, n8n, or your own endpoint.
* Complete activity log with search, filter, date range, and CSV export.
* System status page with REST loopback test, active SEO plugin detection, and a debug bundle downloader.

**Instant indexing**

When enabled, the plugin pings IndexNow (Bing/Microsoft) and the Google Indexing API the moment you publish content, so search engines learn about new URLs in minutes instead of days. Both integrations are optional and disabled by default. IndexNow uses a verification key generated inside the plugin and served through a virtual `/{key}.txt` route, and Google Instant Indexing authenticates with your own Google Cloud service-account JSON over an OAuth2 JWT (RS256) — no third-party libraries involved.

**SEO plugin integrations**

The plugin talks to existing SEO plugins so there are no conflicts:

* Yoast SEO (Free and Premium) — meta description, title, canonical, Open Graph.
* Rank Math — meta description, title, canonical, Open Graph.
* SEOPress — meta description, title, canonical, Open Graph.
* Native fallback — if no SEO plugin is active, the plugin outputs standards-compliant meta tags itself.

**Dashboard widget**

A native WordPress dashboard widget summarises your audit score, top tracked keywords, recent organic clicks, and the latest activity from both the panel and the plugin. Refreshable with a single click.

**Privacy-first**

The plugin does not make any remote call until you enter a SEOYEN API key and complete the three-step setup wizard. Telemetry is opt-in and disabled by default. On uninstall, plugin data is kept unless you explicitly opt in to full data removal.

**SEOYEN account required for AI features**

The internal-links apply, redirect management, and local admin tools work without an account. Panel-driven features (AI content, meta description generation, audit auto-fix driven from the panel, suggestion lists) require an active SEOYEN account so the WordPress plugin can talk to the panel API.

== External Services ==

This plugin connects to external services to provide its functionality. The integrations are documented below so you can make an informed decision before activating them.

**1. SEOYEN Panel API (required for panel-driven features)**

* Endpoint: `https://seoyen.com/panel/api/api-platform.php`
* What it does: Receives WordPress site actions (liveness pings, activation handshake, link/meta/schema/alt/social/autofix apply callbacks, redirect sync, activity log sync) and returns the data the plugin needs to render panel-driven UI (audit summary, link suggestions, AI content, audit auto-fix instructions).
* When: Only after the user enters a SEOYEN API key in **SEOYEN SEO > Settings** and completes the setup wizard. The plugin makes no outbound calls on activation or before the key is set.
* Data sent: site URL, admin email (once, during the first activation handshake), WordPress version, PHP version, plugin version, and action-specific payloads (e.g. redirect source and target URLs, meta description text, target post ID, activity log entries). No content of posts or media is sent unless you explicitly trigger a publish or apply action.
* Data received: AI-generated content, internal link suggestions, audit fixes, redirect and webhook configurations.
* Terms of service: https://seoyen.com/sartlar/
* Privacy policy: https://seoyen.com/gizlilik/

**2. User-configured outbound webhooks (optional)**

* Endpoints: User-provided URLs entered in the webhook settings.
* What it does: When enabled, the plugin POSTs HMAC-SHA256-signed JSON payloads to the URLs you configure whenever a tracked event occurs (for example, a redirect being created or an AI meta description being applied). You control the URLs and the event types.
* When: Only if you explicitly add at least one webhook endpoint and enable it.
* Data sent: The event name and a minimal payload describing the event. No credentials or user information is included.
* Terms and privacy: Determined by the third party that owns the webhook endpoint.

**3. WordPress core REST self-call (loopback)**

During the setup wizard the plugin makes a single request to its own `/wp-json/seoyen/v1/ping` endpoint to verify REST API availability. This is a loopback request to the same WordPress install and does not leave the server.

**4. IndexNow (optional)**

* Endpoint: `https://api.indexnow.org/indexnow`
* What it does: When you enable IndexNow in **SEOYEN SEO > IndexNow** and generate a verification key, the canonical URL of newly published content is submitted to the IndexNow service (operated by Microsoft Bing) so search engines can index it faster.
* When: Only if you explicitly enable the feature (disabled by default). No request is made while the feature is off.
* Data sent: The URL of the published content, your site host, and your own verification key. The key is generated inside the plugin (never fetched from a third party) and is served through a virtual `/{key}.txt` route on your own site.
* Terms of service: https://www.bing.com/indexnow
* Privacy policy: https://www.microsoft.com/privacy

**5. Google Instant Indexing (optional)**

* Endpoints: `https://oauth2.googleapis.com/token` and `https://indexing.googleapis.com/v3/urlNotifications:publish`
* What it does: When you upload your own Google Cloud service-account JSON and enable the feature, the URLs of newly published content are submitted to the Google Indexing API. Authentication uses an OAuth2 JWT (RS256) signed locally with OpenSSL — no third-party libraries are involved.
* When: Only if you explicitly enable the feature and provide your own service-account credentials (disabled by default).
* Data sent: The published URL and your own service-account credentials (used solely to obtain an access token from Google). The private key is stored in your WordPress database and is never displayed back in the browser.
* Terms of service: https://developers.google.com/search/apis
* Privacy policy: https://policies.google.com/privacy

**6. SEOYEN Panel API — WooCommerce catalogue sync (optional, WooCommerce only)**

* Endpoint: `https://seoyen.com/panel/api/api-platform.php` (the same panel API as item 1).
* What it does: When your site runs WooCommerce and you have connected a SEOYEN account, the panel reads your product and category catalogue so it can score product SEO, flag missing product descriptions and empty category pages, and generate copy on request. The plugin also keeps a local change journal so price and stock movements are reported at intra-day resolution — WooCommerce does not update a product's `post_modified` timestamp when an order reduces stock, so a date-based sync would silently miss it.
* When: Once per day via a scheduled sync, plus whenever you trigger a catalogue refresh or a product SEO action yourself. If WooCommerce is not active, no product data is collected and no product query is ever executed.
* Data sent: Product and category attributes only — name, SKU, GTIN, price, sale price, cost (when set), stock status and quantity, brand, category and tag names, permalink, image URLs, product type, publish status, and aggregate review **counts** and average rating. Change-journal rows (which product changed, which field, when). Daily order **totals** (aggregate revenue and order count per day) when GA4-style commerce reporting is enabled.
* Data NOT sent: No customer personal data of any kind — no customer names, e-mail addresses, phone numbers, billing or shipping addresses, and no IP addresses. No order numbers or individual order records. No review text and no reviewer identity; only the number of reviews and the average score.
* Terms of service: https://seoyen.com/sartlar/
* Privacy policy: https://seoyen.com/gizlilik/

== Installation ==

1. Upload the plugin ZIP via **Plugins > Add New > Upload Plugin**, or unzip into `wp-content/plugins/seoyen/`.
2. Activate **SEOYEN SEO Platform** from the Plugins screen.
3. Go to **SEOYEN SEO > Settings** and paste the API key generated in the SEOYEN panel (Settings > Integrations > WordPress Plugin).
4. Click **Connect to Panel**. The plugin will run a three-step handshake and report when the connection is active.
5. Open the **SEOYEN SEO** top-level menu to explore the dashboard, redirects, internal links, content suggestions, activity log, and system status pages.

== Frequently Asked Questions ==

= Do I need a SEOYEN account? =

Yes for AI and panel-driven features (AI content publish, meta description apply, audit auto-fix from the panel, suggestion lists, webhook dispatch back to the panel). The redirect manager, admin UI, and local debugging pages work without a panel connection.

= Which SEO plugins are supported? =

Yoast SEO (Free and Premium), Rank Math, and SEOPress are detected automatically. If none of these are active, the plugin falls back to writing meta descriptions, canonical tags, and Open Graph tags itself. You only need one of these (including the native fallback) to get meta description support.

= Can I use this plugin without the SEOYEN panel? =

The redirect manager, admin UI, activity log, and system status work without a panel connection. AI features, audit auto-fix from the panel, and suggestion lists require an active SEOYEN account because the data comes from the panel API.

= Does this plugin track users on my site? =

No. The plugin has no public-facing tracking scripts. Telemetry is strictly opt-in (disabled by default) and only sends plugin version, WordPress version, and PHP version when enabled.

= How do redirects work? =

Redirects are stored in the custom table `{prefix}seoyen_redirects`. On every public request the plugin hooks `template_redirect` at priority 1, normalizes the request URI, looks up the destination, and — if a match is found — issues a `wp_safe_redirect()` with the configured status code. Hit counts are updated on the `shutdown` hook so they do not slow down the response.

= Will it conflict with Yoast, Rank Math, or SEOPress? =

No. The plugin uses an adapter pattern. If Yoast is active, meta descriptions are written into Yoast's post meta keys; the same is true for Rank Math and SEOPress. If none are active, the plugin writes its own meta tags in the head. The plugin never outputs duplicate meta tags.

= Can I remove plugin data on uninstall? =

Yes. In **SEOYEN SEO > Settings** there is a "Keep data on uninstall" toggle. When disabled, uninstalling the plugin drops the custom tables, deletes all `_seoyen_*` post meta, and removes all `seoyen_*` options. The default is to keep data so you can reactivate without losing redirects or activity history.

= Is it GPL-compatible? =

Yes. SEOYEN SEO Platform is released under GPLv2 or later, the same license as WordPress core.

= Where do I report bugs or request features? =

Please contact support through https://seoyen.com/ or open an issue in the SEOYEN panel's help section.

== Screenshots ==

1. Dashboard overview with audit score, organic traffic summary, recent activity feed, and quick action cards for publish, redirects, audit, and panel.
2. Redirect manager with sortable list, bulk actions, search, and CSV import for migrating from other redirect plugins or importing broken-backlink targets from the SEOYEN panel.
3. Setup wizard — three-step API key, connect, and verify flow with inline validation.
4. AI content suggestions — list of panel-generated drafts with one-click apply/reject buttons and a preview of the incoming change.
5. Activity log with date-range filter, action and result filters, search box, and CSV export.
6. System status page with REST loopback test, active SEO plugin detection, and debug bundle downloader.

== Changelog ==

= 2.2.2 =
* **"Kopya H1" ve "H1 çok uzun" düzeltmeleri artık gerçekten uygulanabiliyor.** Bu iki bulguda "WP ile Uygula" çoğu temada hiçbir şeyi değiştirmiyordu: eklenti yalnız yazı içeriğindeki `<h1>` etiketini düzeltebiliyor, oysa temaların çoğu görünen başlığı yazı başlığından basıyor. Ölçüldü (28 Ağustos 2026, üç tur): hedef yazıların içeriğinde tek bir `<h1>` yoktu, düzeltme üç turda da sessizce atlandı ve aynı bulgu her denetimde geri geldi.
* **Artık ne olacağı açıkça soruluyor.** İçerikte değiştirilebilecek `<h1>` yoksa eklenti sessizce vazgeçmez; panelde çözümün altında **"Yazı başlığını da güncelle"** kutusu çıkar. Kutu işaretlenmeden hiçbir şey değişmez.
* **Kalıcı bağlantınız (adres) değişmez.** Onay verildiğinde yalnız yazı başlığı güncellenir; bağlantı adresi (slug) olduğu gibi kalır. Başlığın göründüğü yerler: menüler, yazı listeleri ve arama sonuçları.
* **"Yaptım" yalanı yok.** Başlık güncellemesini WordPress reddederse düzeltme başarılı sayılmaz; sorun denetim listesinde açık kalır.

= 2.2.1 =
* **"Düzelttim" denen meta açıklamalar sayfada gerçekten görünüyor.** Altı düzeltme tipi "yazdım" cevabı verip değeri kaydediyor, ama ziyaretçinin gördüğü sayfada hiçbir şey değişmiyordu. ÖLÇÜLDÜ (canlı, 28 Ağustos 2026; 18 düzeltme tipi × 3 tur): `content.meta_too_long`, `content.meta_too_short`, `content.meta_description_duplicate` ve `social_meta.og_description_missing` 3/3 turda sessiz kaldı.
* **Sebep:** eklenti "bu etiket sayfada zaten var" deyip susuyordu. Temaların çoğu kendi `<meta name="description">` etiketini eklentinin sırası gelmeden basar. Temasında kendi açıklamasını basan HER sitede aynı sessiz sonuçsuzluk vardı.
* **Artık:** açıkça kaydettiğiniz bir değer varsa eklenti mevcut etiketi susmak yerine DEĞİŞTİRİYOR — sayfa açıklaması, Open Graph açıklaması ve türü, Twitter kart türü/başlığı/açıklaması.
* **Bilerek yapmadıkları:** değer sizin yazdığınız metin değil de özetten türetilmiş bir yedekse temaya dokunulmaz; Yoast / Rank Math / SEOPress / AIOSEO kuruluysa hiçbir şey değişmez; aynı adlı birden çok etiket varsa yalnız ilki düzeltilir.
* **`twitter:card` çoğaltılmıyor** — tema (ya da Jetpack gibi bir eklenti) kendi kart etiketini basmışsa ikinci, çelişen bir tane daha eklenmiyor. Sınıftaki üç çıkış noktasının üçü de aynı sözleşmeye alındı.
* Ezme yapıldığında da yapılamadığında da sunucu hata günlüğüne saatte en fazla bir kez açıklayıcı satır düşer.

= 2.2.0 =
* **Türkçe yönetici ekranında İngilizce kalan on bir etiket çevrildi** — araç adları (Meta Açıklama, Alt Metin, Sosyal Medya Dönüştürücü, Paragraf Üretici, Otomatik Düzeltme), önem dereceleri (Kritik, Bilgi) ve makale kartı etiketleri (AI Makale, Anahtar kelime:, Taslak, Yayında). Aynı ekranda iki dil bir arada görünmüyor artık.
* Yalnız görünen metinler değişti; ayarlar, kayıtlar ve yazı durumlarının teknik değerleri (`draft` / `publish`) aynı kaldı.

= 2.1.3 =
* **"Tek Tıkla Düzelt" artık gerçekten hepsini kapsıyor.** Kart "42 URL etkilendi" derken düğme yalnız ekranda gösterilen ilk 5 adresi düzeltiyordu. Düğme artık ekrandaki listeye hiç bakmaz: sorunun TÜM uygun adreslerini panelin toplu düzeltme motoruna verir.
* **Tıklamadan önce ne harcayacağınız yazılı olarak söyleniyor** — kaç sayfa işlenecek, tahmini kaç kredi gidecek, kalan bakiyeniz ne. Onaylamadan hiçbir kredi harcanmaz. Bakiye sınırsızsa rakam yerine "sınırsız" yazar; maliyet hesaplanamıyorsa uydurulmaz, "hesaplanamadı" denir ve sayfa sayısı yine söylenir.
* **Kart, panelin o soruna ait sayfasına bağlantı veriyor** ("Tek tek seçmek için panelde aç →") — hangi sayfayı düzelteceğinize tek tek karar vermek isterseniz oradan seçersiniz.
* **İlerleme dürüst üç kovada gösteriliyor**: hazır · hata · bekliyor. "Bekliyor" hata değildir — o adresin düzeltmesi henüz üretilmedi. İstediğiniz an durdurabilirsiniz; durdurmak izlemeyi keser, panelde süren üretimi öldürmez ve bu açıkça yazar.
* Etkilenen adres önizlemesi 5 yerine 20 satır gösteriyor.

= 2.1.2 =
* **Düzelttiğiniz denetim sorunları aktif listeden düşüyor.** Bir sorunu düzeltmenize rağmen kart listede duruyordu; hangi işi yapıp hangisini yapmadığınızı ayırt edemiyordunuz. Düzeltilenler artık **"Uygulanmış düzeltmeler"** başlıklı, varsayılan olarak kapalı bir bölümde toplanır — kaybolmazlar, sadece yolunuzdan çekilirler.
* **Bir sorun yeniden ortaya çıkarsa kendiliğinden aktif listeye döner** — arşiv "bir daha bakma" listesi değildir; sonraki denetimde aynı kontrol yeniden başarısız olursa sorun açık listede yeniden belirir.
* Uygulanmış düzeltme sayısı başlıkta gösterilir; sayı panelden okunamıyorsa başlık sayısız basılır, uydurma rakam gösterilmez.

= 2.1.1 =
* **"Uygulanıyor…" sonsuza kadar durmuyor** — düzeltme ekranı bir sonucu iki saate kadar bekleyebiliyordu; geçen süre yoktu, iptal yoktu. Bekleme artık ölçülmüş süreye göre: tek düzeltme için 6 dakika, bir sorunun tüm adresleri için toplam 30 dakika.
* **Beklerken geçen süre görünüyor** ("42 sn", "3 dk 07 sn") ve istediğiniz an **İptal** diyebiliyorsunuz. İptal dürüsttür: izleme durur, sunucudaki üretim arka planda sürebilir, ama sitenize hiçbir şey yazılmaz — yeniden deneyebilirsiniz.
* **Süre dolduğunda "başarısız" denmiyor** — düzeltme hâlâ üretiliyor olabilir; ekran "sonucu bekleyemedik" der ve ne yapmanız gerektiğini yazar.
* **"Ağ hatası" yerine sunucunun gerçekten ne dediği yazıyor** — zaman aşımı mı, sunucuya ulaşılamıyor mu, beklenmeyen yanıt mı; durum koduyla birlikte. Ham hata sayfası kullanıcıya gösterilmez, yalnız geliştirici konsoluna düşer.

= 2.1.0 =
* **WooCommerce mağazanız SEOYEN'e bağlanabiliyor.** Ürün ve kategori kataloğunuz panele okunuyor; panel hangi ürünün açıklaması eksik, hangi kategori metinsiz gösteriyor. WooCommerce kurulu değilse eklenti bu iş için tek sorgu bile çalıştırmaz.
* **Stok ve fiyat hareketleri gün içinde yakalanıyor** — yeni "değişim defteri" her hareketi kaydeder. Şart oldu: sipariş kaynaklı stok düşümü WooCommerce'te ürünün "son düzenlenme" tarihine dokunmaz, yalnız tarihe bakan bir eşitleme ürünün tükenmesini kaçırırdı.
* **Katalog eşitlemesini besleyen dört yeni uç** (ürünler, kategoriler, mağaza durumu, onay). WooCommerce yokken sessizce boş liste dönmez, durumu açıkça bildirir — panel "mağaza var, sıfır ürün var" sanıp kataloğu silinmiş saymasın diye.
* **Üç yeni "Tek Tıkla Düzelt" kalemi**: eksik ürün açıklaması, ince ürün açıklamasını genişletme, eksik kategori metni. Genişletmede mağazanın kendi metni korunur.
* **Sekiz yeni e-ticaret denetim kontrolü** + yönetici menüsünde **"E-Ticaret SEO" ekranı** + panelde **toplu ürün SEO optimizasyonu**.
* **Organik ciro ölçülüyor** — Google Analytics bağlıysa panel e-ticaret metriklerini de çekiyor.
* **Eklentiyi kaldırdığınızda panel haberdar oluyor** — kaldırma bildirimi eski bir kimlik başlığıyla gidiyor ve reddediliyordu; site hesabınızda "bağlı" görünmeye devam ediyordu.
* **Toplu düzeltme sırası eklentinin hız sınırına çarpmıyor** — eklenti sınırını bildiriyor, panel yavaşlıyor ve sınıra çarparsa geri çekiliyor. Ölçüldü (30 gün): bildirim yokken 428 istek reddedilmişti, her biri kredisi zaten harcanmış bir düzeltmeydi.
* **Otopilot istemediğiniz hâlde yayına almıyor** — yayın durumu belirtilmeden başlatılan koşu yazıyı sessizce yayınlıyordu, artık taslak bırakır.
* **Medya kitaplığında olmayan görsel için "düzelt" düğmesi çıkmıyor** (30 günde 93 başarısız deneme) · **dört İngilizce yönetici metni Türkçeye çevrildi**.
* Şema sürümü 1.1.0 → 1.2.0; güncellemede iki yeni tablo otomatik oluşur, mevcut veriler etkilenmez.
* **Eklenti wordpress.org'da yayımlanmaya hazırlandı** — dizinin kabul etmediği `Update URI` başlığı kaldırıldı. Kurulu sitelerde bu turda hiçbir şey değişmez: WordPress yalnız daha yüksek sürüm görürse güncelleme önerir, 2.1.0 ise oradaki kayıtlı 1.1.0'dan yüksektir.
= 2.0.11 =
* **İçerik ekranındaki "Yenile" düğmesi sunucu reddettiğinde artık sayfayı yenilemiyor.** İstek 403 (oturum anahtarı süresi doldu) veya 500 ile dönse bile sayfa yenileniyordu; sunucuda hiçbir şey tazelenmemişken aynı bayat öneri listesi "yeni" sanılıyordu. Sayfa artık yalnız sunucu tazelediğini söylediğinde yenilenir, aksi hâlde hata metni gösterilir. (İç Linkler ekranı 2.0.10'da düzeltilmişti; iki ekran artık aynı.)
* **Rank Math kullanan sitelerde yazı görseli ön yüze ulaşıyor.** Rank Math yazının Facebook/Twitter görselini ön yüzde yalnız medya kitaplığı kimliğinden okur; SEOYEN yalnız adresi yazdığı için görsel hiç yayına girmiyordu. Görsel kitaplıkta yoksa artık "uygulandı" denmiyor. (Kategori/etiket tarafı 2.0.10'daydı.)
* **Başarısız görsel yazımının gerçek sebebi bildiriliyor** — her hataya `update_failed` yazmak yerine adapter'ın bildirdiği sebep taşınıyor; önceki adapter'ın bayat sebebi bir sonrakine yapışmıyor.
* **Yayımlanan yazının WordPress kimliği ve adresi panele taşınıyor** — panel yayınlanan yazıya geri bağlantı kurabiliyor. Panele ulaşılamazsa yayın etkilenmez.
* Sürüm numarası aynı zamanda betik/stil önbellek anahtarıdır; `seoyen-page-content.js` değiştiği için sürüm yükseltildi — aksi hâlde kurulu siteler eski dosyayı önbellekten sunmaya devam ederdi.
= 2.0.10 =
* **"Yenile" düğmesi sunucu reddettiğinde artık sayfayı yenilemiyor.** İstek 403 (oturum anahtarı süresi doldu) veya 500 ile dönse bile sayfa yenileniyordu; sunucuda hiçbir şey tazelenmemişken aynı bayat öneri listesi "yeni" sanılıyordu. Sayfa artık yalnız sunucu tazelediğini söylediğinde yenilenir, aksi hâlde hata metni gösterilir.
* **Rank Math kullanan sitelerde kategori/etiket görseli ön yüze ulaşıyor.** Rank Math terim görselini ön yüzde yalnız medya kitaplığı kimliğinden okur; SEOYEN yalnız adresi yazdığı için görsel hiç yayına girmiyordu. Görsel kitaplıkta yoksa artık "uygulandı" denmiyor.
* **"Fallback Meta Output" ayarı kapatıldığında gerçekten kapanıyor.** WordPress kutucuk kaldırıldığında ayarı boş dize olarak saklar; boş dize "açık" sayıldığı için meta etiketler basılmaya devam ediyordu. Hiç dokunmamış kurulumlar etkilenmez.
* **İçerik Botu koşu aşamaları gerçek durumu gösteriyor** — "Güvenlik kontrolü yapılıyor" ve "Yazı birleştiriliyor" aşamaları listede yoktu (ham kod görünüyordu), hiç kullanılmayan iki ölü etiket ise duruyordu.
* **Bot ziyaret sayacı artan değeri kaybetmiyor** — sayaç okunduktan sonra gelen ziyaretler de yanlışlıkla "gönderildi" işaretlenebiliyordu.
* **`<html lang="...">` düzeltmesi resmi WordPress dil paketleriyle çalışıyor** (`de_DE_formal`, `pt_PT_ao90`, `nl_NL_formal`, `tr_TR` gibi kodlar reddediliyordu). Gerçekten geçersiz girdi hâlâ reddedilir.
* **apple-touch-icon düzeltmesi adres olmayan metni kabul etmiyor** — düz bir cümlenin başına `http://` eklenip kaydediliyor ve "başarılı" deniyordu.
* **Yedi denetim kusuru artık "Tek Tıkla Düzelt" ile giderilebiliyor**: `og:image`, `og:type`, Twitter açıklaması, Twitter görseli, çok uzun görsel alt metni, çok uzun H1, eksik video şeması. Bunlar görünüyor ama düzeltilemiyordu.
* **Eklenti içinden yayımlanan yazı panele bildiriliyor** — durum, kullanım kaydı ve rozet güncelleniyor. Panele ulaşılamazsa yayın etkilenmez, ikinci yazı üretilmez.
* **Düzeltme etiketlerinin tamamı Türkçe ve çeviri yoluna alındı** (55 etiket; 14'ü İngilizceden çevrildi). Çeviri kataloğu kodla eşitlendi.
* Sürüm numarası aynı zamanda betik/stil önbellek anahtarıdır; `seoyen-page-links.js` değiştiği için sürüm yükseltildi — aksi hâlde kurulu siteler eski dosyayı önbellekten sunmaya devam ederdi.

= 2.0.9 =
* **"Tek Tıkla Düzelt" artık uzun süren yapay zeka üretimlerini de tamamlıyor.** Düzeltme önceden panele açılan tek bir isteğin içinde üretiliyordu; o istek 90 saniyeyi aşamadığı için yavaş bir model seçiliyken düzeltme hiç bitmiyor, ekranda "yapay zeka yanıt vermiyor" yazıyordu. Artık üretim panelde arka planda koşuyor ve eklenti sonucu aralıklarla soruyor — süre sınırı kalktı.
* **Yarım kalan düzeltme hakkınızı yakmıyor.** Aylık WordPress eylem hakkı ve yapay zeka kredisi, düzeltme gerçekten üretildikten sonra düşüyor; tarayıcı kapansa bile sonuç panelde saklı kalıyor.
* Düzeltme isteği başarısız olduğunda WordPress'e ham sunucu hata metni gönderilmiyor, anlaşılır Türkçe mesaj gösteriliyor.
* Site geneline uygulanan düzeltmeler (llms.txt, tema rengi, yapay zeka botu izinleri) panelin dış API ucundan çağrıldığında artık kategori adresiyle birlikte gönderilmiyor — eskiden bu istekler reddediliyordu.
* Eski sürümdeki kurulumlar etkilenmez: arka plan modu yalnız destekleyen eklentiye açılır.

= 2.0.8 =
* **"İçerik" menüsü artık "Öneriler".** Menüde yan yana duran "İçerik" ve "İçerik Botu" kalemleri karışıyordu. Asıl sorun benzerlik değildi: o sayfanın yedi sekmesinin çoğu (site denetimi düzeltmeleri, meta açıklamalar, alt metinler, şemalar) içerik üretmez, mevcut sayfaları düzeltir. Ortak payda "içerik" değil, onay bekleyen öneri — sayfa artık öyle adlanıyor. **İçerik Botu'na dokunulmadı**, yalnız sayfa başlığı ne yaptığını söylüyor: "İçerik Botu — Otomatik Blog Yazarı".
* **Eski yer imleriniz çalışmaya devam ediyor.** Sayfanın adresi değişti (`seoyen-content` → `seoyen-suggestions`); eski adrese giden bağlantılar sekme bilgisiyle birlikte yenisine yönlendirilir. Bu yönlendirme en az iki minör sürüm boyunca kalacak.
* **Menü sırası kümelendi.** Kalemler artık işe göre gruplu: önce günlük kullanılan üretim ekranları (Öneriler, İçerik Botu), sonra site yapısı (İç Linkler, Yönlendirmeler), analiz sekmeleri, dizine gönderim (IndexNow, Google Indexing) ve en altta bakım (Aktivite, Sistem Durumu, Ayarlar). Kurulumda bir kez açılan Ayarlar, her gün açılan ekranların üstünde durmuyor artık.
* **SEOYEN sayfaları artık bölümlere ve sekmelere ayrılıyor.** Arama Performansı sayfasında üstte "Genel Bakış" bölümü (özet kartlar + tıklama oranı çubuğu), altında Search Console / Sıralamalar / Ziyaretçi sekmeleri var. Önceden her şey tek bir dikey listede alt alta diziliyordu. Sekmeler JavaScript gerektirmez.
* **Eklenti panelden daha eskiyse sayfa yine eksiksiz görünür.** Panelin gönderdiği yeni bir kart türünü bu sürüm tanımıyorsa, içindekiler düz liste olarak çizilir — veri kaybolmaz, yalnız gruplama sadeleşir ve sayfada bunu söyleyen bir bilgi notu çıkar.
* **Panel artık hangi sürüme çizdiğini biliyor.** Eklenti her istekte sürümünü, dilini ve desteklediği kart sözlüğünün sürümünü bildirir; panel ekranı buna göre hazırlar.
* **Aşırı büyük içerik sayfayı kilitlemiyor.** Bir sayfada çizilecek kart sayısına, veri boyutuna ve iç içe geçme derinliğine üst sınır kondu; sınır aşılırsa içerik sessizce kaybolmaz, kısaltıldığını söyleyen bir uyarı gösterilir.

= 2.0.7 =
* **AI bot ayarları artık gerçekten yayına giriyor.** Kendi robots.txt metninizi yazdıysanız (tam metin modu), SEOYEN'in yönettiği bot kuralları o metnin sonuna eklenir. Önceden kendi metniniz varken bot kuralları HİÇ yayınlanmıyordu: Ayarlar'daki beş bot anahtarı ile panelden gelen dört bot düzeltmesi kaydediliyor ama çıktıya yansımıyordu. Aynı bot iki kez yazılmaz — sizin metninizdeki kural, SEOYEN'in yönettiği kuralla değiştirilir.
* **Bot kuralı kaydedilemezse "yapıldı" denmiyor.** Yazma tutmadığında düzeltme artık açıkça hata döndürür; panel kaydı yanlışlıkla "çözüldü" işaretlemez.
* **`/llms.txt` ve `/llms-full.txt` doğru yanıt veriyor.** Özellik kapalıysa veya içerik boşsa artık gövdesiz "200 OK" yerine 404 dönüyor. Kurallar bir kez yenilenmemiş kurulumlarda dosyalar adres üzerinden de sunuluyor — daha önce bu kurulumlarda `/llms-full.txt` 404 veriyordu. Eklenti devre dışı bırakıldığında bu adresler artık sitenin ana sayfasını döndürmüyor.
* **`llms-full.txt` düzeltmesi yayın anahtarını da açıyor** — içerik yazılıp dosya sunulmadan kalmıyor.
* **robots.txt / llms.txt içeriğiniz artık bozulmuyor.** Site haritası satırındaki `&` karakteri `&amp;`'e çevrilmiyor ve `<https://...>` biçimindeki bağlantı satırları silinmiyor.

= 2.0.6 =
* **Konu başlıkları havuzu ikiye ayrıldı.** Sırada bekleyen konular ile daha önce yazıya dönüşmüş konular artık ayrı açılır alanlarda; ikisi de kapalı açılır ve her birinin başlığında kendi sayısı yazar. Önceden ikisi aynı tabloda karışıyordu: 15 konunun tamamı kullanılmışken bölüm dolu görünüyor, başlıktaki "0 bekleyen" rozetiyle çelişiyordu.
* **Bekleyen bir konuyu artık kaldırabilirsiniz.** Satırdaki "Kaldır" düğmesi konuyu sıradan çıkarır; onay sorulur. Konu SİLİNMEZ — panelinizde kayıtlı kalır, yalnız bot bir daha o konuyu seçmez.
* **Kullanılmış konuda kaldırma yoktur.** Yayımlanmış bir yazının kaynağını sıradan çıkarmak üretim geçmişini silerdi; o satırlarda düğme çizilmez, panel de böyle bir isteği reddeder.
* Kaldırma başarısız olursa satır listede kalır ve sebebi yazılır — sahte "kaldırıldı" gösterilmez. Panel bu ucu henüz yayımlamamışsa (eski panel) düğme hiç çizilmez, ekran bugünkü davranışına düşer.

= 2.0.5 =
* **"Son çalışmalar" artık zamanlanmış koşuları da gösteriyor.** Liste bugüne kadar yalnız bu ekrandan ELLE başlatılan koşuları kaydeden yerel günlükten okunuyordu; panelde arka planda koşan (zamanlanmış) yazılar hiç görünmüyordu. Kaynak panelin koşu defterine taşındı. Her satırda yazının başlığı, botun araştırdığı konu, koşunun durumu, harcanan kredi ve tarih var; yayımlanmış yazının başlığı doğrudan yazıya giden bir bağlantıdır.
* **Harcanan kredi eksikse bunu söylüyoruz.** Eski koşularda alt işlerin (taslak planı, güvenlik kontrolü) kaydı tutulmadığı için toplam gerçekte olduğundan düşüktür. Böyle satırlarda sayının yanında bir yıldız ve açıklaması çıkar — eksik bir toplam "tam" gibi gösterilmez.
* **Konu başlıkları havuzu ayrı, açılır-kapanır bir bölüm oldu** ve her zaman kapalı açılır. İçinde botun sıradaki yazı için seçebileceği konular, durumları (bekliyor/kullanıldı), nereden geldikleri ve kullanıldıysa hangi yazıya dönüştükleri listelenir. Başlıkta bekleyen konu sayısı görünür.
* Panel bu iki yeni ucu henüz yayımlamamışsa (eski panel) ekran bugünkü davranışına düşer: koşu listesi yerel kayda döner, konu havuzu bölümü hiç çizilmez. Uydurma satır gösterilmez.

= 2.0.4 =
* **İçerik Botu ekranı yeniden düzenlendi.** Durum bilgisi (otomatik çalışma, çalışma aralığı, son çalıştırma, kredi ve "Üret" düğmesi) artık ekranın üstünde tam genişlikte bir şeritte; ayarlar onun altında geniş ekranda iki, çok geniş ekranda üç sütuna akıyor. Önceki düzende sol sütunun büyük bölümü boş kalıyordu.
* **Kategori: "Otomatik — yapay zeka seçsin".** Yeni kurulumların varsayılanı budur. Yapay zeka, yazının konusuna en yakın kategoriyi sitenizin **mevcut** kategorileri arasından seçer; bot yeni kategori açmaz, uygun kategori bulunamazsa WordPress varsayılanı kullanılır. "WordPress varsayılanı" seçeneği duruyor; daha önce belirli bir kategori seçtiyseniz seçiminiz aynen korunur.
* **Yasaklı kelimeler ve konular artık açılır-kapanır bir bölümde** ve her zaman kapalı açılır. Bölümün içinde, sistemin her koşulda engellediği konular yazı olarak listelenir — kendi listenize yalnız bunların dışında engellemek istediklerinizi yazarsınız.
* **Boş kutulara panelin önerdiği başlangıç değerleri yazılır** (marka sesi, yasaklı kelimeler, yasaklı konu terimleri). Daha önce kaydettiğiniz bir değer varsa ona dokunulmaz.
* **Tasarım SEOYEN ile hizalandı.** Ekran ham WordPress admin renkleri yerine eklentinin kendi tasarım belirteçlerini kullanıyor; marka moru SEOYEN'in ana tonuna (#8b5cf6) çekildi ve metin/düğme kontrastları WCAG AA (4.5:1) eşiğine göre ölçülerek ayarlandı.

= 2.0.3 =
* İçerik Botu ayar ekranı 3 alandan 17 alana çıktı. Ayarlar dört başlık altında toplandı: **Zamanlama** (otomatik çalıştırma, aralık, üretilen yazının durumu), **Yayın** (kategori, yazar, içerik dili, hedef kelime sayısı), **İçerik** (anlatım tonu, marka sesi, sabit etiketler, en fazla etiket, yeni açılabilecek etiket, liste biçimli yazı oranı) ve **Kalite ve güvenlik** (yasaklı kelimeler, yasaklı konu terimleri, yayın için en düşük kalite puanı, yeniden yazdırma eşiği). Bu ayarların dokuzu panelde zaten vardı ama eklenti ekranından erişilemiyordu; beşi yeni.
* **Kategori seçimi**: üretilen yazının hangi kategoriye düşeceğini artık siz seçiyorsunuz. Liste sitenizin kendi kategorilerinden gelir ve seçim kategori kimliği olarak saklanır — bot bu sayede sitenizde kendiliğinden yeni kategori açamaz.
* **Yazar seçimi**: üretilen yazılar yazarsız kaydediliyordu (post_author=0); yazar kutusu boş kalıyor, yazar arşivi oluşmuyordu. Artık yazı yayımlama yetkisi olan kullanıcılar arasından bir yazar seçebilirsiniz.
* Seçili kategori ya da yazar sonradan silinirse yazı sessizce etkilenmez: eklenti bunu yayın öncesinde doğrular, WordPress varsayılanına düşer ve durumu aktivite günlüğüne yazar.
* Boş bırakılan sayı alanları artık sıfır olarak kaydedilmiyor; boş kutu "belirtilmedi" demektir ve panelin varsayılanı korunur.
* Kaydettikten sonra alanlar panelin GERÇEKTEN sakladığı değerle tazeleniyor: panel bir sayıyı kendi sınırına çekerse ekran artık eski değeri göstermeye devam etmiyor.
* Önbellek anahtarı: sürüm 2.0.3 oldu (ayar ekranının işaretlemesi, JavaScript ve CSS dosyaları değişti).

= 2.0.2 =
* İçerik Botu kurulumunun "Sitenizi tanıyalım" adımı artık DÜZENLENEBİLİR: niş, ton ve hedef kitle alanlarını kendiniz yazıp kaydedebilirsiniz. Önceden bu adım salt okunurdu; yanlış çıkarılmış bir profili düzeltmenin tek yolu "Yeniden analiz et" demekti, o da aynı verilerle koştuğu için çoğu zaman aynı sonucu üretiyor ama her denemede yapay zeka kredisi harcıyordu. Kendi yazdığınız profil kredi harcamaz ve sonraki analizler onu ezmez.
* "Yeniden analiz et" düğmesinin maliyeti artık düğmenin yanında yazıyor; bakiyeniz yetmiyorsa düğme uyarı görünümüne geçip kredi yükleme bağlantısı gösteriyor.
* "Yeniden analiz et" gerçekten yeniden analiz ediyor: panelin tazelik penceresi içinde aynı önbelleklenmiş profil geri döndüğü için düğme sessizce etkisiz kalıyordu.
* Yapay zeka yeni bir profil önerdiğinde kendi yazdığınız metin sessizce değiştirilmiyor; "Öneriyi kullan" ve "Benimkini koru" seçenekleri sunuluyor.
* İçerik Botu sayfasının JavaScript dosyası, ekran adı çeviriye göre kaydığında da yükleniyor (ekran kimliği artık WordPress'in kendi döndürdüğü değerden okunuyor).
* Önbellek anahtarı: sürüm 2.0.2'ye çıkarıldı; 2.0.1'de sürüm sabit kalırken JavaScript değiştiği için düzeltmeler tarayıcıya ulaşmıyordu.

= 2.0.1 =
* Önbellek düzeltmesi: yönetim arayüzünün JavaScript ve CSS dosyaları eklenti sürümüyle (`?ver=`) sunuluyor; 2.0.0 sürüm numarası sabit kalırken beş JS dosyası değiştiği için tarayıcı ve CDN eski dosyaları sunmaya devam ediyordu. Sürüm artırıldı, düzeltilmiş dosyalar artık gerçekten yükleniyor.
* Kategori/etiket arşivlerinde yapılandırılmış veri kaybı giderildi: sayfada başka bir bileşenin (tema/eklenti) `CollectionPage` bloğu varken eklenti KENDİ `@graph`'ının tamamını bastırıyordu — böylece `BreadcrumbList` ve kullanıcının elle yazdığı şema (ör. `FAQPage`) da siliniyordu. Artık yalnız yinelenen `CollectionPage` düğümü düşürülür, diğer düğümler basılır.
* Sosyal kart başlığı tutarlılığı: `og:title` markalı tam başlığı, `twitter:title` ise çıplak terim adını yazıyordu. İkisi artık aynı kaynaktan üretilir (elle girilmiş `twitter:title`/`og:title` her zaman önceliklidir).
* `noindex` işaretlenmiş yazı ve terim sayfalarına artık canonical basılmaz — eklentinin kendi noindex çıktısı da hesaba katılır (önceden yalnız WordPress'in `wp_robots` çıktısı okunuyordu, bu yüzden eklentinin kendi işaretlediği sayfalarda çelişen sinyal kalıyordu).
* Yinelenen etiket koruması artık ölçemediğini biliyor: komşu bir eklenti `wp_head` içinde iç içe çıkış tamponu açtığında koruma körleşip yinelenen `description`/`og:description` üretiyordu (ölçüldü: 1 → 2). Bu durum artık tespit edilir ve sunucu hata günlüğüne bir kez bildirilir.

= 2.0.0 =
* WordPress 7.1 uyumluluğu doğrulandı (`Tested up to` 7.1'e yükseltildi).
* Arayüz çevirisi düzeltmesi: eklenti artık kendi `languages/` dizinini `load_plugin_textdomain()` ile açıkça yüklüyor. Aynı `seoyen` text domain'ini beyan eden bir tema kuruluyken WordPress'in gecikmeli (JIT) çeviri yükleyicisi domain'i tema dizinine çözüyor, eklentinin `seoyen-tr_TR.mo` dosyasına hiç bakmıyordu; sonuçta yönetim arayüzü çevrilmemiş kalıyordu ("Settings", "Redirects"). Menüler, ayar etiketleri ve bildirimler artık doğru şekilde Türkçe görünüyor.
* Belge düzeltmeleri: otomatik düzeltilebilen denetim kontrolü sayısı gerçek değerine güncellendi (45 → 57) ve iç bağlantı ekleyicinin çalışma biçimi doğru anlatıldı (DOMDocument değil, mevcut bağlantıları koruyan tokenizasyon).

= 1.1.0 =
* Sunucu-sürümlü companion çerçevesi: panel artık her admin sekmesinin İÇERİĞİNİ "blok" listesi olarak gönderir; eklenti bu blokları yalnız bilinen 8 güvenli tiple (scorecard, kpi_row, timeseries_chart, bar_chart, table, action_list, notice, text) çizer. **Panele yeni bir veri sekmesi eklendiğinde eklentiyi güncellemeniz gerekmez** — sekme otomatik görünür.
* Yeni companion sekmeleri: **AI Görünürlük** (AI kaynaklı trafik, marka bahsi, ses payı, aktif motor + AI bot tarama trafiği + önerilen GEO aksiyonları) ve **Arama Performansı** (Search Console tık/gösterim/CTR/pozisyon + günlük trend + en çok tıklanan sorgular + takip edilen kelime sıralamaları + Google Analytics özeti).
* Dashboard widget'ı: panel veri-şekli düzeltmesi + "SEO performansı" bölümü (organik trafik, alan otoritesi, kazanılan/kaybedilen backlink) ve companion sekmelerine ("AI Görünürlük", "Arama Performansı") hızlı erişim bağlantıları.
* Grafik blokları artık paketlenmiş Chart.js (MIT) ile çizgi/alan ve sütun grafiği olarak çizilir; JavaScript kapalıyken ya da grafik kütüphanesi yüklenemediğinde erişilebilir tablo görünümüne zarifçe düşer.
* Panel tarafı düzeltme: wp_audit_summary sorgusu artık var olmayan tracked_keywords.search_volume kolonunu okumaz (SQL hatası giderildi).

= 1.0.13 =
* AI Bot Ziyaret Kaydı: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, PerplexityBot, Perplexity-User, Google-Extended, GoogleOther, Bytespider, Meta-ExternalAgent, CCBot, Amazonbot, Applebot-Extended, bingbot ve MistralAI-User ziyaretleri gün + sayfa bazında sayılır; saatte bir SEOYEN paneline gönderilir (AI Bot Analitiği). Bot eşleşmesi yoksa sıfır ek sorgu.
* IndexNow desteği artık kendi "IndexNow" admin sayfasında: yayınlanan içerikler api.indexnow.org adresine anında bildirilir (non-blocking); doğrulama anahtarı kullanıcı tarafından üretilir (alınmaz) ve `/{key}.txt` sanal rotasıyla sunulur. "Yeni Anahtar Üret" ve "Test Bildirimi Gönder" aksiyonları eklendi. Varsayılan kapalı.
* Google Instant Indexing (yeni "Google Indexing" admin sayfası): servis hesabı JSON'u ile kimlik doğrulayıp yayınlanan içerik URL'lerini Google Indexing API'sine bildirir (saf openssl/RS256, vendor kütüphane yok). Varsayılan kapalı.
* Ayarlar → SEO Behavior sekmesine "AI Botları" bölümü: bot ziyaret kaydı + GPTBot/ClaudeBot/PerplexityBot/Google-Extended/bingbot için robots.txt izin toggle'ları.
* Panel bağlantısı düzeltmesi: API istemcisi artık yalnız X-Seoyen-Key header'ı gönderir — panelin çift header (X-API-Key + X-Seoyen-Key) reddi nedeniyle 400 alan tüm panel çağrıları onarıldı.
* Günlük telemetri cron'u artık panele sürüm + özellik durumu (`plugin_version`, `indexnow_enabled`, `bot_logging_enabled`) ping'i atar.
* Yeni tablo: `{prefix}seoyen_bot_hits` (30 günlük yerel tampon; panele gönderilen satırlar işaretlenir, eski satırlar otomatik silinir).
* Karşılama/onboarding ekranı: aktivasyon sonrası tek seferlik yönlendirme, panel bağlantısı henüz kurulmamışken dashboard'da adım adım karşılama bölümü ve kapatılabilir kurulum bildirimi.
* Eklenti↔panel köprüsü sağlamlaştırıldı: ping/aktivasyon el sıkışmasına capabilities bildirimi eklendi; panel desteklenmeyen bir aksiyon istediğinde eklenti hata yerine zarif "desteklenmiyor" yanıtı döner.
* readme.txt dış servis beyanları tamamlandı: IndexNow ve Google Instant Indexing girdileri eklendi (WordPress.org yönergeleri uyumu).

= 1.0.12 =
* WP.org inceleme revizeleri: `rest_url()` ile REST endpoint URL'leri düzeltildi (hardcoded `/wp-json/` kaldırıldı).
* `register_setting()` çağrıları tip-bazlı sanitize callback'lerle güncellendi (`sanitize_text_field`, `sanitize_url`, `absint`, `rest_sanitize_boolean`).
* JSON-LD çıktısında `</script>` breakout güvenlik açığı kapatıldı — `JSON_UNESCAPED_SLASHES` kaldırıldı, `<\/` replace koruması eklendi.

= 1.0.8 =
* Autofix kapsamı 45 check'ten **57 check'e** çıkarıldı — SEOYEN Panel audit'teki 12 yeni sorun türü artık tek tıkla düzeltilebilir.
* 5 yeni kayıtlı check handler'ı: `content.meta_description_duplicate`, `content.low_word_count`, `content.h1_missing_in_content`, `schema.local_business_missing`, `ai_search.llms_full_missing` — panel registry ile plugin handler listesi senkronize edildi.
* 7 yeni spec-gereği check handler'ı: `social_meta.twitter_card_type_missing`, `schema.how_to_missing`, `schema.video_missing`, `schema.review_missing`, `hreflang.html_lang_missing`, `ai_search.claude_bot_allowed`, `ai_search.perplexity_bot_allowed`.
* Schema Markup genişlemesi: **4 yeni builder** — `build_howto` (H3/H4 + P regex ile adım parse), `build_video` (featured image thumbnail + yazı bilgileri), `build_local_business` (site bilgileri + override desteği), `build_review` (rating/author override ile).
* Frontend SEO Output genişlemesi: apple-touch-icon, theme-color, twitter:card (site-level default) ve llms-full.txt virtual serving (`/llms-full.txt`) artık plugin tarafından rendering priority 1'de emit edilir.
* HTML lang attribute filter: `language_attributes` WP filter'ı üzerinden kullanıcı tarafından seçilen locale uygulanır (BCP 47 kod doğrulaması ile).
* AI bot allow kuralları: Claude ve Perplexity bot'ları için ayrı `allow` modu — önceki allow/block toggle'dan farklı olarak iki bot için de idempotent Allow: / yazımı.
* Düşük kelime sayısı (`content.low_word_count`) için AI tabanlı içerik genişletme handler'ı — panel AI `content-expand` promptu ile uzatılmış içeriği yazıya ekler.

= 1.0.7 =
* Autofix kapsamı 14 check'ten **45 check'e** çıkarıldı — SEOYEN Panel audit'in tespit ettiği çok daha geniş bir sorun yelpazesi artık tek tıkla düzeltilebilir.
* Yeni içerik yeniden yazma (rewrite) handler'ları: başlık çok kısa/uzun/duplicate, meta açıklama çok kısa/uzun/duplicate, H1 çok uzun/duplicate, alt metni çok kısa/uzun — her biri SEOYEN Panel'deki AI ile yeni içerik üretir ve uygular.
* Schema Markup genişlemesi: **6 yeni builder** — Article, BreadcrumbList, Organization, WebSite (SearchAction dahil), Product (WooCommerce entegrasyonlu), FAQPage (içerikten Q&A regex + Gutenberg FAQ block parse). Payload yoksa plugin kendisi üretir.
* Social Meta genişlemesi: og:type, og:url, twitter:title, twitter:description, twitter:image için ayrı check_key desteği.
* Yönlendirme Zinciri (Redirect Chain) çözücü: panel zinciri tespit ettiğinde plugin ortadaki tüm redirect'leri pasifleştirip kaynak → son hedef tek 301'e düşürür.
* Kırık Dış Link düzeltme: `links.broken_outgoing` artık yeni hedef URL geldiğinde otomatik 301 yönlendirme oluşturur (kayıt `broken_backlinks` origin ile işaretlenir).
* AI arama botları yönetimi: `ai_search.gpt_bot_blocked` ve `ai_search.claude_bot_blocked` check'leri GPTBot, ClaudeBot, anthropic-ai bot'larını robots.txt extra'ya allow/block modunda ekler.
* Mobil ikon/theme-color eksiklikleri: `mobile.apple_touch_icon_missing` (site ikonu fallback), `mobile.theme_color_missing` (varsayılan #8b5cf6) artık tek tıkla düzeltilebilir.
* Yanlış noindex kaldırma: `crawlability.noindex_wrong` Yoast/RankMath/SEOPress/native tüm seviyelerde noindex bayrağını temizler.
* Çoklu meta/title/H1 tespiti: `content.multiple_title`, `content.multiple_meta_desc`, `content.multiple_h1` — theme düzenlemesi gerektiren check'ler için detection-only + Türkçe açıklayıcı hint.
* Integration base class'ına `set_og_field($post_id, $field, $value)`, `set_twitter_field($post_id, $field, $value)`, `set_title()` (alias), `set_meta_desc()` (alias) metotları eklendi — plugin'lere bağımsız genel OG/Twitter kontrolü sağlar.
* FileManager'a `update_robots_ai_bots($action, $bots)` eklendi — robots.txt extra kısmında AI bot bloklarını idempotent şekilde günceller (eski blok varsa temizlenir, yenisi yazılır).
* RedirectManager'a `deactivate_intermediates($chain_urls)` eklendi — chain resolver için ortadaki 301'leri soft-delete (is_active=0) olarak işaretler.
* SchemaManager builder'ları Google Rich Results Test uyumlu @id + mainEntityOfPage yapısı kullanır.

= 1.0.6 =
* Panel: wp_issue_fixed callback endpoint eklendi — plugin düzeltme tamamlandığında panel audit_issues tablosunda resolved=1 (veya detection-only skip durumunda muted=1) işaretlenir. Sayfa yenilendiğinde düzeltilen issue'lar listeden kaybolur.
* JS: Toplu URL düzeltme sonrası her URL satırı "✓ Düzeltildi" olarak görsel güncellenir (yeşil arka plan + disable button). Başarısız URL'ler kırmızı ile işaretlenir.
* URL eşleştirme iyileştirildi: trailing slash, http/https, encoding farklılıkları için çoklu varyant deneme (findUrlRow helper).
* AI hata mesajları iyileştirildi: "Yapay zeka servisi şu anda kullanılamıyor. Birkaç dakika sonra tekrar deneyin." — HTTP 503 (önceki 500/502 yerine).
* CSS: .seoyen-audit-urls li.is-fixed / is-failed için görsel stilizasyon.

= 1.0.5 =
* AI-only düzeltme sistemi: Tek Tıkla Düzelt artık gerçek yapay zeka ile içerik üretir. Meta açıklama, başlık, H1, alt metin, OG, Twitter Card, schema, robots.txt ve llms.txt için tamamen AI tabanlı üretim.
* Fallback sistemi kaldırıldı: Yazı slug'ından, excerpt'ten veya dosya adından otomatik üretilen eski "akıllı fallback" mantığı artık yok — payload AI'dan gelmek zorunda, yoksa "Bu düzeltme yapay zeka ile içerik üretmeyi gerektirir" hatası verir.
* 10 yeni AI prompt şablonu: Her autofix check türü için Türkçe, SEO uyumlu, context-aware prompt.
* Yeni panel endpoint: `wp_generate_fix` — plugin AJAX handler'ı önce panel'den AI üretim ister, dönen payload ile düzeltmeyi uygular.
* Context-aware AI üretim: Her autofix çağrısı WordPress'ten ilgili verileri (post başlığı, içerik özeti, attachment meta, featured image, kategoriler, parent post) toplar ve AI'a ona göre prompt gönderir.
* AI kredi sistemi entegrasyonu: Kredi bittiğinde "Yapay Zeka krediniz bitti" modal'ı gösterilir, yenilenme tarihi görüntülenir, işlem yapılmaz.
* Plan gate: Tek Tıkla Düzelt, AI Yayınla, Uygula, yönlendirme yönetimi ve webhook oluşturma gibi yazma aksiyonları yalnızca Bireysel, Pro ve Enterprise paketlerinde kullanılabilir. Ücretsiz paket eklentiyi kurup panel verilerini görüntüleyebilir ama yazma yapamaz.
* Quick access check endpoint (`wp_quick_access_check`): Plugin boot sırasında kullanıcının plan ve kredi durumunu panel'den sorgular, 12 saat boyunca cache'ler, UI'ı buna göre ayarlar.
* Plan banner: Ücretsiz paket kullanıcıları için Dashboard ve İçerik sayfalarında bilgilendirme banner'ı.
* Credit banner: Kredi bittiğinde tüm ilgili sayfalarda yenilenme tarihi ile uyarı banner'ı.
* Detection-only check'ler korundu: `crawlability.canonical_missing`, `mobile.viewport_missing`, `social_meta.og_image_missing` ve `hreflang.missing` AI gerektirmez — WordPress verilerinden (permalink, featured image, WPML/Polylang) otomatik uygulanır.

= 1.0.4 =
* Tek Tıkla Düzelt artık gerçekten çalışıyor: audit handler'a 7 akıllı fallback eklendi — payload boş gönderildiğinde plugin WordPress verilerinden otomatik meta açıklama, alt metin, OG açıklama, hreflang vb. üretir.
* Meta ve OG açıklama fallback: yazı excerpt'i varsa onu, yoksa içeriğin ilk 155 karakteri (HTML strip + kelime sınırından kesim) kullanılır.
* Alt metin fallback: attachment başlığı → parent post başlığı → dosya adından insanlaştırılmış metin.
* Başlık fallback: payload boşsa yazı slug'ından insanlaştırılmış başlık üretilir.
* Hreflang akıllı tespit: WPML/Polylang aktifse alternatif URL'ler otomatik çekilir; tek dilli siteler için "skipped_no_alternates" (sessiz başarı) döner — hata vermez.
* URL resolve iyileştirmesi: query string, fragment, trailing slash, http/https farklılıkları artık otomatik handle ediliyor (get_page_by_path fallback dahil).
* Tek Tıkla Düzelt butonu artık issue'daki TÜM affected URL'leri sırayla düzeltir (ilk URL yerine). Kart üzerinde canlı sayaç: "Düzeltiliyor (3/8)…".
* Kısmi başarı durumu: bazı URL'ler düzeltilip bazıları hata verirse "Kısmen düzeltildi (5/8)" mesajı gösterilir.
* Global audit fix'leri (viewport/robots/llms) URL gerektirmez — panel URL göndermese bile çalışır.

= 1.0.3 =
* 403 "Güvenlik doğrulaması başarısız" hatası kalıcı olarak çözüldü: Admin JS dosyaları artık footer yerine header'a yükleniyor, wp_localize_script ile emit edilen seoyenAdmin objesi inline script bloklarından önce hazır oluyor — nonce artık doğru geçiyor.
* Inline script'lerde ajaxUrl/nonce değişkenleri artık butona basma anında okunuyor (lazy read).
* Download endpoint (wp_download_plugin) artık X-Seoyen-Key header-auth ile de çalışıyor — WP native güncelleme akışında "Unauthorized" hatası çözüldü.

= 1.0.2 =
* Tek Tıkla Düzelt ve Bunu Düzelt butonları düzeltildi: AJAX handler artık REST dispatch yerine doğrudan Seoyen_Audit_Handler::autofix() çağırıyor (X-Seoyen-Key header beklentisi bypass edildi, admin nonce yeterli).
* 403 "Forbidden" hatası düzeltildi: Tüm seoyen_admin ve seoyen_redirects_action nonce kontrolleri artık graceful fail veriyor — kullanıcıya "Sayfayı yenileyip tekrar deneyin" mesajı gösterilir (wp_die yerine JSON error).
* "Tümü" sekmesi artık hem Site Denetimi düzeltmelerini hem de AI önerilerini/makalelerini yan yana gösteriyor.
* Plugin güncelleme sonrası panel'e otomatik versiyon sync eklendi: upgrader_process_complete sonrası ve admin_init'te plugin_version mismatch varsa panel'e wp_site_status ping atılıyor — "Güncelleme mevcut" badge'i artık Check Now gerektirmeden kaybolur.
* Tüm admin UI tamamen Türkçeleştirildi: menü, sekmeler, kartlar, butonlar, bildirimler. ASCII-safe yazımlar (baglan, icin, duzelt, vs.) doğru Türkçe karakterlere (bağlan, için, düzelt) çevrildi.
* Setup wizard "API key required" hatası düzeltildi: key önce option'a yazılmadan explicit olarak test edilir.

= 1.0.1 =
* Added Site Audit Fixes tab in Content Suggestions page: shows up to 14 auto-fixable audit checks pulled from the SEOYEN panel with one-click fix buttons.
* Added AI Articles tab in Content Suggestions page: lists completed AI Writer articles from the panel with Publish-to-WP action.
* Internal Links page now reads from the live link_opportunities data source; suggestions auto-populate whenever the panel internal-links page is visited.
* Fixed setup wizard "API key required" error by passing the key explicitly on the activation request instead of relying on the option cache.
* Fixed redirect form: source and target URLs accepted as relative paths (`/eski`, `/yeni`) and site-local full URLs; no more `http://yeni` corruption.
* Suppressed foreign admin notices on SEOYEN admin pages so the page title area is not polluted by other plugins.
* Made Dashboard, Settings, Redirects, and System Status pages use the full content width.
* Added WP native update flow with dual-source detection (WordPress.org if the plugin is listed there, SEOYEN panel otherwise).
* Added plugin admin update banner with version-based dismiss and security-update override.
* Added panel "Check for Updates" button on the Settings > General tab.
* Added menu entry "WordPress Eklentisi" in the SEOYEN panel sidebar with a dedicated install/upgrade page and per-project API key management.
* Added Turkish translation (.po / .mo) plus JSON translations for admin JS.
* Panel update_check endpoint parses `Version`, `Stable tag`, tested/requires/requires_php, changelog, and upgrade_notice from the readme.txt.

= 1.0.0 =
* Initial public release.
* 34 REST API endpoints under `/wp-json/seoyen/v1/` (system, content, meta, media, schema, social, links, redirects, audit, files, activity, bulk, webhooks).
* 4 SEO plugin adapters (Yoast SEO, Rank Math, SEOPress, native fallback).
* 14 audit auto-fix check types (title_missing, meta_missing, h1_missing, alt_missing, canonical_missing, robots_missing, json_ld_missing, og_missing, viewport_missing, hreflang_missing, llms_txt_missing, and more).
* Redirect manager with exact / prefix / regex matching, hit-count analytics, and CSV bulk import.
* Seven admin pages: Dashboard, Settings, Redirects, Internal Links, Content Suggestions, Activity Log, System Status.
* Dashboard widget for wp-admin index page.
* Outbound webhook dispatcher with HMAC-SHA256 signing.
* Activity log with search, filter, and CSV export.
* Virtual `robots.txt` and `llms.txt` serving.
* Full i18n support with POT template (`languages/seoyen.pot`).

== Upgrade Notice ==

= 2.2.2 =
"Kopya H1" ve "H1 çok uzun" düzeltmeleri artık uygulanabiliyor: içerikte değiştirilecek bir <h1> yoksa eklenti sessizce vazgeçmiyor, panelde "Yazı başlığını da güncelle" onayı istiyor. Onay verilmeden hiçbir şey değişmez; kalıcı bağlantınız (slug) her hâlükârda aynı kalır. Önerilen güncelleme.

= 2.2.1 =
Meta açıklama düzeltmeleri artık sayfada gerçekten görünüyor: eklenti, açıkça kaydettiğiniz değere sahipse temanın bastığı etiketi susmak yerine değiştiriyor (açıklama, Open Graph açıklaması/türü, Twitter kartı). Türetilmiş yedekler temaya dokunmaz; başka bir SEO eklentisi kuruluysa davranış değişmez. Önerilen güncelleme.

= 2.2.0 =
Türkçe yönetici ekranında İngilizce kalan on bir etiket çevrildi: araç adları, önem dereceleri ve makale kartı etiketleri artık tek dilde. Yalnız görünen metinler değişti; ayarlarınıza ve verilerinize dokunulmadı. Önerilen güncelleme.

= 2.1.3 =
"Tek Tıkla Düzelt" artık sorunun tüm uygun sayfalarını kapsıyor ve tıklamadan önce kaç sayfa işleneceğini, tahmini kredi maliyetini ve kalan bakiyenizi söylüyor. Onaylamadan kredi harcanmaz. Önerilen güncelleme.

= 2.1.2 =
Düzelttiğiniz denetim sorunları artık aktif listeden düşüyor ve varsayılan olarak kapalı "Uygulanmış düzeltmeler" bölümünde toplanıyor. Sorun yeniden ortaya çıkarsa kendiliğinden aktif listeye döner. Önerilen güncelleme.

= 2.1.0 =
WooCommerce için e-ticaret SEO katmanı: ürün ve kategori kataloğu, gün içi stok-fiyat takibi, üç yeni tek-tık düzeltme, sekiz denetim kontrolü. Kaldırma bildirimi, hız sınırı ve otopilotun sessiz yayını da düzeltildi. Önerilen güncelleme.

= 2.0.8 =
"İçerik" menüsü "Öneriler" oldu ve menü kalemleri işe göre kümelendi. Eski adres yenisine yönlendirilir, yer imleri kırılmaz. İçerik Botu değişmedi. Ayrıca SEOYEN veri sayfaları bölüm ve sekmelere ayrıldı; eklenti panelden eski kalsa bile sayfa eksiksiz görünür.

= 1.1.0 =
Sunucu-sürümlü companion çerçevesi: AI Görünürlük + Arama Performansı sekmeleri eklendi, panele yeni özellik geldiğinde artık eklenti güncellemesi gerekmiyor. Grafikler paketlenmiş Chart.js ile çizilir. Önerilen güncelleme.

= 1.0.13 =
AI bot ziyaret kaydı + IndexNow + Google Instant Indexing + karşılama ekranı + robots.txt AI bot toggle'ları. Panel bağlantısını kıran çift-header hatası düzeltildi — tüm kullanıcılar için önerilen güncelleme.

= 1.0.8 =
Autofix 57 check'e çıkarıldı, 12 yeni tür (twitter:card türü, HowTo/Video/Review schema, html lang, Claude/Perplexity allow, düşük kelime sayısı, llms-full.txt). Schema builder + frontend genişlemesi. Önerilen güncelleme.

= 1.0.7 =
Autofix 45 check'e çıkarıldı, Schema builder, redirect chain resolver, AI bot yönetimi. Önerilen güncelleme.

= 1.0.6 =
Düzeltme callback'i + URL satırı UI güncelleme + AI hata mesajı iyileştirme. Önerilen güncelleme.

= 1.0.5 =
AI tabanlı düzeltme sistemi eklendi. Tek Tıkla Düzelt için Bireysel veya üstü paket ve AI kredisi gereklidir. Fallback mantığı kaldırıldı — yalnızca yapay zeka ile çalışır. Önerilen güncelleme.

= 1.0.4 =
Tek Tıkla Düzelt akıllı fallback'lerle tam çalışır hale getirildi. Meta, alt metin, OG, hreflang otomatik üretilir. Toplu URL düzeltme eklendi. Önerilen güncelleme.

= 1.0.3 =
Kritik 403 nonce hatası ve update "Unauthorized" hatası çözüldü. Önerilen güncelleme.

= 1.0.2 =
Tek Tıkla Düzelt düzeltildi (403 fix), Tümü sekmesinde audit ve AI önerileri birlikte, otomatik versiyon sync, tamamen Türkçe UI. Önerilen güncelleme.

= 1.0.1 =
Site Audit Fixes + AI Articles tabs added, internal links auto-populate, setup wizard and redirect form fixes, foreign notice suppression, full-width admin pages. Recommended update.

= 1.0.0 =
Initial public release.
