WordPress functions.php ile Organization Schema Tanımlama: Site Kimliği
Google’ın arama sonuçlarında sitenizi nasıl tanıdığını hiç düşündünüz mü? Bir e-ticaret sitesi işletiyorsunuz, kurumsal bir web sayfanız var ya da yerel bir işletmeniz mevcut; Google’ın gözünde siz sadece bir URL’den ibaretsiniz. İşte tam bu noktada Organization Schema devreye giriyor. Schema markup, arama motorlarına sitenizin kim olduğunu, ne yaptığını ve nasıl iletişime geçileceğini makine dilinde anlatmanın en etkili yolu. Bu yazıda WordPress’te functions.php üzerinden Organization Schema’yı nasıl tanımlayacağınızı, neden önemli olduğunu ve gerçek dünya senaryolarında nasıl kullanacağınızı adım adım ele alacağız.
Organization Schema Nedir ve Neden Önemlidir?
Schema.org standartlarına göre Organization tipi, bir şirketi, kurumu veya organizasyonu arama motorlarına tanıtan yapılandırılmış veri biçimidir. JSON-LD formatında yazılan bu veriler, veya etiketleri içinde sayfanıza eklenir ve Google, Bing gibi arama motorları tarafından okunur.
Pratik faydaları şöyle sıralayabiliriz:
- Knowledge Panel: Google’ın arama sonuçlarında sağ tarafta çıkan bilgi paneli için temel veri kaynağıdır
- Rich Results: Marka adı, logo ve iletişim bilgileri arama sonuçlarında zengin snippet olarak görünebilir
- E-E-A-T Sinyalleri: Google’ın Deneyim, Uzmanlık, Otorite ve Güvenilirlik değerlendirmesinde doğrulanmış organizasyon verisi kritik önem taşır
- Yerel SEO: LocalBusiness schema ile birlikte kullanıldığında yerel aramalarda öne çıkmanızı sağlar
WordPress kullanıyorsanız bu schema’yı plugin olmadan, doğrudan functions.php üzerinden yönetmek hem daha esnek hem de daha performanslıdır.
Temel Organization Schema Yapısı
Başlamadan önce en basit Organization schema örneğine bakalım. Bu, sitenizin kimliğini tanımlamak için minimum gereksinimdir:
function add_organization_schema() {
if ( ! is_front_page() ) {
return;
}
$schema = [
'@context' => 'https://schema.org',
'@type' => 'Organization',
'@id' => home_url( '/#organization' ),
'name' => get_bloginfo( 'name' ),
'url' => home_url( '/' ),
'logo' => [
'@type' => 'ImageObject',
'url' => get_site_icon_url( 512 ),
],
];
echo '<script type="application/ld+json">' . wp_json_encode( $schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT ) . '</script>';
}
add_action( 'wp_head', 'add_organization_schema' );
Bu temel yapıyı functions.php dosyanıza ekledikten sonra anasayfanızın kaynak kodunda JSON-LD bloğunu göreceksiniz. Ancak bu sadece başlangıç; gerçek dünyada çok daha fazla bilgi eklemeniz gerekecek.
Kapsamlı Organization Schema Tanımı
Müşterilerimin sitelerinde kullandığım, SEO ajanslarının da benimsediği kapsamlı bir yapıya geçelim. Bu örnekte iletişim bilgileri, sosyal medya profilleri, kuruluş yılı ve daha fazlası yer alıyor:
function add_full_organization_schema() {
if ( ! is_front_page() ) {
return;
}
$site_url = home_url( '/' );
$site_name = get_bloginfo( 'name' );
$description = get_bloginfo( 'description' );
$logo_url = get_site_icon_url( 512 );
$schema = [
'@context' => 'https://schema.org',
'@type' => 'Organization',
'@id' => $site_url . '#organization',
'name' => $site_name,
'alternateName' => 'Kisa Marka Adi',
'url' => $site_url,
'description' => $description,
'foundingDate' => '2015',
'numberOfEmployees' => [
'@type' => 'QuantitativeValue',
'value' => 25,
],
'logo' => [
'@type' => 'ImageObject',
'@id' => $site_url . '#logo',
'url' => $logo_url,
'width' => 512,
'height' => 512,
],
'image' => $logo_url,
'email' => '[email protected]',
'telephone' => '+90-212-000-0000',
'address' => [
'@type' => 'PostalAddress',
'streetAddress' => 'Ornek Mahallesi, Ornek Sokak No:1',
'addressLocality' => 'Istanbul',
'addressRegion' => 'TR-34',
'postalCode' => '34000',
'addressCountry' => 'TR',
],
'contactPoint' => [
[
'@type' => 'ContactPoint',
'telephone' => '+90-212-000-0000',
'contactType' => 'customer service',
'availableLanguage' => 'Turkish',
'areaServed' => 'TR',
],
],
'sameAs' => [
'https://www.facebook.com/siteniz',
'https://twitter.com/siteniz',
'https://www.instagram.com/siteniz',
'https://www.linkedin.com/company/siteniz',
'https://www.youtube.com/@siteniz',
],
];
echo '<script type="application/ld+json">'
. wp_json_encode( $schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )
. '</script>';
}
add_action( 'wp_head', 'add_full_organization_schema' );
Buradaki sameAs dizisi özellikle kritik. Google, bu URL’leri kullanarak Knowledge Panel oluştururken organizasyonunuzu doğrular. Facebook, LinkedIn ve Wikipedia sayfalarınız varsa mutlaka ekleyin.
WooCommerce Sitelerinde Organization Schema
WooCommerce kullanan bir e-ticaret sitesiyseniz Organization schema’ya ek olarak OnlineStore tipini de belirtmeniz, Google Shopping ve ürün aramalarında avantaj sağlar:
function add_woocommerce_organization_schema() {
if ( ! is_front_page() && ! is_woocommerce() ) {
return;
}
$site_url = home_url( '/' );
$schema = [
'@context' => 'https://schema.org',
'@graph' => [
[
'@type' => [ 'Organization', 'OnlineStore' ],
'@id' => $site_url . '#organization',
'name' => get_bloginfo( 'name' ),
'url' => $site_url,
'logo' => [
'@type' => 'ImageObject',
'url' => get_site_icon_url( 512 ),
],
'hasOfferCatalog' => [
'@type' => 'OfferCatalog',
'name' => 'Urun Katalogu',
'url' => wc_get_page_permalink( 'shop' ),
],
'potentialAction' => [
'@type' => 'SearchAction',
'target' => [
'@type' => 'EntryPoint',
'urlTemplate' => $site_url . '?s={search_term_string}&post_type=product',
],
'query-input' => 'required name=search_term_string',
],
'paymentAccepted' => 'Credit Card, Debit Card, Bank Transfer',
'currenciesAccepted' => 'TRY',
'priceRange' => '$$',
'areaServed' => 'TR',
'sameAs' => [
'https://www.instagram.com/magazaniz',
'https://www.facebook.com/magazaniz',
],
],
],
];
echo '<script type="application/ld+json">'
. wp_json_encode( $schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )
. '</script>';
}
add_action( 'wp_head', 'add_woocommerce_organization_schema' );
Burada @graph kullanımına dikkat edin. Birden fazla schema tipini tek bir JSON-LD bloğunda birleştirmek hem sayfa yükünü hafifletir hem de Google’ın verileri ilişkilendirmesini kolaylaştırır.
Dinamik Veri ile Schema Yönetimi
Hardcoded (sabit kodlanmış) değerler uzun vadede bakım sorunu yaratır. Profesyonel bir yaklaşım için verileri WordPress seçeneklerinden veya özel alanlarden çekmek çok daha sürdürülebilir:
function get_organization_data() {
return [
'name' => get_option( 'org_schema_name', get_bloginfo( 'name' ) ),
'telephone' => get_option( 'org_schema_phone', '' ),
'email' => get_option( 'org_schema_email', get_option( 'admin_email' ) ),
'founding' => get_option( 'org_schema_founding_year', '' ),
'street' => get_option( 'org_schema_street', '' ),
'city' => get_option( 'org_schema_city', '' ),
'postal_code' => get_option( 'org_schema_postal', '' ),
'social' => [
get_option( 'org_schema_facebook', '' ),
get_option( 'org_schema_twitter', '' ),
get_option( 'org_schema_instagram', '' ),
get_option( 'org_schema_linkedin', '' ),
],
];
}
function add_dynamic_organization_schema() {
if ( ! is_front_page() ) {
return;
}
$data = get_organization_data();
$site_url = home_url( '/' );
// Bos degerleri temizle
$social_profiles = array_filter( $data['social'] );
$schema = [
'@context' => 'https://schema.org',
'@type' => 'Organization',
'@id' => $site_url . '#organization',
'name' => sanitize_text_field( $data['name'] ),
'url' => $site_url,
];
if ( ! empty( $data['telephone'] ) ) {
$schema['telephone'] = sanitize_text_field( $data['telephone'] );
}
if ( ! empty( $data['email'] ) ) {
$schema['email'] = sanitize_email( $data['email'] );
}
if ( ! empty( $data['founding'] ) ) {
$schema['foundingDate'] = absint( $data['founding'] );
}
if ( ! empty( $data['street'] ) && ! empty( $data['city'] ) ) {
$schema['address'] = [
'@type' => 'PostalAddress',
'streetAddress' => sanitize_text_field( $data['street'] ),
'addressLocality' => sanitize_text_field( $data['city'] ),
'postalCode' => sanitize_text_field( $data['postal_code'] ),
'addressCountry' => 'TR',
];
}
if ( ! empty( $social_profiles ) ) {
$schema['sameAs'] = array_values( $social_profiles );
}
$logo_url = get_site_icon_url( 512 );
if ( ! empty( $logo_url ) ) {
$schema['logo'] = [
'@type' => 'ImageObject',
'url' => esc_url( $logo_url ),
];
}
echo '<script type="application/ld+json">'
. wp_json_encode( $schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )
. '</script>';
}
add_action( 'wp_head', 'add_dynamic_organization_schema' );
Bu yaklaşımla birlikte bir admin sayfası oluşturup tüm bu değerleri WordPress panelinden yönetebilirsiniz.
Yoast veya RankMath ile Çakışmayı Önleme
Gerçek dünyada en sık karşılaştığım sorunlardan biri, SEO eklentilerinin zaten kendi schema çıktısını üretmesi. Hem eklentinin hem de functions.php kodunuzun çalışması duplicate schema sorununa yol açar. Bunu önlemek için:
function add_organization_schema_safe() {
// Yoast aktifse ve kendi schema'sini uretiyorsa cik
if ( function_exists( 'YoastSEO' ) ) {
$context = YoastSEO()->classes->get( YoastWPSEOContextMeta_Tags_Context::class );
if ( $context && method_exists( $context, 'generate_schema' ) ) {
return;
}
}
// RankMath aktifse cik
if ( class_exists( 'RankMath' ) && RankMathHelper::get_settings( 'general.knowledgegraph_type' ) ) {
return;
}
if ( ! is_front_page() ) {
return;
}
$schema = [
'@context' => 'https://schema.org',
'@type' => 'Organization',
'@id' => home_url( '/#organization' ),
'name' => get_bloginfo( 'name' ),
'url' => home_url( '/' ),
'logo' => [
'@type' => 'ImageObject',
'url' => get_site_icon_url( 512 ),
],
'sameAs' => [
'https://www.facebook.com/siteniz',
'https://twitter.com/siteniz',
],
];
echo '<script type="application/ld+json">'
. wp_json_encode( $schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )
. '</script>';
}
add_action( 'wp_head', 'add_organization_schema_safe', 99 );
add_action önceliğini 99 olarak ayarlamak, eklentilerin çıktısından sonra çalışmasını sağlar ve kontrol mekanizmanız daha güvenilir çalışır.
Çoklu Sayfa Tiplerine Göre Schema
Sadece anasayfada değil, belirli sayfa tiplerine göre farklı schema çıktısı üretmek isteyebilirsiniz. Mesela iletişim sayfasında ContactPage schema eklemek ve bunu Organization ile ilişkilendirmek çok yaygın bir ihtiyaç:
function add_contextual_organization_schema() {
$site_url = home_url( '/' );
$org_id = $site_url . '#organization';
$schema = null;
if ( is_front_page() ) {
$schema = [
'@context' => 'https://schema.org',
'@type' => 'Organization',
'@id' => $org_id,
'name' => get_bloginfo( 'name' ),
'url' => $site_url,
'logo' => [
'@type' => 'ImageObject',
'url' => get_site_icon_url( 512 ),
],
'sameAs' => [
'https://www.facebook.com/siteniz',
'https://www.linkedin.com/company/siteniz',
],
];
} elseif ( is_page( 'iletisim' ) || is_page( 'contact' ) ) {
$schema = [
'@context' => 'https://schema.org',
'@type' => 'ContactPage',
'@id' => get_permalink() . '#contactpage',
'url' => get_permalink(),
'name' => get_the_title(),
'description' => 'Bizimle iletisime gecin',
'mainEntity' => [
'@id' => $org_id,
],
];
} elseif ( is_page( 'hakkimizda' ) || is_page( 'about' ) ) {
$schema = [
'@context' => 'https://schema.org',
'@type' => 'AboutPage',
'@id' => get_permalink() . '#aboutpage',
'url' => get_permalink(),
'name' => get_the_title(),
'mainEntity' => [
'@id' => $org_id,
],
];
}
if ( $schema ) {
echo '<script type="application/ld+json">'
. wp_json_encode( $schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )
. '</script>';
}
}
add_action( 'wp_head', 'add_contextual_organization_schema' );
Burada dikkat çeken nokta @id referansı kullanımı. ContactPage ve AboutPage şemaları, mainEntity alanıyla ana Organization kaydına referans veriyor. Bu, Google’ın bağlamı anlamasına yardımcı olan bağlantılı veri (linked data) pratiğidir.
Schema Doğrulama ve Test Etme
Kodu yazdıktan sonra en kritik adım doğrulama. Birkaç pratik yöntem:
- Google Rich Results Test:
search.google.com/test/rich-resultsadresine sitenizin URL’sini girin ya da kodu direkt yapıştırın - Schema.org Validator:
validator.schema.orgadresinde daha teknik doğrulama yapabilirsiniz - Google Search Console: Enhancement raporlarında schema hatalarını izleyin
Doğrulama sırasında sık karşılaşılan hatalar:
- logo alanında ImageObject eksikliği: Sadece URL yazmak yerine
@type: ImageObjectobjesini eklemeyi unutmayın - telephone format hatası: Google E.164 formatını tercih eder:
+90-212-000-0000 - sameAs URL’lerinin canonical olmayan halleri: Facebook için
facebook.comdeğilwww.facebook.comkullanın - @id değerlerinin tutarsızlığı: Aynı organizasyona farklı sayfalarda farklı @id vermeyin, hep aynı canonical URL’yi kullanın
Gerçek Dünya Senaryosu: Yerel Restoran Zinciri
Birkaç şubesi olan bir restoran zinciri için hazırladığım schema yapısını paylaşayım. Bu senaryo, Organization ile LocalBusiness ve Restaurant tiplerini nasıl birleştireceğinizi gösteriyor:
function add_restaurant_chain_schema() {
if ( ! is_front_page() ) {
return;
}
$site_url = home_url( '/' );
$schema = [
'@context' => 'https://schema.org',
'@type' => [ 'Organization', 'FoodEstablishment' ],
'@id' => $site_url . '#organization',
'name' => 'Lezzet Noktasi Restoran Zinciri',
'url' => $site_url,
'logo' => [
'@type' => 'ImageObject',
'url' => $site_url . 'wp-content/uploads/logo.png',
'width' => 300,
'height' => 100,
],
'description' => 'Turkiye genelinde 12 subesiyle hizmet veren restoran zinciri',
'foundingDate' => '2010',
'servesCuisine' => [ 'Turkish', 'Mediterranean' ],
'priceRange' => '$$',
'telephone' => '+90-850-000-0000',
'email' => '[email protected]',
'address' => [
'@type' => 'PostalAddress',
'streetAddress' => 'Merkez Ofis Adresi',
'addressLocality' => 'Istanbul',
'addressCountry' => 'TR',
],
'openingHoursSpecification' => [
[
'@type' => 'OpeningHoursSpecification',
'dayOfWeek' => [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' ],
'opens' => '11:00',
'closes' => '23:00',
],
[
'@type' => 'OpeningHoursSpecification',
'dayOfWeek' => [ 'Saturday', 'Sunday' ],
'opens' => '10:00',
'closes' => '00:00',
],
],
'hasMenu' => $site_url . 'menu/',
'sameAs' => [
'https://www.instagram.com/lezzetnoktasi',
'https://www.facebook.com/lezzetnoktasi',
'https://maps.google.com/?cid=XXXXX',
],
];
echo '<script type="application/ld+json">'
. wp_json_encode( $schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )
. '</script>';
}
add_action( 'wp_head', 'add_restaurant_chain_schema' );
Bu yapıda openingHoursSpecification özellikle yerel aramalarda “Şu an açık mı?” sorusunu Google’ın doğrudan yanıtlamasına imkan tanır. Restoran, klinik, mağaza gibi fiziksel lokasyonu olan işletmeler için bu alan hayati önemdedir.
Performans ve Güvenlik Notları
functions.php üzerinden schema çıktısı üretirken göz önünde bulundurmanız gereken birkaç kural:
- Veri sanitizasyonu: Dışarıdan veya veritabanından gelen tüm verileri
sanitize_text_field(),esc_url()vesanitize_email()ile temizleyin - Önbellekleme:
get_option()çağrıları zaten WordPress object cache tarafından yönetiliyor, ancak çok karmaşık sorgular yapıyorsanız transient kullanmayı düşünün - Koşullu yükleme: Her sayfada her schema’ya ihtiyaç yoktur,
is_front_page(),is_page()gibi koşullarla sadece gerekli yerlerde çalıştırın - JSON encoding flags:
JSON_UNESCAPED_UNICODETürkçe karakterlerin bozulmaması için zorunludur,JSON_UNESCAPED_SLASHESise URL’lerin okunabilir kalmasını sağlar - Nonce veya capability kontrolü: Schema çıktısı public bir işlem olduğundan capability kontrolüne gerek yoktur, ancak admin panelinden ayar kaydediyorsanız mutlaka
current_user_can()ve nonce doğrulaması ekleyin
Sonuç
Organization Schema, WordPress sitenizin arama motorlarındaki kimliğinin temel taşı. Doğru yapılandırıldığında Google Knowledge Panel’de markanızın adı, logosu ve iletişim bilgileri otomatik olarak görünür hale gelir; yerel aramalarda öne çıkarsınız ve E-E-A-T sinyalleriniz güçlenir.
functions.php üzerinden yönetmek, plugin bağımlılığını ortadan kaldırır, sitenizin kodunu şeffaf tutar ve schema üzerinde tam kontrol sağlar. Dinamik veri yaklaşımını benimseyerek hardcoded değerlerden kaçının, SEO eklentileriyle çakışmayı önleyin ve her zaman Google Rich Results Test ile doğrulama yapın.
Son olarak şunu hatırlatayım: Schema eklemek bir gecede sıralama mucizesi yaratmaz. Ancak aylık ve yıllık bakış açısıyla değerlendirildiğinde, doğru yapılandırılmış Organization Schema’nın marka görünürlüğüne ve arama motorlarındaki otoriteye ciddi katkı sağladığını verilerle görebilirsiniz. Bugün başlayın, küçük tutun, doğrulayın ve zamanla genişletin.
