Soft Ajans ®

Google Indexing API Kurulumu: Python ve WordPress

Son Güncelleme: Yazar: admin Blog, SEO
Google Indexing API Kurulumu: Python ve WordPress

Google’ın yeni veya güncellenmiş sayfaları keşfetmesi genellikle site haritaları, dahili bağlantılar ve normal tarama süreçleri üzerinden gerçekleşir. Ancak iş ilanları ve canlı yayın sayfaları gibi kısa süre içerisinde güncellenen veya yayından kaldırılan içeriklerde daha hızlı bildirim yapılmasına ihtiyaç duyulabilir.

Google Indexing API, desteklenen sayfalardaki ekleme, güncelleme ve kaldırma işlemlerini doğrudan Google’a bildirmek için kullanılan bir programlama arayüzüdür.

API üzerinden gönderilen istek, Google’a ilgili URL’de bir değişiklik olduğunu bildirir. Ancak bu işlem URL’nin kesin olarak dizine ekleneceği, arama sonuçlarında gösterileceği veya belirli bir sıralama elde edeceği anlamına gelmez.

Google Indexing API kurulumu genel olarak şu aşamalardan oluşur:

  • Google Cloud projesi oluşturmak
  • Indexing API hizmetini etkinleştirmek
  • Servis hesabı oluşturmak
  • JSON anahtar dosyası indirmek
  • Servis hesabını Search Console mülküne sahip olarak eklemek
  • OAuth 2.0 erişim belirteci oluşturmak
  • Python veya WordPress üzerinden API isteği göndermek
  • Kota ve hata kayıtlarını takip etmek

Bu rehberde Google Indexing API kurulumu, Python ile kullanım, WordPress entegrasyonu, URL güncelleme ve kaldırma işlemleri ayrıntılı olarak anlatılmıştır.

Google Indexing API Nedir?

Google Indexing API, desteklenen web sayfalarının eklendiğini, güncellendiğini veya kaldırıldığını Google’a bildirmeyi sağlayan bir REST API hizmetidir.

Indexing API ile şu işlemler yapılabilir:

  • Yeni bir URL’nin yayınlandığını bildirmek
  • Mevcut sayfanın güncellendiğini bildirmek
  • Kaldırılan sayfanın dizinden çıkarılmasını istemek
  • Daha önce gönderilen bildirimin durumunu sorgulamak
  • Birden fazla bildirimi toplu istek içerisinde göndermek

API, sayfanın içeriğini doğrudan Google dizinine eklemez. Yalnızca Google’a ilgili URL’nin yeniden taranması veya kaldırılmasının değerlendirilmesi için bildirim gönderir.

Google’ın sayfaları tarama ve dizine ekleme sürecini daha iyi anlamak için index nedir içeriği incelenebilir.

Önemli: Indexing API Her Sayfada Kullanılamaz

Google Indexing API’nin en fazla yanlış anlaşılan özelliği kullanım kapsamıdır.

Google’ın güncel yönergelerine göre Indexing API yalnızca şu sayfa türlerinde kullanılmalıdır:

  • JobPosting yapılandırılmış verisine sahip iş ilanı sayfaları
  • VideoObject içerisinde BroadcastEvent bulunan canlı yayın sayfaları

API’nin desteklemediği genel sayfa türleri şunlardır:

  • Blog içerikleri
  • Haber sayfaları
  • Ürün sayfaları
  • Ürün kategorileri
  • Kurumsal hizmet sayfaları
  • Konum sayfaları
  • Etiket ve arşiv sayfaları
  • Normal etkinlik sayfaları
  • Emlak ilanları
  • Otomobil ilanları
  • Profil sayfaları
  • Forum konuları

Teknik olarak API uç noktasına farklı URL’ler gönderilebilmesi, bu kullanımın Google yönergelerine uygun olduğu anlamına gelmez.

Desteklenmeyen URL’leri göndererek API kotalarını aşmaya çalışmak, birden fazla servis hesabıyla sınırları geçmek veya otomatik şekilde bütün siteyi göndermek erişimin kısıtlanmasına neden olabilir.

Blog ve Ürün Sayfaları Google’a Nasıl Bildirilmelidir?

Normal web sayfaları için aşağıdaki yöntemler kullanılmalıdır:

  • XML site haritası oluşturmak
  • Site haritasını Google Search Console’a göndermek
  • Önemli URL’lerde URL Denetleme aracını kullanmak
  • Sayfalara taranabilir dahili bağlantılar vermek
  • Canonical etiketlerini doğru kullanmak
  • Robots.txt ve noindex ayarlarını kontrol etmek
  • Güncellenen sayfaların lastmod bilgilerini düzenlemek
  • Sunucunun Googlebot’a erişilebilir olmasını sağlamak

Site haritası oluşturma ve gönderme süreci için sitemap nedir rehberinden yararlanılabilir.

Dizine eklenme sorunlarını ve sayfa durumlarını kontrol etmek için Google Search Console kullanılmalıdır.

Google Indexing API Ne İşe Yarar?

Indexing API özellikle kısa ömürlü sayfalardaki değişikliklerin Google’a bildirilmesine yardımcı olur.

Yeni iş ilanını bildirmek

Yeni bir iş ilanı yayınlandığında URL, URL_UPDATED bildirimiyle gönderilebilir.

İş ilanındaki değişikliği bildirmek

İlan açıklaması, çalışma konumu, ücret, son başvuru tarihi veya ilan durumu değiştiğinde yeniden URL_UPDATED bildirimi gönderilebilir.

Süresi dolan ilanı kaldırmak

İş ilanı sona erdiğinde sayfa 404, 410 veya noindex durumuna getirildikten sonra URL_DELETED bildirimi gönderilebilir.

Canlı yayın başlangıcını bildirmek

Geçerli BroadcastEvent işaretlemesine sahip canlı yayın başladığında Google’a güncelleme bildirimi yapılabilir.

Canlı yayın değişikliklerini bildirmek

Yayın başlangıç ve bitiş bilgileri değiştiğinde güncelleme bildirimi gönderilebilir.

Bildirim durumunu sorgulamak

Bir URL için Google’ın aldığı en son güncelleme ve kaldırma bildirimleri sorgulanabilir.

Indexing API Neleri Yapmaz?

Indexing API’nin sınırları doğru anlaşılmalıdır.

API aşağıdaki işlemleri garanti etmez:

  • URL’nin kesin olarak dizine eklenmesi
  • URL’nin aynı gün taranması
  • Arama sonuçlarında görünme
  • Anahtar kelimelerde sıralama kazanma
  • Canonical URL’nin kabul edilmesi
  • Yapılandırılmış verinin geçerli sayılması
  • Zayıf içeriğin kaliteli kabul edilmesi
  • Teknik SEO sorunlarının çözülmesi
  • Robots.txt engelinin aşılması
  • Noindex etiketinin yok sayılması
  • Manuel işlem veya spam sorunlarının giderilmesi

API isteğinin başarılı olması yalnızca Google’ın bildirimi aldığını gösterir.

Bir sayfanın dizine eklenebilmesi için:

  • Googlebot tarafından erişilebilir olması
  • Başarılı HTTP durum kodu döndürmesi
  • Noindex etiketi taşımaması
  • Uygun canonical kullanması
  • Yeterli ve özgün içerik sunması
  • Spam politikalarına uygun olması
  • Desteklenen yapılandırılmış veriyi içermesi

gerekir.

Bu kontroller genel bir teknik SEO çalışmasının parçasıdır.

