Mert Özen Her Satırda Daha İleri
SEO ve GEO Structured Data ve Schema.org — #04

Diğer Tipler ve Kaldırılan Rich Result'lar: VideoObject, SoftwareApplication, Speakable, FAQ ve HowTo'nun Hikâyesi

Mert Özen 14 Kas 2026 10 dk 5 görüntülenme
Diğer Tipler ve Kaldırılan Rich Result'lar: VideoObject, SoftwareApplication, Speakable, FAQ ve HowTo'nun Hikâyesi

VideoObject yalnızca tek videoya odaklanan bir watch page'te video özelliklerine aday olur, SoftwareApplication puan veya yorum olmadan rich result üretmez, speakable ise hâlâ İngilizce ve haber odaklı bir beta. HowTo'dan FAQ'ya 2023–2026 arasında kaldırılan rich result'ların tarihlerini Google'ın değişiklik günlüğünden çıkarıyor, kaldırılan markup'ı silmenin gerekip gerekmediğini ve mertozen.com'daki karşılıklarını .NET 10 örnekleriyle tartışıyoruz.

Sürüm notu: Bu yazı Google Search Central'ın Video, Software App ve Speakable dokümanlarının ve değişiklik günlüğünün Kasım 2026 hâlini esas alır; kodlar .NET 10 ile derlenip denenmiştir.

Önce Tahmin Et

mertozen.com'un araç sayfalarında bir WebApplication ve bir FAQPage bloğu var; blog yazılarında speakable, video listesi sayfasında da her video için bir VideoObject. Dört soru: Ücretsiz bir web aracı, puan ve yorum olmadan Google'da Software App rich result'ına uygun mu? 2026'da FAQ (Frequently Asked Questions; sık sorulan sorular) markup'ı Google'da ne gösteriyor? Türkçe bir blog yazısındaki speakable kimin için çalışıyor? Ve on videonun listelendiği bir sayfadaki on VideoObject, o videoların Google'da video olarak görünmesini sağlar mı?

Dört sorunun cevabı da "markup geçerli, ama beklenen şey olmuyor" çizgisinde. Bu yazı o çizginin nerede olduğunu Google'ın kendi dokümanlarıyla çiziyor ve 2023'ten bu yana kaldırılan rich result'ların hikâyesini anlatıyor.

VideoObject: Zorunlu Üçlü ve creator

Google'ın Video dokümanında VideoObject için üç property zorunlu: name, thumbnailUrl ve uploadDate. Önerilenler arasında contentUrl (video dosyasının kendisi, Google'ın en çok tercih ettiği), embedUrl (player'ın URL'i, contentUrl yoksa), description, duration (ISO (International Organization for Standardization; uluslararası standart kuruluşu) 8601 süre biçimi, örneğin PT19M3S), expires, interactionStatistic ve bölge kısıtları var. 24 Eylül 2026'da dokümana creator property'si eklendi; videoyu üreten ya da yayımlayan kişi veya kuruluş, name ve url ile. Aynı değişiklik author'ın da desteklendiğini not ediyor, yani mevcut author markup'ı geçersiz olmadı.

Bookstore'un CMS'i (Content Management System; içerik yönetim sistemi) bir video için süreyi TimeSpan, açıklamayı HTML olarak veriyor. İkisi de markup'a girmeden dönüşmeli:

using System.Net;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Text.Unicode;
using System.Xml;

// CMS'in bir video için döndürdüğü: süre TimeSpan, açıklama HTML
var cmsVideo = new
{
    YoutubeId = "abc123XYZ00",
    Title = "Bookstore: Caching the Catalog Page",
    DescriptionHtml = "<p>We cache the <strong>catalog</strong> page &amp; measure it.</p>",
    Duration = new TimeSpan(0, 19, 3),
    PublishedAt = new DateTimeOffset(2026, 10, 25, 21, 47, 0, TimeSpan.FromHours(3)),
};