Indexing API Bildirim Türleri

API iki temel bildirim türünü destekler.

Bildirim Kullanım amacı
URL_UPDATED Yeni yayınlanan veya içeriği değiştirilen sayfayı bildirmek
URL_DELETED Kaldırılan veya noindex yapılan sayfayı bildirmek

URL_UPDATED

Yeni veya güncellenmiş sayfalar için kullanılır.

Örnek istek gövdesi:

{
  "url": "https://www.example.com/is-ilanlari/yazilim-uzmani",
  "type": "URL_UPDATED"
}

Aynı bildirim hem yeni sayfalar hem de mevcut sayfalardaki önemli değişiklikler için kullanılır.

URL_DELETED

Google’dan kaldırılması istenen sayfalarda kullanılır.

Örnek istek gövdesi:

{
  "url": "https://www.example.com/is-ilanlari/yazilim-uzmani",
  "type": "URL_DELETED"
}

Kaldırma bildirimi gönderilmeden önce URL’nin:

  • 404 durum kodu döndürmesi,
  • 410 durum kodu döndürmesi veya
  • Noindex etiketi taşıması

gerekir.

Sayfa başka bir adrese taşındıysa silme bildirimi yerine uygun bir yönlendirme uygulanmalıdır. Kalıcı adres değişikliklerinde 301 yönlendirme kullanılabilir.

Google Indexing API ile Sitemap Arasındaki Fark

Kriter Indexing API XML sitemap
Kullanım kapsamı İş ilanı ve canlı yayın sayfaları Dizine açık bütün önemli URL’ler
Bildirim yöntemi API isteği XML dosyası
Güncelleme URL bazında bildirilir Site haritası güncellenir
Kimlik doğrulama OAuth 2.0 gerekir Search Console üzerinden gönderilebilir
Kota API kotası bulunur Doğrudan aynı kota yapısı bulunmaz
Dizine ekleme garantisi Yok Yok
Kaldırma bildirimi URL_DELETED kullanılabilir URL site haritasından çıkarılabilir
Uygun kullanım Kısa ömürlü desteklenen içerikler Site genelindeki URL keşfi

Indexing API kullanılsa bile XML site haritasının korunması önerilir. Site haritası, arama motorlarının sitenin genel URL yapısını keşfetmesine yardımcı olur.

Indexing API ile Search Console URL Denetleme Arasındaki Fark

Kriter Indexing API URL Denetleme
Kullanım biçimi Programlı ve otomatik Search Console panelinden manuel
Desteklenen URL İş ilanı ve canlı yayın Yönetilen mülkteki farklı URL’ler
Toplu kullanım En fazla 100 istek birleştirilebilir Tek tek URL kontrol edilir
Durum sorgulama Bildirim geçmişini döndürür Google’ın URL hakkındaki indeks bilgilerini gösterir
İndeks talebi Desteklenen sayfa için bildirim Önemli URL için manuel talep
İndeks garantisi Yok Yok

Indexing API durum sorgusu ile URL Denetleme raporu aynı şeyi göstermez.

API’nin getMetadata yöntemi, Google’ın bildirimi alıp almadığını gösterir. URL’nin gerçekten dizine eklenip eklenmediğini göstermez.

Google Indexing API Kullanım Gereksinimleri

Kurulum için şu bileşenlere ihtiyaç duyulur:

  • Google hesabı
  • Google Cloud projesi
  • Etkinleştirilmiş Indexing API
  • Servis hesabı
  • JSON özel anahtar dosyası
  • Search Console’da doğrulanmış mülk
  • Servis hesabının mülke sahip olarak eklenmesi
  • OAuth 2.0 yetkilendirmesi
  • Python veya PHP çalıştırabilen ortam
  • Desteklenen yapılandırılmış veriye sahip sayfalar

Google Cloud Projesi Oluşturma

İlk aşamada Indexing API için bir Google Cloud projesi oluşturulmalıdır.

Proje adını belirleyin

Proje adı, API’nin kullanılacağı site veya sistemle ilişkilendirilebilir.

Örnek:

softajans-indexing-api

Birden fazla müşteri sitesi yönetiliyorsa her site veya proje için ayrı yapı oluşturmak güvenlik ve kota takibini kolaylaştırabilir.

Projeyi seçin

Google Cloud panelinde API’yi etkinleştirmeden önce doğru projenin seçildiğinden emin olun.

Yanlış projede servis hesabı oluşturmak veya API’yi farklı projede etkinleştirmek yetkilendirme sorunlarına neden olabilir.

Indexing API’yi Etkinleştirme

Google Cloud projesinde:

  • API ve Hizmetler bölümüne girilir.
  • API kitaplığı açılır.
  • Indexing API aranır.
  • İlgili API seçilir.
  • Etkinleştirme işlemi tamamlanır.

API etkinleştirilmeden gönderilen isteklerde hizmetin kapalı olduğunu belirten yetki hataları alınabilir.

Servis Hesabı Oluşturma

Servis hesabı, insan kullanıcısından bağımsız olarak uygulamaların Google hizmetlerine erişmesini sağlayan teknik hesaptır.

Servis hesabı oluştururken:

  • Açıklayıcı bir hesap adı belirleyin.
  • Projeyle ilişkili hesabı seçin.
  • Gerekli olmayan geniş Google Cloud rollerini vermeyin.
  • Servis hesabının e-posta adresini kaydedin.
  • JSON anahtarını güvenli şekilde oluşturun.

Örnek servis hesabı adresi:

indexing-bot@softajans-indexing-api.iam.gserviceaccount.com

Google Cloud projesinde servis hesabına genel yönetici rolü vermek çoğu durumda gerekli değildir. Indexing API erişiminde asıl önemli konu, servis hesabının Search Console mülkünde uygun yetkiye sahip olmasıdır.

JSON Anahtar Dosyası Oluşturma

Servis hesabı oluşturulduktan sonra özel anahtar oluşturulur.

Önerilen dosya biçimi:

JSON

Dosya içerisinde genel olarak şu alanlar bulunur:

{
  "type": "service_account",
  "project_id": "softajans-indexing-api",
  "private_key_id": "PRIVATE_KEY_ID",
  "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  "client_email": "indexing-bot@softajans-indexing-api.iam.gserviceaccount.com",
  "client_id": "CLIENT_ID",
  "token_uri": "https://oauth2.googleapis.com/token"
}

Bu dosya şifre gibi değerlendirilmelidir.

JSON anahtarı nerede saklanmalıdır?

Dosya:

  • Web sitesinin herkese açık klasörüne yüklenmemeli
  • WordPress Medya Kütüphanesi’ne eklenmemeli
  • Git deposuna gönderilmemeli
  • E-posta veya mesajlaşma uygulamalarında paylaşılmamalı
  • Tema klasörünün içerisine konulmamalı
  • Yedek dosyalarla herkese açık hale getirilmemelidir

Mümkünse web kök dizininin dışında saklanmalıdır.

Örnek Linux dosya yolu:

/home/kullanici/private/google-indexing-service-account.json

Dosya izinleri mümkün olduğunca sınırlandırılmalıdır:

chmod 600 /home/kullanici/private/google-indexing-service-account.json

Anahtarın açığa çıktığından şüpheleniliyorsa Google Cloud üzerinden ilgili anahtar iptal edilmeli ve yenisi oluşturulmalıdır.

Servis Hesabını Search Console’a Ekleme

Servis hesabının ilgili site adına bildirim gönderebilmesi için Search Console mülküne eklenmesi gerekir.

Site sahipliğini doğrulayın

Öncelikle site normal Google hesabıyla Search Console’da doğrulanmalıdır.

Şu mülk türleri kullanılabilir:

  • Alan adı mülkü
  • URL ön eki mülkü

URL ön eki mülkünde protokol ve alt alan adı eşleşmesine dikkat edilmelidir.

Örneğin şu adresler farklı kapsamlar oluşturabilir:

http://example.com/
https://example.com/
https://www.example.com/
https://example.com/is-ilanlari/

Servis hesabı e-postasını ekleyin

JSON dosyasındaki client_email değeri Search Console mülküne eklenmelidir.

Örnek:

indexing-bot@softajans-indexing-api.iam.gserviceaccount.com

Servis hesabı yalnızca normal kullanıcı olarak değil, gerekli mülk üzerinde sahip yetkisiyle eklenmelidir.

Yanlış Search Console mülküne eklenen servis hesabı 403 Forbidden veya sahiplik doğrulama hatalarına neden olabilir.

Indexing API Kotaları

Başlangıç ve test kullanımı için varsayılan kotalar uygulanır.

Kota Varsayılan sınır
Günlük yayın isteği Proje başına 200
Dakikalık metadata isteği Proje başına 180
Bütün uç noktalar için dakikalık istek Proje başına 380
Tek batch içerisindeki maksimum çağrı 100

Günlük yayın kotasına hem URL_UPDATED hem de URL_DELETED istekleri dahildir.

Batch kullanmak kotayı azaltır mı?

Hayır.

Örneğin 100 URL tek bir batch isteği içerisinde gönderilirse kota açısından 100 yayın isteği kullanılmış olur.

Batch yöntemi yalnızca kurulan HTTP bağlantısı sayısını azaltır.

Birden fazla servis hesabı kullanmak doğru mu?

Kota sınırını aşmak için:

  • Birden fazla servis hesabı
  • Birden fazla Google Cloud projesi
  • Farklı hesaplar
  • Dönen anahtar sistemleri

kullanılmamalıdır.

Bu tür uygulamalar kota sınırlarını aşma girişimi olarak değerlendirilebilir.

Python ile Google Indexing API Kurulumu

Python kullanımı, toplu URL yönetimi, zamanlanmış işlemler ve özel otomasyonlar için uygun bir yöntemdir.

Python Ortamını Hazırlama

Python sürümünü kontrol edin:

python --version

Bazı sistemlerde komut şu şekilde olabilir:

python3 --version

Proje klasörü oluşturun:

mkdir google-indexing-api
cd google-indexing-api

Sanal ortam oluşturun:

python -m venv .venv

Windows üzerinde sanal ortamı etkinleştirin:

.venv\Scripts\activate

macOS ve Linux üzerinde:

source .venv/bin/activate

Python Paketlerini Yükleme

Gerekli paketleri yüklemek için:

python -m pip install --upgrade google-api-python-client google-auth

Bağımlılıkları dosyaya kaydetmek için:

python -m pip freeze > requirements.txt

Örnek requirements.txt içeriği:

google-api-python-client
google-auth

Python Proje Yapısı

Örnek klasör yapısı:

google-indexing-api/
├── .venv/
├── private/
│   └── service-account.json
├── indexing_api.py
├── requirements.txt
└── .gitignore

.gitignore dosyasına şu satırlar eklenmelidir:

.venv/
private/
*.json
__pycache__/
.env

Bu işlem JSON anahtarının yanlışlıkla Git deposuna eklenmesini önlemeye yardımcı olur.

Python ile URL Güncelleme ve Silme Scripti

Aşağıdaki script:

  • Servis hesabıyla kimlik doğrular.
  • URL güncelleme bildirimi gönderir.
  • URL silme bildirimi gönderir.
  • Bildirim durumunu sorgular.
  • Birden fazla URL kabul eder.
  • API hatalarını yakalar.
#!/usr/bin/env python3

from __future__ import annotations

import argparse
import json
import sys
from pathlib import Path
from typing import Any

from google.oauth2 import service_account
from googleapiclient.discovery import Resource, build
from googleapiclient.errors import HttpError


SCOPES = ["https://www.googleapis.com/auth/indexing"]

ACTION_TYPES = {
    "update": "URL_UPDATED",
    "delete": "URL_DELETED",
}


def create_service(key_file: Path) -> Resource:
    """Yetkilendirilmiş Indexing API istemcisini oluşturur."""
    if not key_file.is_file():
        raise FileNotFoundError(f"Servis hesabı dosyası bulunamadı: {key_file}")

    credentials = service_account.Credentials.from_service_account_file(
        str(key_file),
        scopes=SCOPES,
    )

    return build(
        "indexing",
        "v3",
        credentials=credentials,
        cache_discovery=False,
    )


def validate_url(url: str) -> str:
    """URL'nin temel biçimini kontrol eder."""
    normalized = url.strip()

    if not normalized.startswith(("https://", "http://")):
        raise ValueError(f"Geçersiz URL: {url}")

    return normalized


def publish_notification(
    service: Resource,
    url: str,
    notification_type: str,
) -> dict[str, Any]:
    """URL_UPDATED veya URL_DELETED bildirimi gönderir."""
    body = {
        "url": validate_url(url),
        "type": notification_type,
    }

    response = (
        service.urlNotifications()
        .publish(body=body)
        .execute()
    )

    return response


def get_metadata(service: Resource, url: str) -> dict[str, Any]:
    """Daha önce gönderilmiş bildirimin metadata bilgisini getirir."""
    response = (
        service.urlNotifications()
        .getMetadata(url=validate_url(url))
        .execute()
    )

    return response


def print_json(data: dict[str, Any]) -> None:
    print(json.dumps(data, ensure_ascii=False, indent=2))


def main() -> int:
    parser = argparse.ArgumentParser(
        description="Google Indexing API bildirim aracı"
    )

    parser.add_argument(
        "action",
        choices=["update", "delete", "status"],
        help="Gerçekleştirilecek işlem",
    )

    parser.add_argument(
        "urls",
        nargs="+",
        help="İşlem yapılacak tam URL adresleri",
    )

    parser.add_argument(
        "--key",
        required=True,
        type=Path,
        help="Servis hesabı JSON dosyasının yolu",
    )

    args = parser.parse_args()

    try:
        service = create_service(args.key)

        for raw_url in args.urls:
            url = validate_url(raw_url)
            print(f"\nİşleniyor: {url}")

            if args.action == "status":
                result = get_metadata(service, url)
            else:
                result = publish_notification(
                    service,
                    url,
                    ACTION_TYPES[args.action],
                )

            print_json(result)

        return 0

    except FileNotFoundError as error:
        print(f"Dosya hatası: {error}", file=sys.stderr)
        return 1

    except ValueError as error:
        print(f"Doğrulama hatası: {error}", file=sys.stderr)
        return 1

    except HttpError as error:
        status = getattr(error.resp, "status", "bilinmiyor")
        detail = error.content.decode("utf-8", errors="replace")

        print(
            f"Google API hatası ({status}): {detail}",
            file=sys.stderr,
        )
        return 1

    except Exception as error:
        print(f"Beklenmeyen hata: {error}", file=sys.stderr)
        return 1


if __name__ == "__main__":
    raise SystemExit(main())

Python Scripti Nasıl Kullanılır?

Yeni veya güncellenmiş URL gönderme

python indexing_api.py update \
  https://www.example.com/is-ilanlari/yazilim-uzmani \
  --key private/service-account.json

Birden fazla URL:

python indexing_api.py update \
  https://www.example.com/is-ilanlari/yazilim-uzmani \
  https://www.example.com/is-ilanlari/seo-uzmani \
  --key private/service-account.json

Kaldırma bildirimi gönderme

URL’nin önce 404, 410 veya noindex durumuna getirildiğinden emin olun.

python indexing_api.py delete \
  https://www.example.com/is-ilanlari/yazilim-uzmani \
  --key private/service-account.json

Bildirim durumunu sorgulama

python indexing_api.py status \
  https://www.example.com/is-ilanlari/yazilim-uzmani \
  --key private/service-account.json

Durum sorgusu, Google’ın en son ne zaman bildirim aldığını gösterebilir. URL’nin dizinde olup olmadığını kesin olarak göstermez.

Python ile Batch İstek Gönderme

En fazla 100 bildirimi tek HTTP batch isteğinde birleştirmek mümkündür.

from __future__ import annotations

from typing import Any

from googleapiclient.discovery import Resource


def batch_publish(
    service: Resource,
    urls: list[str],
    notification_type: str = "URL_UPDATED",
) -> dict[str, dict[str, Any]]:
    if not urls:
        return {}

    if len(urls) > 100:
        raise ValueError("Tek batch isteğinde en fazla 100 URL kullanılabilir.")

    results: dict[str, dict[str, Any]] = {}

    def callback(
        request_id: str,
        response: dict[str, Any] | None,
        exception: Exception | None,
    ) -> None:
        url = urls[int(request_id)]

        if exception is not None:
            results[url] = {
                "success": False,
                "error": str(exception),
            }
            return

        results[url] = {
            "success": True,
            "response": response or {},
        }

    batch = service.new_batch_http_request(callback=callback)

    for index, url in enumerate(urls):
        request = service.urlNotifications().publish(
            body={
                "url": url,
                "type": notification_type,
            }
        )

        batch.add(request, request_id=str(index))

    batch.execute()

    return results

Kullanım örneği:

urls = [
    "https://www.example.com/is-ilanlari/yazilim-uzmani",
    "https://www.example.com/is-ilanlari/seo-uzmani",
]

results = batch_publish(
    service,
    urls,
    notification_type="URL_UPDATED",
)

print(results)

Batch içerisinde 50 URL bulunuyorsa günlük kotadan 50 istek düşer.

Python Scripti Zamanlanabilir mi?

Linux sunucuda cron kullanılarak belirli zamanlarda çalıştırılabilir.

Örnek:

0 * * * * /home/user/project/.venv/bin/python \
/home/user/project/indexing_api.py update \
https://www.example.com/is-ilanlari/yazilim-uzmani \
--key /home/user/private/service-account.json

Ancak aynı değişmemiş URL’yi her saat veya her gün göndermek doğru değildir.

Bildirim yalnızca:

  • Yeni ilan yayınlandığında
  • İlan içeriği önemli ölçüde değiştiğinde
  • İlan kaldırıldığında
  • Canlı yayın bilgisi değiştiğinde

gönderilmelidir.

Düzenli olarak aynı URL’yi göndermek kota israfına neden olur.

WordPress ile Google Indexing API Kullanımı

WordPress entegrasyonu şu yöntemlerle yapılabilir:

  • Hazır Indexing API eklentisi kullanmak
  • Özel WordPress eklentisi geliştirmek
  • WordPress dışındaki Python servisine webhook göndermek
  • Yayınlama işlemlerini kuyruk sistemiyle takip etmek

Hazır eklenti kullanılırken eklentinin bütün yazıları otomatik göndermediğinden emin olunmalıdır. Yalnızca desteklenen iş ilanı veya canlı yayın içerik türleri seçilmelidir.

WordPress araçlarının görevlerini karşılaştırmak için WordPress SEO eklentileri içeriği incelenebilir.

WordPress’te JSON Anahtarı Nasıl Saklanır?

JSON dosyasını tema veya eklenti klasörüne yüklemek önerilmez.

Dosyayı web kök dizininin dışında saklayın:

/home/kullanici/private/google-indexing-service-account.json

Ardından wp-config.php dosyasına şu tanımı ekleyin:

define(
    'SOFT_INDEXING_SERVICE_ACCOUNT_JSON',
    '/home/kullanici/private/google-indexing-service-account.json'
);

Bu satır, wp-config.php dosyasındaki şu açıklamadan önce eklenebilir:

/* That's all, stop editing! Happy publishing. */

Anahtar dosyasını doğrudan eklenti ayarına metin olarak yapıştırmak, veritabanı ve yedek dosyalarında hassas anahtarın saklanmasına neden olabilir.

WordPress İçin Özel Indexing API Eklentisi

Aşağıdaki örnek eklenti:

  • Servis hesabı JSON dosyasını okur.
  • OAuth 2.0 erişim belirteci oluşturur.
  • Erişim belirtecini geçici olarak önbelleğe alır.
  • Desteklenen yazı türü yayınlandığında URL_UPDATED gönderir.
  • İçerik çöpe taşındığında URL_DELETED gönderir.
  • İşlemleri WP-Cron kuyruğuna alır.
  • Hataları WordPress hata günlüğüne kaydeder.

wp-content/plugins/soft-indexing-api/ klasörünü oluşturun.

Klasör içerisinde şu dosyayı hazırlayın:

soft-indexing-api.php

Dosya içeriği:

<?php
/**
 * Plugin Name: Soft Indexing API
 * Description: Desteklenen WordPress içerikleri için Google Indexing API bildirimi gönderir.
 * Version: 1.0.0
 */

defined('ABSPATH') || exit;

const SOFT_INDEXING_SCOPE =
    'https://www.googleapis.com/auth/indexing';

const SOFT_INDEXING_TOKEN_URL =
    'https://oauth2.googleapis.com/token';

const SOFT_INDEXING_PUBLISH_URL =
    'https://indexing.googleapis.com/v3/urlNotifications:publish';


/**
 * Base64 URL biçimi oluşturur.
 */
function soft_indexing_base64_url_encode($value)
{
    return rtrim(
        strtr(base64_encode($value), '+/', '-_'),
        '='
    );
}


/**
 * Servis hesabı JSON dosyasını okur.
 */
function soft_indexing_load_credentials()
{
    if (!defined('SOFT_INDEXING_SERVICE_ACCOUNT_JSON')) {
        return new WP_Error(
            'missing_key_path',
            'Servis hesabı JSON dosya yolu tanımlanmamış.'
        );
    }

    $path = SOFT_INDEXING_SERVICE_ACCOUNT_JSON;

    if (!is_readable($path)) {
        return new WP_Error(
            'unreadable_key_file',
            'Servis hesabı JSON dosyası okunamıyor.'
        );
    }

    $contents = file_get_contents($path);
    $credentials = json_decode($contents, true);

    if (!is_array($credentials)) {
        return new WP_Error(
            'invalid_json',
            'Servis hesabı dosyası geçerli JSON değil.'
        );
    }

    $required_fields = array(
        'client_email',
        'private_key',
    );

    foreach ($required_fields as $field) {
        if (empty($credentials[$field])) {
            return new WP_Error(
                'missing_credential_field',
                'Servis hesabı dosyasında eksik alan: ' . $field
            );
        }
    }

    return $credentials;
}


/**
 * OAuth 2.0 erişim belirteci oluşturur.
 */