var video = new VideoObjectNode(
    Id: "https://bookstore.example/videos/caching-the-catalog-page#video",
    Name: cmsVideo.Title,
    Description: ToPlainText(cmsVideo.DescriptionHtml),
    ThumbnailUrl: [$"https://img.youtube.com/vi/{cmsVideo.YoutubeId}/hqdefault.jpg"],
    UploadDate: cmsVideo.PublishedAt,
    Duration: XmlConvert.ToString(cmsVideo.Duration),
    EmbedUrl: $"https://www.youtube.com/embed/{cmsVideo.YoutubeId}",
    Creator: new PersonRef("https://bookstore.example/authors/ada-kaplan#person", "Ada Kaplan"));

var options = new JsonSerializerOptions
{
    WriteIndented = true,
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
    Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
};
Console.WriteLine(JsonSerializer.Serialize(video, options));

// Google description'daki HTML tag'lerini yok sayar; markup'ı değil metni gönder
static string ToPlainText(string html) =>
    WebUtility.HtmlDecode(Regex.Replace(html, "<[^>]+>", " ")).Trim().Replace("  ", " ");

record PersonRef(
    [property: JsonPropertyName("@id")] string Id,
    [property: JsonPropertyName("name")] string Name)
{
    [JsonPropertyName("@type"), JsonPropertyOrder(-1)] public string Type => "Person";
}

record VideoObjectNode(
    [property: JsonPropertyName("@id")] string Id,
    [property: JsonPropertyName("name")] string Name,
    [property: JsonPropertyName("description")] string Description,
    [property: JsonPropertyName("thumbnailUrl")] IReadOnlyList<string> ThumbnailUrl,
    [property: JsonPropertyName("uploadDate")] DateTimeOffset UploadDate,
    [property: JsonPropertyName("duration")] string Duration,
    [property: JsonPropertyName("embedUrl")] string EmbedUrl,
    [property: JsonPropertyName("creator")] PersonRef Creator)
{
    [JsonPropertyName("@context"), JsonPropertyOrder(-2)] public string Context => "https://schema.org";
    [JsonPropertyName("@type"), JsonPropertyOrder(-1)] public string Type => "VideoObject";
}
{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "@id": "https://bookstore.example/videos/caching-the-catalog-page#video",
  "name": "Bookstore: Caching the Catalog Page",
  "description": "We cache the catalog page \u0026 measure it.",
  "thumbnailUrl": [
    "https://img.youtube.com/vi/abc123XYZ00/hqdefault.jpg"
  ],
  "uploadDate": "2026-10-25T21:47:00+03:00",
  "duration": "PT19M3S",
  "embedUrl": "https://www.youtube.com/embed/abc123XYZ00",
  "creator": {
    "@type": "Person",
    "@id": "https://bookstore.example/authors/ada-kaplan#person",
    "name": "Ada Kaplan"
  }
}

XmlConvert.ToString(TimeSpan) ISO 8601 süresini elle string birleştirmeden üretiyor. Açıklama düz metne çevrildi: Google'ın dokümanı description içindeki HTML tag'lerinin yok sayıldığını söylüyor, yani tag'ler hiçbir şey kazandırmıyor, yalnızca markup'ı kirletiyor. uploadDate offset'iyle çıktı; Google saat dilimi verilmezse Googlebot'unkini varsayıyor.

Asıl karar markup'ta değil, sayfada. Google'ın video dokümanı video özelliklerine aday olmak için bir watch page istiyor: ana amacı tek bir videoyu göstermek olan sayfa. Gömülü bir videoyu inceleyen bir blog yazısı, 360 derecelik videolu bir ürün sayfası ya da eşit ağırlıkta birçok videoyu listeleyen bir kategori sayfası watch page sayılmıyor. Böyle sayfalardaki video yine bir metin sonucu ya da video rozetli bir görsel sonucu olarak görünebilir, ama video özelliklerine aday olmaz. Ayrıca watch page'in index'lenmiş olması, videonun sayfaya gömülü olması, başka element'lerin arkasında gizlenmemesi ve sabit bir URL'de geçerli bir küçük görselinin olması gerekiyor. YouTube gibi bir platformdan gömülen videolar da kabul ediliyor; Google aynı videoyu hem senin sayfanda hem de platformun sayfasında index'leyebiliyor.

mertozen.com'da /videolar listesi, sayfadaki her video için bir VideoObject üretiyor; videoların açıklamaları da CMS'ten HTML olarak geliyor (JSON-LD'de \u003Cp\u003E ile başlıyor). Liste sayfası Google'ın tanımına göre bir watch page değil; video özellikleri için asıl sayfa, controller'da BuildVideo ile tek bir VideoObject üreten video detay sayfası. Liste sayfasındaki markup zarar vermiyor ama video özelliği de getirmiyor.

SoftwareApplication: Ücretsiz Bir Araç Neden Aday Değil?

Google'ın Software App dokümanı üç şeyi zorunlu tutuyor: name, offers.price (ücretsizse 0) ve bir puan ya da yorum, yani aggregateRating veya review. Önerilenler applicationCategory (Google'ın listesindeki değerlerden biri, örneğin DeveloperApplication) ve operatingSystem. WebApplication ve MobileApplication tipleri destekleniyor.

mertozen.com'un JSON Formatter sayfasındaki düğüm şu:

{
  "@type": "WebApplication",
  "name": "JSON Formatter",
  "description": "Pretty-print, minify or validate JSON and find the broken line. Runs entirely in your browser; nothing is sent to a server.",
  "url": "https://www.mertozen.com/en/araclar/json-formatter",
  "inLanguage": "en",
  "applicationCategory": "DeveloperApplication",
  "operatingSystem": "Any (web browser)",
  "isAccessibleForFree": true,
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "TRY"
  },
  "author": {
    "@type": "Person",
    "name": "Mert Özen",
    "url": "https://www.mertozen.com/hakkimda"
  }
}

name ve offers.price var, applicationCategory Google'ın listesinde geçerli bir değer. Eksik olan puan ya da yorum ve bu yüzden sayfa Software App rich result'ına aday değil. Markup schema.org açısından geçerli ve aracı doğru anlatıyor; yalnızca Google'da bir görünüm üretmiyor. İngilizce sayfadaki priceCurrency değerinin TRY olması da küçük bir tutarsızlık; fiyat sıfır olduğu sürece pratik bir etkisi yok.

Bu boşluğu kapatmanın tek dürüst yolu gerçek kullanıcı yorumları toplamak ve onları sayfada göstermek. Puan ve yorum markup'ı Google'ın review snippet yönergelerine tabi; bu yönergeler Ocak 2025'te yalnızca yorum metni ve yazar adı taşıyan değerlendirmeleri kabul etmeyi önerdi, Temmuz 2026'da da sahte ve teşvik edildiği açıklanmayan yorumlar hakkında bir madde ekledi. Sayfada olmayan bir puanı markup'a yazmak, ilk yazıda konuştuğumuz manual action'a giden en kısa yol.

Speakable: Beta, Dar ve İngilizce

speakable, bir sayfanın sesli asistan tarafından okunmaya en uygun bölümlerini cssSelector ya da xPath ile işaretler. Google'ın dokümanı özelliği hâlâ beta olarak sunuyor ve kapsamı dar tutuyor: ABD'de İngilizce ayarlı Google Home cihazlarındaki kullanıcılar ve İngilizce içerik üreten yayıncılar. Doküman özelliği haber sonuçlarına ve güncel haber sorularına verilen cevaplara bağlıyor; işaretlenen her bölümün yaklaşık 20–30 saniyelik, iki üç cümlelik bir okuma olmasını, tarih satırı ve görsel altyazısı gibi parçaların işaretlenmemesini istiyor.