function soft_indexing_get_access_token()
{
    $cached_token = get_transient(
        'soft_indexing_access_token'
    );

    if (is_string($cached_token) && $cached_token !== '') {
        return $cached_token;
    }

    $credentials = soft_indexing_load_credentials();

    if (is_wp_error($credentials)) {
        return $credentials;
    }

    $now = time();

    $header = array(
        'alg' => 'RS256',
        'typ' => 'JWT',
    );

    if (!empty($credentials['private_key_id'])) {
        $header['kid'] = $credentials['private_key_id'];
    }

    $claims = array(
        'iss'   => $credentials['client_email'],
        'scope' => SOFT_INDEXING_SCOPE,
        'aud'   => SOFT_INDEXING_TOKEN_URL,
        'iat'   => $now,
        'exp'   => $now + 3600,
    );

    $encoded_header = soft_indexing_base64_url_encode(
        wp_json_encode($header)
    );

    $encoded_claims = soft_indexing_base64_url_encode(
        wp_json_encode($claims)
    );

    $unsigned_token =
        $encoded_header . '.' . $encoded_claims;

    $signature = '';

    $signed = openssl_sign(
        $unsigned_token,
        $signature,
        $credentials['private_key'],
        OPENSSL_ALGO_SHA256
    );

    if (!$signed) {
        return new WP_Error(
            'jwt_signing_failed',
            'JWT imzası oluşturulamadı.'
        );
    }

    $assertion =
        $unsigned_token . '.' .
        soft_indexing_base64_url_encode($signature);

    $response = wp_remote_post(
        SOFT_INDEXING_TOKEN_URL,
        array(
            'timeout' => 20,
            'body'    => array(
                'grant_type' =>
                    'urn:ietf:params:oauth:grant-type:jwt-bearer',
                'assertion' => $assertion,
            ),
        )
    );

    if (is_wp_error($response)) {
        return $response;
    }

    $status_code = wp_remote_retrieve_response_code(
        $response
    );

    $body = json_decode(
        wp_remote_retrieve_body($response),
        true
    );

    if (
        $status_code !== 200 ||
        !is_array($body) ||
        empty($body['access_token'])
    ) {
        return new WP_Error(
            'token_request_failed',
            'Google erişim belirteci alınamadı.',
            array(
                'status' => $status_code,
                'body'   => $body,
            )
        );
    }

    $expires_in = isset($body['expires_in'])
        ? (int) $body['expires_in']
        : 3600;

    set_transient(
        'soft_indexing_access_token',
        sanitize_text_field($body['access_token']),
        max(60, $expires_in - 300)
    );

    return $body['access_token'];
}


/**
 * Indexing API bildirimi gönderir.
 */
function soft_indexing_publish_notification(
    $url,
    $notification_type
) {
    $allowed_types = array(
        'URL_UPDATED',
        'URL_DELETED',
    );

    if (
        !filter_var($url, FILTER_VALIDATE_URL) ||
        !in_array(
            $notification_type,
            $allowed_types,
            true
        )
    ) {
        return new WP_Error(
            'invalid_notification',
            'URL veya bildirim türü geçersiz.'
        );
    }

    $access_token = soft_indexing_get_access_token();

    if (is_wp_error($access_token)) {
        return $access_token;
    }

    $response = wp_remote_post(
        SOFT_INDEXING_PUBLISH_URL,
        array(
            'timeout' => 20,
            'headers' => array(
                'Authorization' =>
                    'Bearer ' . $access_token,
                'Content-Type' =>
                    'application/json',
            ),
            'body' => wp_json_encode(
                array(
                    'url'  => esc_url_raw($url),
                    'type' => $notification_type,
                )
            ),
        )
    );

    if (is_wp_error($response)) {
        return $response;
    }

    $status_code = wp_remote_retrieve_response_code(
        $response
    );

    $body = json_decode(
        wp_remote_retrieve_body($response),
        true
    );

    if ($status_code !== 200) {
        return new WP_Error(
            'indexing_api_failed',
            'Indexing API isteği başarısız oldu.',
            array(
                'status' => $status_code,
                'body'   => $body,
            )
        );
    }

    return is_array($body) ? $body : array();
}


/**
 * API kullanımına izin verilen yazı türleri.
 *
 * Liste yalnızca geçerli JobPosting veya BroadcastEvent
 * yapılandırılmış verisi üreten içerik türlerini içermelidir.
 */
function soft_indexing_allowed_post_types()
{
    return apply_filters(
        'soft_indexing_allowed_post_types',
        array(
            'job_listing',
        )
    );
}


/**
 * İçeriğin Indexing API için uygun olup olmadığını kontrol eder.
 */
function soft_indexing_is_supported_post($post)
{
    if (!($post instanceof WP_Post)) {
        return false;
    }

    return in_array(
        $post->post_type,
        soft_indexing_allowed_post_types(),
        true
    );
}


/**
 * Bildirimi WP-Cron kuyruğuna ekler.
 */
function soft_indexing_queue_notification(
    $url,
    $notification_type
) {
    $args = array(
        esc_url_raw($url),
        $notification_type,
    );

    if (
        !wp_next_scheduled(
            'soft_indexing_send_notification',
            $args
        )
    ) {
        wp_schedule_single_event(
            time() + 15,
            'soft_indexing_send_notification',
            $args
        );
    }
}


/**
 * Kuyruktaki bildirimi gönderir.
 */
function soft_indexing_process_notification(
    $url,
    $notification_type
) {
    $result = soft_indexing_publish_notification(
        $url,
        $notification_type
    );

    if (is_wp_error($result)) {
        error_log(
            sprintf(
                '[Soft Indexing API] %s | %s | %s',
                $notification_type,
                $url,
                $result->get_error_message()
            )
        );

        return;
    }

    error_log(
        sprintf(
            '[Soft Indexing API] Başarılı: %s | %s',
            $notification_type,
            $url
        )
    );
}

add_action(
    'soft_indexing_send_notification',
    'soft_indexing_process_notification',
    10,
    2
);


/**
 * Yayınlanan veya güncellenen içerik için bildirim kuyruğu.
 */
function soft_indexing_on_save_post(
    $post_id,
    $post,
    $update
) {
    if (
        wp_is_post_revision($post_id) ||
        wp_is_post_autosave($post_id) ||
        !soft_indexing_is_supported_post($post) ||
        $post->post_status !== 'publish'
    ) {
        return;
    }

    $url = get_permalink($post);

    if (!$url) {
        return;
    }

    $current_signature = md5(
        $url . '|' . $post->post_modified_gmt
    );

    $saved_signature = get_post_meta(
        $post_id,
        '_soft_indexing_signature',
        true
    );

    if (
        $update &&
        hash_equals(
            (string) $saved_signature,
            $current_signature
        )
    ) {
        return;
    }

    soft_indexing_queue_notification(
        $url,
        'URL_UPDATED'
    );

    update_post_meta(
        $post_id,
        '_soft_indexing_signature',
        $current_signature
    );
}

add_action(
    'save_post',
    'soft_indexing_on_save_post',
    20,
    3
);


/**
 * Çöpe taşınan içerik için kaldırma bildirimi.
 */
function soft_indexing_on_trashed_post($post_id)
{
    $post = get_post($post_id);

    if (!soft_indexing_is_supported_post($post)) {
        return;
    }

    $url = get_permalink($post);

    if (!$url) {
        return;
    }

    soft_indexing_queue_notification(
        $url,
        'URL_DELETED'
    );
}

add_action(
    'trashed_post',
    'soft_indexing_on_trashed_post',
    20,
    1
);


/**
 * Kalıcı olarak silinen içerik için kaldırma bildirimi.
 */
function soft_indexing_before_delete_post(
    $post_id,
    $post
) {
    if (!soft_indexing_is_supported_post($post)) {
        return;
    }

    $url = get_permalink($post);

    if (!$url) {
        return;
    }

    soft_indexing_queue_notification(
        $url,
        'URL_DELETED'
    );
}

add_action(
    'before_delete_post',
    'soft_indexing_before_delete_post',
    20,
    2
);

WordPress Eklentisini Etkinleştirme

Eklenti dosyası yüklendikten sonra:

  • WordPress yönetim paneline girin.
  • Eklentiler bölümünü açın.
  • Soft Indexing API eklentisini bulun.
  • Eklentiyi etkinleştirin.
  • İş ilanı içerik türünü kontrol edin.
  • Test ilanı yayınlayın.
  • Hata günlüğünü inceleyin.
  • Search Console sahipliğini doğrulayın.

Eklentide varsayılan özel yazı türü şudur:

job_listing

Sitenizde farklı bir özel yazı türü kullanılıyorsa filtreyle değiştirilebilir:

function site_indexing_post_types($post_types)
{
    return array(
        'kariyer_ilani',
        'canli_yayin',
    );
}

add_filter(
    'soft_indexing_allowed_post_types',
    'site_indexing_post_types'
);

Bu listeye yalnızca geçerli JobPosting veya BroadcastEvent yapılandırılmış verisi üreten içerik türleri eklenmelidir.

WP-Cron Çalışmıyorsa Ne Olur?

Örnek eklenti bildirimleri WP-Cron kuyruğuna ekler. WP-Cron aşağıdaki durumlarda gecikebilir:

  • Siteye trafik gelmiyorsa
  • WordPress cron sistemi kapatıldıysa
  • Sunucu dış bağlantıları engelliyorsa
  • Güvenlik eklentisi isteği durduruyorsa
  • Hosting zamanlanmış görevleri sınırlandırıyorsa

Daha güvenilir bir sistem için sunucu cron görevi kullanılabilir.

Örnek:

*/5 * * * * curl -s https://www.example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Sunucu güvenliği ve hosting yapılandırması doğru planlanmalıdır. Barındırma altyapısının temel özellikleri için hosting nedir içeriği incelenebilir.

WordPress’te Hata Günlüklerini Açma

Test ortamında wp-config.php dosyasına şu tanımlar eklenebilir:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

Hata kayıtları genellikle şu dosyada bulunur:

wp-content/debug.log

Canlı sitede hata ayrıntılarının ziyaretçilere gösterilmemesi gerekir.

Test tamamlandıktan sonra günlük dosyasının hassas bilgi içerip içermediği kontrol edilmelidir.

Google Indexing API Yanıtları Nasıl Yorumlanır?

Başarılı bir bildirim isteği genel olarak metadata bilgisi döndürür.

Örnek:

{
  "urlNotificationMetadata": {
    "url": "https://www.example.com/is-ilanlari/yazilim-uzmani",
    "latestUpdate": {
      "url": "https://www.example.com/is-ilanlari/yazilim-uzmani",
      "type": "URL_UPDATED",
      "notifyTime": "2026-08-05T12:30:00Z"
    }
  }
}

Bu yanıt:

  • Bildirimin Google tarafından alındığını
  • Bildirim türünü
  • Bildirim zamanını

gösterir.

URL’nin dizine eklendiğini veya arama sonuçlarında yer aldığını göstermez.

Indexing API Hata Kodları

HTTP kodu Genel anlamı Kontrol edilmesi gerekenler
400 Hatalı istek URL, JSON gövdesi ve bildirim türü
401 Kimlik doğrulama hatası JWT, erişim belirteci ve sistem saati
403 Yetki veya kota sorunu Search Console sahipliği ve API erişimi
404 Metadata bulunamadı Daha önce başarılı bildirim gönderilip gönderilmediği
429 Kota aşıldı Günlük ve dakikalık kotalar
500 Google sunucu hatası İsteği daha sonra yeniden denemek
503 Hizmet geçici olarak kullanılamıyor Geri çekilme stratejisiyle tekrar denemek

400 Bad Request Hatası

Bu hata genellikle aşağıdaki nedenlerle oluşur:

  • Geçersiz URL
  • Eksik type alanı
  • Yanlış bildirim türü
  • Geçersiz JSON
  • Yanlış Content-Type
  • URL’nin tam adres olmaması

Doğru bildirim türleri:

URL_UPDATED
URL_DELETED

401 Unauthorized Hatası

Kimlik doğrulama işlemi başarısız olmuştur.

Kontrol edilmesi gerekenler:

  • JSON dosyası geçerli mi?
  • Özel anahtar doğru okunuyor mu?
  • OAuth kapsamı doğru mu?
  • Sunucunun tarihi ve saati doğru mu?
  • JWT süresi bir saati geçiyor mu?
  • Erişim belirteci süresi dolmuş mu?
  • Servis hesabı anahtarı iptal edilmiş mi?

Sunucu saati yanlışsa JWT belirtecinin geçerlilik zamanı Google tarafından kabul edilmeyebilir.

403 Forbidden Hatası

En sık karşılaşılan hatalardan biridir.

Olası nedenler:

  • Indexing API etkin değil
  • Yanlış Google Cloud projesi kullanılıyor
  • Servis hesabı Search Console’a eklenmemiş
  • Servis hesabı yeterli yetkiye sahip değil
  • Yanlış Search Console mülkü seçilmiş
  • URL farklı protokol veya alt alan adına ait
  • Günlük kota aşılmış
  • API kullanımı kısıtlanmış

Örneğin Search Console mülkü yalnızca:

https://example.com/

ise şu URL farklı kapsamda olabilir:

https://www.example.com/

Alan adı mülkü kullanmak alt alan adları ve protokol farklılıklarının yönetimini kolaylaştırabilir.

404 Metadata Bulunamadı Hatası

getMetadata yalnızca daha önce başarılı şekilde bildirilen URL’ler için sonuç döndürebilir.

404 hatası şu anlama gelebilir:

  • URL daha önce gönderilmemiş
  • Önceki bildirim başarısız olmuş
  • Farklı URL biçimi sorgulanıyor
  • HTTP ve HTTPS adresleri karıştırılmış
  • www ve www olmayan sürümler karıştırılmış
  • Sondaki eğik çizgi farklı kullanılmış

URL’lerin canonical adresleriyle tutarlı olması gerekir. Canonical kullanımı hakkında bilgi almak için canonical URL nedir rehberi incelenebilir.

429 Too Many Requests Hatası

Kota veya hız sınırı aşılmıştır.

Çözüm için:

  • Kota kullanımını kontrol edin.
  • Aynı URL’nin tekrar gönderilmesini önleyin.
  • İstekleri zamana yayın.
  • Hata durumunda üstel bekleme kullanın.
  • Değişmeyen URL’leri yeniden göndermeyin.
  • Batch kullanımının kotayı azaltmadığını unutmayın.
  • Gerekliyse resmî kota başvurusu yapın.

Birden fazla hesapla kotayı aşmaya çalışılmamalıdır.

Yeniden Deneme Stratejisi

429, 500 ve 503 gibi geçici hatalarda istek hemen ve sürekli tekrar edilmemelidir.

Örnek bekleme süreleri:

  • İlk hata: 1 saniye
  • İkinci hata: 2 saniye
  • Üçüncü hata: 4 saniye
  • Dördüncü hata: 8 saniye
  • Beşinci hata: 16 saniye