mertozen.com her blog yazısında h1 ve .post-summary seçicileriyle speakable yayınlıyor; sitenin CLAUDE.md dosyası bunu bir GEO (Generative Engine Optimization; içeriğin AI cevaplarında kaynak olarak görünmesi için yapılan çalışma) kuralı olarak tanımlıyor. Google'ın dokümanına göre bu markup Türkçe yazılarda hiçbir Google özelliğini tetiklemez; İngilizce yazılarda da ancak haber yayıncısı kapsamına giren içerikte anlamlı olabilir. Bir AI ürününün speakable'ı alıntı için kullandığına dair birincil kaynakta doğrulanmış bir bilgi yok; Google bunu doğrulamıyor. Markup zararsız ve ucuz, ama "neden var?" sorusunun cevabı bugün "Google'da bir etkisi olduğu için" değil. Kalıp kalmayacağı site sahibinin kararı.

Kaldırılanların Hikâyesi: 2023–2026

04-rich-result-timeline-tr.png

Son üç yılda Google'ın rich result kataloğu küçüldü. Tarihler Search Central değişiklik günlüğünden ve blog'undan:

  • HowTo: 8 Ağustos 2023'te önce yalnızca masaüstüne indirildi; 13 Eylül 2023'te masaüstünden de kaldırıldı ve dokümanı silindi.
  • FAQ: 8 Ağustos 2023'te yalnızca tanınmış, otoriter devlet ve sağlık sitelerine kısıtlandı. 8 Mayıs 2026'da dokümana deprecation notu eklendi ve özelliğin 7 Mayıs 2026'dan itibaren Google'da gösterilmediği yazıldı; 15 Haziran 2026'da doküman tamamen kaldırıldı.
  • Sitelinks search box: 21 Kasım 2024'ten itibaren gösterilmiyor; dokümanı 29 Kasım 2024'te kaldırıldı. Site adı için kullanılan WebSite markup'ı ise desteklenmeye devam ediyor.
  • 2025 dalgası: 12 Haziran 2025'te Book actions, Course info, ClaimReview, Estimated salary, Learning video, Special announcement ve Vehicle listing için aşamalı kaldırma duyuruldu. 9 Eylül 2025'te Course info, Estimated salary, Learning video, Special announcement ve Vehicle listing dokümanları silindi; aynı tarihte bu tiplerin ve ClaimReview'ın Search Console raporlarından ve Rich Results Test'ten çıkarılacağı duyurulmuştu. Book actions ise 5 Kasım 2025'te listeden çıktı, çünkü bir Search özelliği o markup'ı hâlâ kullanıyor.
  • 5 Kasım 2025: Practice problem deprecated oldu ve Dataset markup'ının Google Search'te değil yalnızca Dataset Search'te kullanıldığı netleşti. Practice problem dokümanı 6 Ocak 2026'da silindi.

Google'ın gerekçesi her seferinde aynı: bu özellikler az kullanılıyor ve sonuç sayfasına artık yeterli değer katmıyor. Hiçbirinde bunun bir sıralama değişikliği olduğu söylenmedi; 2025 duyurusu bu tiplerin Google Search dışındaki kullanımının etkilenmediğini de ayrıca not etti.

Kaldırılan Markup'ı Silmek Zorunda mısın?

Hayır. 2023'teki HowTo ve FAQ duyurusu, kullanılmayan structured data'nın Search için sorun çıkarmadığını ve onu proaktif olarak kaldırmaya gerek olmadığını söylüyordu. Sitelinks search box için de Google benzer bir şey söyledi: markup kalabilir, Search Console raporlarında hata üretmez. 2025 dalgasında ise bu tiplerin Google Search dışındaki kullanımının etkilenmediği vurgulandı.

Ama "zorunlu değil" ile "kalsın" aynı şey değil. Her kaldırılmış tip için üç soru sor. Bu markup Google dışında bir tüketiciye hizmet ediyor mu? ClaimReview, Google'ın Fact Check Explorer'ı gibi başka araçlarda anlam taşıyabilir; bir FAQPage ise başka bir sistemin kullandığı belgelenmedikçe yalnızca bakım maliyeti. Markup'ı üreten kod test ediliyor mu? Testsiz, kimsenin bakmadığı bir JSON bloğu, bir gün görünen içerikle ayrışıp ilk yazıdaki "görünmeyen içerik" tuzağına düşebilir. Ve sayfadaki görünen içerik kalmalı mı? mertozen.com'un araç sayfalarındaki "Sık sorulanlar" bölümü okur için faydalı olabilir; FAQ rich result'ının gitmesi bu bölümü değil, yalnızca onun FAQPage markup'ını anlamsızlaştırıyor. Ana sayfadaki SearchAction da aynı durumda: zararsız, ama Kasım 2024'ten beri bir işe yaramıyor.