Bekleme süresine küçük rastgele değer eklemek, çok sayıda istemcinin aynı anda tekrar istek göndermesini önleyebilir.

400, 401 ve kalıcı 403 hatalarında ise sürekli tekrar denemek yerine yapılandırma düzeltilmelidir.

Yapılandırılmış Veri Kontrolü

API gönderiminden önce sayfada desteklenen yapılandırılmış verinin bulunduğu doğrulanmalıdır.

İş ilanı sayfasında temel olarak:

{
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Yazılım Uzmanı",
  "description": "İş ilanı açıklaması",
  "datePosted": "2026-08-05",
  "validThrough": "2026-09-05T23:59:59+03:00",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Örnek Şirket"
  }
}

gibi bir yapı bulunabilir.

Bu yalnızca basitleştirilmiş bir örnektir. İş ilanının geçerli olabilmesi için gerekli ve önerilen alanların proje kapsamında ayrıca kontrol edilmesi gerekir.

API bildirimi, hatalı yapılandırılmış veriyi düzeltmez.

İş İlanı Kaldırılırken Ne Yapılmalıdır?

Süresi dolan iş ilanında yalnızca URL_DELETED göndermek yeterli değildir.

Uygulanabilecek yöntemler:

Sayfayı 404 veya 410 yapmak

İlanın kalıcı olarak kaldırıldığı durumlarda kullanılabilir.

Sayfaya noindex eklemek

Sayfa kullanıcılar için açık kalacak ancak arama sonuçlarında gösterilmeyecekse uygulanabilir.

İlanı güncellemek

İlan hâlâ geçerliyse validThrough ve diğer bilgiler güncellenebilir.

Yeni ilana yönlendirmek

Yalnızca gerçekten aynı veya güçlü şekilde karşılık gelen yeni bir ilan varsa yönlendirme yapılmalıdır.

Bütün eski iş ilanlarını alakasız bir kategori veya ana sayfaya yönlendirmek soft 404 sorununa neden olabilir.

API İsteği Göndermeden Önce URL Kontrolü

Her URL için şu kontroller yapılmalıdır:

  • Sayfa HTTPS üzerinden açılıyor mu?
  • HTTP durum kodu doğru mu?
  • Googlebot erişebiliyor mu?
  • Robots.txt engeli var mı?
  • Noindex etiketi bulunuyor mu?
  • Canonical adres doğru mu?
  • Sayfa desteklenen yapılandırılmış veriyi içeriyor mu?
  • Yapılandırılmış veride hata var mı?
  • İçerik gerçekten yeni veya değişmiş mi?
  • URL Search Console mülkü kapsamında mı?
  • URL site haritasında bulunuyor mu?
  • Dahili bağlantılarla erişilebiliyor mu?

Sayfanın site içerisindeki keşfedilebilirliğini artırmak için site içi SEO optimizasyonu uygulanmalıdır.

Indexing API SEO’yu Geliştirir mi?

Indexing API doğrudan bir sıralama artırma aracı değildir.

API:

  • Daha fazla backlink oluşturmaz.
  • İçerik kalitesini artırmaz.
  • Site otoritesi sağlamaz.
  • Arama niyetini karşılamaz.
  • Sayfa hızını geliştirmez.
  • Teknik hataları otomatik çözmez.
  • Sıralama garantisi vermez.

Desteklenen kısa ömürlü içeriklerde değişikliklerin Google’a daha hızlı bildirilmesine yardımcı olur.

SEO performansı için ayrıca:

  • Anahtar kelime analizi
  • Arama niyeti
  • Özgün içerik
  • Site mimarisi
  • Dahili bağlantılar
  • Sayfa performansı
  • Mobil uyumluluk
  • Backlink profili
  • Teknik tarama
  • Kullanıcı deneyimi

değerlendirilmelidir.

Sitenin genel durumunu incelemek için SEO analizi nasıl yapılır rehberinden yararlanılabilir.

API Kullanımında Güvenlik Önlemleri

JSON anahtarını herkese açık tutmayın

Anahtar dosyasına erişen kişi servis hesabı adına istek gönderebilir.

Anahtarı Git deposuna eklemeyin

Depo özel olsa bile anahtar dosyasının sürüm geçmişinde kalması risk oluşturur.

Dosya izinlerini sınırlandırın

Yalnızca uygulamanın çalıştığı kullanıcı dosyayı okuyabilmelidir.

Gereksiz anahtarları silin

Aynı servis hesabı için çok sayıda aktif anahtar bulundurmayın.

Anahtar rotasyonu uygulayın

Belirli aralıklarla yeni anahtar oluşturulabilir ve eski anahtar iptal edilebilir.

Hata kayıtlarında anahtarı göstermeyin

Private key, JWT assertion veya access token hata günlüklerine yazılmamalıdır.

Test ve canlı projeleri ayırın

Test kodunun canlı Search Console mülklerine yanlışlıkla bildirim göndermesi önlenmelidir.

WordPress kullanıcı yetkilerini kontrol edin

API ayarlarını yalnızca yetkili yöneticiler değiştirebilmelidir.

Google Indexing API Kullanımında Yapılan Hatalar

Hata Olası sonucu Doğru yaklaşım
Bütün site URL’lerini göndermek Kural ihlali ve kota kaybı Yalnızca desteklenen sayfaları göndermek
API’yi indeks garantisi sanmak Yanlış performans beklentisi Bildirim sistemi olarak değerlendirmek
Servis hesabını kullanıcı olarak eklemek 403 yetki hatası Search Console’da sahip yetkisi vermek
JSON dosyasını public klasöre yüklemek Anahtarın ele geçirilmesi Web kökü dışında saklamak
Değişmeyen URL’leri sürekli göndermek Kota israfı Yalnızca gerçek değişiklikte bildirmek
Birden fazla hesapla kota aşmak Erişimin iptal edilmesi Resmî kota sürecini kullanmak
Silinmeyen sayfaya URL_DELETED göndermek Kaldırma sürecinin başarısız olması Önce 404, 410 veya noindex uygulamak
Metadata sonucunu indeks durumu sanmak Yanlış raporlama Search Console ile ayrıca kontrol etmek
Site haritasını kaldırmak Genel URL keşfinin zayıflaması Sitemap kullanmaya devam etmek
Yapılandırılmış veriyi kontrol etmemek Desteklenen özellikten yararlanamamak Schema doğrulaması yapmak
Canlı sitede test yapmak Yanlış URL bildirimleri Test ortamı ve sınırlı URL kullanmak
Hata kayıtlarını izlememek Sorunların fark edilmemesi Log ve kota takibi kurmak

Google Indexing API Kontrol Listesi

Kurulum tamamlanmadan önce aşağıdaki maddeler kontrol edilmelidir:

  • Sayfalar JobPosting veya BroadcastEvent kapsamında mı?
  • Yapılandırılmış veri geçerli mi?
  • Google Cloud projesi oluşturuldu mu?
  • Indexing API etkinleştirildi mi?
  • Servis hesabı oluşturuldu mu?
  • JSON anahtarı indirildi mi?
  • Anahtar web kökü dışında saklanıyor mu?
  • Anahtar Git deposundan çıkarıldı mı?
  • Site Search Console’da doğrulandı mı?
  • Servis hesabı Search Console’a sahip olarak eklendi mi?
  • Doğru protokol ve alan adı kullanılıyor mu?
  • OAuth kapsamı doğru mu?
  • Sunucu saati doğru mu?
  • Test URL’si yayınlandı mı?
  • URL Googlebot tarafından erişilebilir mi?
  • Canonical adres doğru mu?
  • Robots.txt engeli bulunuyor mu?
  • URL_UPDATED testi başarılı mı?
  • Metadata sorgusu çalışıyor mu?
  • URL_DELETED akışı test edildi mi?
  • Kota kullanımı takip ediliyor mu?
  • Tekrarlanan bildirimler engellendi mi?
  • Hata günlükleri oluşturuldu mu?
  • Sitemap kullanılmaya devam ediyor mu?
  • Search Console indeks raporları izleniyor mu?