Haritada Kısaca: Diğer Tipler Ne Zaman İlgili?

Google'ın galerisinde bir teknik blog için doğrudan gerekmeyen ama bilmeye değer tipler var. Q&A ve Discussion forum, kullanıcıların soru sorup cevap yazdığı topluluk sayfaları için; bir blog yazısının altındaki yorumlar bu kapsama girmiyor. Course list, birden çok kursu listeleyen sayfalar için; ücretli bir eğitim serisi yayımlıyorsan ilgili olur. Event, tarihi ve yeri olan etkinlikler için; bir meetup veya webinar duyurusu. Product, fiyatı, stok durumu ve yorumları olan ürün sayfaları için; Bookstore'un kitap sayfaları bunun alanı ve o konu bu serinin kapsamı dışında. Ortak kural değişmiyor: tipi sayfanın gerçekte ne olduğuna göre seç, galerideki bir görünümü yakalamak için değil.

Üretimde Dikkat

Google'ın değişiklik günlüğünü takip edilecek bir kaynak olarak ekle. Bu yazıdaki tarihlerin hepsi tek bir sayfadan, developers.google.com/search/updates'ten geliyor; bir tipin deprecation notu genellikle kaldırılmadan haftalar önce orada görünüyor.

Kaldırılan bir tip için önce Search Console'a bak. Rich result raporu ve Rich Results Test desteği tipten önce düşebiliyor; 2025'teki altı tip için raporlama Eylül'de, API desteği Aralık 2025'te bitti. Raporlara dayanan bir dashboard bu tarihlerde sessizce boşalır.

Video markup'ını watch page'e koy. Bir yazıya gömülü videoyu VideoObject ile işaretlemek geçersiz değil, ama video özellikleri için asıl yatırım, tek videoya odaklanan sayfanın kendisi.

Sık Düşülen Tuzaklar

Kaldırılan bir tip için "Search Console artık hata vermiyor, demek ki düzeldi" demek. Tip rapordan çıktığı için hata yok; markup'ın bir işe yaradığı için değil.

Software App için aggregateRating uydurmak. Google'ın zorunlu tuttuğu alan, sayfada görünen gerçek yorumlar olmadan doldurulamaz.

speakable'ı bir GEO aracı sanmak. Google'ın dokümanı onu sesli asistan ve haber bağlamında tarif ediyor; bunun ötesindeki her iddia birincil kaynakla doğrulanmalı.

Video açıklamasına CMS'ten gelen HTML'i olduğu gibi koymak. Google tag'leri yok sayıyor; sonuçta elde kalan, okunması zor ve gereksiz büyük bir string.

Küçük Bir Deneme

★☆☆ Kendi sitende hangi sayfaların FAQPage, HowTo ya da potentialAction içeren bir WebSite taşıdığını listele. Hangisi Google dışında bir tüketiciye hizmet ediyor?

★★☆ VideoObject örneğine bir interactionStatistic ekle (WatchAction ile izlenme sayısı) ve TimeSpan.Zero süreli bir video için XmlConvert.ToString'in ne ürettiğine bak.

★★★ Bookstore'a, Google'ın değişiklik günlüğünde adı geçen tiplerin listesini tutan ve sayfanın JSON-LD'sinde bu tiplerden biri görünürse build'i uyaran bir test ekle.

Hangi markup'ın ne işe yaradığını artık biliyoruz. Serinin son yazısında hepsini otomatik olarak doğrulamaya geçiyoruz: Rich Results Test ile Schema Markup Validator'ın farkı, Search Console raporları ve xUnit ile Playwright'ta çalışan, CI'da structured data'yı kontrol eden testler.