Google Indexing API Hakkında Sıkça Sorulan Sorular

Google Indexing API ücretsiz mi?

API kullanımı ücretsizdir. Ancak sunucu, yazılım geliştirme, bakım ve entegrasyon maliyetleri oluşabilir.

Indexing API her web sitesinde kullanılabilir mi?

API yalnızca geçerli iş ilanı ve canlı yayın sayfalarında kullanılmalıdır. Normal blog, ürün ve hizmet sayfaları desteklenen kullanım kapsamında değildir.

Indexing API URL’yi hemen dizine ekler mi?

Hayır. API yalnızca Google’a bildirim gönderir. Tarama ve dizine ekleme kararı Google’a aittir.

HTTP 200 yanıtı ne anlama gelir?

Google’ın API bildirimini başarıyla aldığını gösterir. Sayfanın kesin olarak dizine eklendiğini göstermez.

URL_UPDATED ne zaman kullanılmalıdır?

Yeni desteklenen sayfa yayınlandığında veya mevcut sayfanın içeriğinde önemli bir değişiklik yapıldığında kullanılmalıdır.

URL_DELETED ne zaman kullanılmalıdır?

Sayfa kaldırılıp 404 veya 410 döndürdüğünde ya da noindex etiketi uygulandığında kullanılmalıdır.

Metadata sorgusu indeks durumunu gösterir mi?

Hayır. Yalnızca Google’ın URL için aldığı en son güncelleme veya silme bildirimlerini gösterir.

Günlük Indexing API kotası ne kadardır?

Başlangıç ve test sürecinde varsayılan yayın kotası proje başına günlük 200 istektir. Projenin Google Cloud kota ekranı ayrıca kontrol edilmelidir.

Batch isteğinde kaç URL gönderilebilir?

Tek bir batch isteğinde en fazla 100 API çağrısı birleştirilebilir. Her URL kotadan ayrı istek olarak düşer.

Kota gece yarısı Türkiye saatine göre mi yenilenir?

Kota yenilenmesi Pasifik saatine göre gerçekleşir. Türkiye saatine göre her gün aynı gece yarısı anına denk gelmeyebilir.

Birden fazla servis hesabıyla kota artırılabilir mi?

Kota sınırlarını aşmak amacıyla birden fazla hesap veya proje kullanılması uygun değildir ve erişim kısıtlamasına neden olabilir.

WordPress için hazır eklenti kullanılabilir mi?

Kullanılabilir. Ancak eklentinin yalnızca desteklenen sayfa türlerini gönderdiğinden, servis hesabı anahtarını güvenli sakladığından ve kota sınırlarını aşmadığından emin olunmalıdır.

WordPress blog yazıları API’ye gönderilebilir mi?

Google’ın desteklediği kullanım kapsamına göre normal blog içerikleri için Indexing API kullanılmamalıdır.

Python mu WordPress eklentisi mi daha iyi?

Toplu işlemler ve merkezi otomasyon için Python daha esnektir. Yayın anında otomatik bildirim için WordPress eklentisi daha pratik olabilir. Büyük sistemlerde WordPress’in bir kuyruk veya Python servisine bildirim göndermesi tercih edilebilir.

Servis hesabı neden Search Console’a eklenir?

Servis hesabının bildirim gönderilen site üzerinde yetkili olduğunu doğrulamak için eklenir.

URL Search Console’da dizinde görünmüyorsa ne yapılmalıdır?

URL Denetleme aracıyla:

  • Tarama durumu
  • Noindex
  • Robots.txt
  • Canonical
  • Sunucu yanıtı
  • Google tarafından seçilen canonical
  • Son tarama tarihi

kontrol edilmelidir.

API kullanırken sitemap gerekli mi?

Evet. Indexing API desteklenen kısa ömürlü sayfalardaki bildirimleri kolaylaştırır. Site genelindeki URL keşfi için XML site haritası kullanılmaya devam edilmelidir.

Profesyonel Indexing API Entegrasyonu Neden Önemlidir?

Yanlış yapılandırılan bir sistem:

  • Desteklenmeyen URL’leri gönderebilir.
  • Günlük kotayı kısa sürede tüketebilir.
  • Aynı URL’yi tekrar tekrar gönderebilir.
  • Gizli servis hesabı anahtarını açığa çıkarabilir.
  • Silinmeyen sayfalar için kaldırma bildirimi gönderebilir.
  • Hataları kayıt altına almayabilir.
  • Search Console mülklerini karıştırabilir.
  • Yayınlama sürecini yavaşlatabilir.

Profesyonel entegrasyonda:

  • Desteklenen içerik türleri filtrelenir.
  • Bildirimler kuyruğa alınır.
  • Tekrarlanan istekler engellenir.
  • Kota kullanımı kaydedilir.
  • Geçici hatalar yeniden denenir.
  • Kalıcı hatalar yöneticilere bildirilir.
  • Anahtarlar güvenli saklanır.
  • Yapılandırılmış veri doğrulanır.
  • Search Console verileri ayrıca takip edilir.

API entegrasyonu, kapsamlı teknik SEO stratejisinin küçük bir bölümüdür. Site kalitesi, taranabilirlik ve içerik değeri göz ardı edilmemelidir.

Google Indexing API, desteklenen iş ilanı ve canlı yayın sayfalarındaki ekleme, güncelleme ve kaldırma işlemlerini Google’a bildirmek için kullanılan bir API hizmetidir.

Kurulum için:

  • Google Cloud projesi oluşturulmalı,
  • Indexing API etkinleştirilmeli,
  • Servis hesabı hazırlanmalı,
  • JSON anahtar dosyası güvenli saklanmalı,
  • Servis hesabı Search Console mülküne sahip olarak eklenmeli,
  • OAuth 2.0 yetkilendirmesi uygulanmalı,
  • Python veya WordPress üzerinden bildirim gönderilmelidir.

Yeni veya güncellenmiş sayfalarda URL_UPDATED, kaldırılan sayfalarda ise gerekli HTTP veya noindex işlemi tamamlandıktan sonra URL_DELETED kullanılmalıdır.

Başarılı API yanıtı dizine ekleme garantisi vermez. URL’nin Google tarafından dizine eklenebilmesi için teknik olarak erişilebilir, kaliteli, canonical açısından tutarlı ve geçerli yapılandırılmış veriye sahip olması gerekir.

Normal blog, ürün, kategori ve hizmet sayfalarında Indexing API yerine site haritaları, Search Console, taranabilir dahili bağlantılar ve doğru teknik SEO uygulamaları kullanılmalıdır.

Doğru kapsamda ve güvenli biçimde kurulan Google Indexing API entegrasyonu, özellikle çok sayıda kısa süreli iş ilanı veya canlı yayın sayfası yöneten platformlarda güncellemelerin Google’a sistemli biçimde bildirilmesine yardımcı olabilir.

Yorum yazın

E-posta adresiniz yayınlanmaz. Gerekli alanlar işaretlendi.