Birçok geliştirici SEO’yu hep sonradan eklenen bir şey olarak görüyor. Ancak 2024 yılında, içerik zekasını otomatik hale getiren ekiplerin, bunu yapmayanlara göre arama sonuçlarında daha iyi performans gösterdiği net bir şekilde ortaya çıkıyor.
<p>Bu makale, blog yazıları yazmak için ChatGPT kullanmak üzerine değil. Amaç, anahtar kelime araştırması, içerik boşluk analizi, meta üretimi ve iç bağlantılar konularında gerçek verileri kullanarak programatik bir otomatik süreç kurmak.</p>
<h2>
<a name="why-automate-content-strategy" href="#why-automate-content-strategy">
</a>
Neden İçerik Stratejisini Otomatikleştirmeliyiz?
</h2>
<p>Geniş ölçekteki içerik stratejileri tekrarlayıcı zihinsel çalışmayı içerir: anahtar kelime verilerinin çekilmesi, amaca göre gruplama, rakiplerin sıralaması kontrol edilmesi, şemalar oluşturma, 200 sayfa için meta açıklamaları yazma. Bu görevler, paralelleşebilir ve örüntü odaklıdır; bu da onları otomasyon için mükemmel adaylar yapar.</p>
<p>Amacımız insan yargısını ortadan kaldırmak değil. Temel mekanik işlemlerin %80'ini hallederek ekibinizin, gerçek uzmanlık gerektiren %20'ye odaklanmasını sağlamak.</p>
<h2>
<a name="building-the-pipeline" href="#building-the-pipeline">
</a>
Otomatik Boru Hattının Kurulması
</h2>
<p>Uygulayıp inceleyeceğimiz mimari şöyle olacak:</p>
<ol>
<li><strong>Anahtar Kelime Alımı</strong> — Bir API’den arama verilerini çekmek (Google Search Console veya DataForSEO)</li>
<li><strong>Niyet Sınıflandırması</strong> — Anahtar kelimeleri arama niyetine göre sınıflandırmak için OpenAI kullanmak</li>
<li><strong>İçerik Boşluk Analizi</strong> — Mevcut içeriği hedef anahtar kelimelerle karşılaştırmak</li>
<li><strong>Otomatik Meta Üretimi</strong> — SEO optimizasyonu için başlıklar ve açıklamalar üretmek</li>
<li><strong>İç Bağlantı Önerileri</strong> — İlgili iç bağlantı fırsatlarını ortaya çıkarmak</li>
</ol>
<h3>
<a name="step-1-keyword-ingestion-with-dataforseo" href="#step-1-keyword-ingestion-with-dataforseo">
</a>
Adım 1: DataForSEO ile Anahtar Kelime Alımı
</h3>
<p>Öncelikle anahtar kelime verilerini çekelim. DataForSEO’nun Laravel için uygun bir REST API’si var:</p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="c1">// app/Services/KeywordResearchService.php</span>namespace App\Services;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Collection;
class KeywordResearchService
{
private string $baseUrl = ‘https://api.dataforseo.com/v3‘;
<span class="k">public</span> <span class="k">function</span> <span class="n">getSeedKeywords</span><span class="p">(</span><span class="kt">string</span> <span class="nv">$domain</span><span class="p">,</span> <span class="kt">string</span> <span class="nv">$country</span> <span class="o">=</span> <span class="s1>'ae'</span><span class="p">):</span> <span class="kt">Collection</span>
<span class="p">{</span>
<span class="nv">$response</span> <span class="o">=</span> <span class="nc">Http</span><span class="o">::</span><span class="nf">withBasicAuth</span><span class="p">(</span>
<span class="nf">config</span><span class="p">(</span><span class="s1>'services.dataforseo.login'</span><span class="p">),</span>
<span class="nf">config</span><span class="p">(</span><span class="s1>'services.dataforseo.password'</span><span class="p">)</span>
<span class="p">)</span><span class="o">-></span><span class="nf">post</span><span class="p">(</span><span class="s2">"</span><span class="si">{</span><span class="nv">$this</span><span class="o">-></span><span class="n">baseUrl</span><span class="si">}</span><span class="s2>/keywords_data/google_ads/keywords_for_site/live"</span><span class="p">,</span> <span class="p">[</span>
<span class="p">[</span>
<span class="s1">'target'</span> <span class="o">=></span> <span class="nv">$domain</span><span class="p">,</span>
<span class="s1">'location_code'</span> <span class="o">=></span> <span class="mi">2784</span><span class="p">,</span> <span class="c1">// BAE</span>
<span class="s1">'language_code'</span> <span class="o">=></span> <span class="s1>'en'</span><span class="p">,</span>
<span class="s1">'include_serp_info'</span> <span class="o">=></span> <span class="kc">true</span><span class="p">,</span>
<span class="p">]</span>
<span class="p">]);</span>
<span class="k">return</span> <span class="nf">collect</span><span class="p">(</span><span class="nv">$response</span><span class="o">-></span><span class="nf">json</span><span class="p">(</span><span class="s1>'tasks.0.result'</span><span class="p">))</span>
<span class="o">-></span><span class="nf">map</span><span class="p">(</span><span class="k">fn</span><span class="p">(</span><span class="nv">$item</span><span class="p">)</span> <span class="o">=></span> <span class="p">[</span>
<span class="s1>'keyword'</span> <span class="o">=></span> <span class="nv">$item</span><span class="p>[</span><span class="s1>'keyword'</span><span class="p">],</span>
<span class="s1>'volume'</span> <span class="o">=></span> <span class="nv">$item</span><span class="p>[</span><span class="s1>'search_volume'</span><span class="p">],</span>
<span class="s1>'difficulty'</span> <span class="o">=></span> <span class="nv">$item</span><span class="p>[</span><span class="s1>'keyword_difficulty'</span><span class="p">]</span> <span class="o">??</span> <span class="kc">null</span><span class="p">,</span>
<span class="s1>'cpc'</span> <span class="o">=></span> <span class="nv">$item</span><span class="p>[</span><span class="s1>'cpc'</span><span class="p">]</span> <span class="o">??</span> <span class="mi">0</span><span class="p">,</span>
<span class="p">])</span>
<span class="o">-></span><span class="nf">filter</span><span class="p">(</span><span class="k">fn</span><span class="p">(</span><span class="nv">$item</span><span class="p">)</span> <span class="o">=></span> <span class="nv">$item</span><span class="p>[</span><span class="s1>'volume'</span><span class="p">]</span> <span class="o">>=</span> <span class="mi">50</span><span class="p">);</span>
<span class="p">}</span>}
<h3>
<a name="step-2-intent-classification-with-openai" href="#step-2-intent-classification-with-openai">
</a>
Adım 2: Niyet Sınıflandırması OpenAI ile
</h3>
<p>Ham anahtar kelime listeleri gürültüdür. Birinin neden arama yaptığını anlamalıyız: bilgi amaçlı, navigasyonel, ticari veya işlemelidir. Maliyet etkinliği için yapılandırılmış bir istem kullanarak GPT-4o-mini’den faydalanalım:</p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="c1">// app/Jobs/ClassifyKeywordIntentJob.php</span>namespace App\Jobs;
use App\Models\Keyword;
use Illuminate\Bus\Batchable;
use Illuminate\Contracts\Queue\ShouldQueue;
use OpenAI\Laravel\Facades\OpenAI;
class ClassifyKeywordIntentJob implements ShouldQueue
{
use Batchable;
<span class="k">public</span> <span class="k">function</span> <span class="n">__construct</span><span class="p">(</span><span class="k">private</span> <span class="kt">array</span> <span class="nv">$keywords</span><span class="p">)</span> <span class="p">{}</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">handle</span><span class="p">():</span> <span class="kt">void</span>
<span class="p">{</span>
<span class="nv">$keywordList</span> <span class="o">=</span> <span class="nb">implode</span><span class="p">(</span><span class="s1>'\n'</span><span class="p">,</span> <span class="nb">array_column</span><span class="p">(</span><span class="nv>$this</span><span class="o">-></span><span class="n">keywords</span><span class="p">,</span> <span class="s1>'keyword'</span><span class="p">));</span>
<span class="nv">$response</span> <span class="o">=</span> <span class="nc">OpenAI</span><span class="o">::</span><span class="nf">chat</span><span class="p">()</span><span class="o">-></span><span class="nf">create</span><span class="p">([</span>
<span class="s1>'model'</span> <span class="o">=></span> <span class="s1>'gpt-4o-mini'</span><span class="p">,</span>
<span class="s1>'messages'</span> <span class="o">=></span> <span class="p">[</span>
<span class="p">[</span>
<span class="s1>'role'</span> <span class="o">=></span> <span class="s1>'system'</span><span class="p">,</span>
<span class="s1>'content'</span> <span class="o">=></span> <span class="s1>'You are an SEO expert. Classify each keyword by search intent. Return JSON only.'</span>
<span class="p">],</span>
<span class="p">[</span>
<span class="s1>'role'</span> <span class="o">=></span> <span class="s1>'user'</span><span class="p">,</span>
<span class="s1>'content'</span> <span class="o">=></span> <span class="s2>'Classify these keywords. Return an array of objects with 'keyword' and 'intent' (informational|navigational|commercial|transactional):'</span><span class="se">\n\n</span><span class="si">{</span><span class="nv>$keywordList</span><span class="si">}</span><span class="s2>'</span>
<span class="p">]</span>
<span class="p">],</span>
<span class="s1>'response_format'</span> <span class="o">=></span> <span class="p">[</span><span class="s1>'type'</span> <span class="o">=></span> <span class="s1>'json_object'</span><span class="p">],</span>
<span class="p">]);</span>
<span class="nv>$classified</span> <span class="o">=</span> <span class="nb">json_decode</span><span class="p">(</span><span class="nv>$response</span><span class="o">-></span><span class="n">choices</span><span class="p>[</span><span class="mi'>0</span><span class="p">]</span><span class="o">-></span><span class="n">message</span><span class="o">-></span><span class="n">content</span><span class="p">,</span> <span class="kc'>true</span><span class="p">);</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv>$classified</span><span class="p>[</span><span class="s1>'keywords'</span><span class="p">] as</span> <span class="nv>$item</span><span class="p">)</span> <span class="p">{</span>
<span class="nc">Keyword</span><span class="o">::</span><span class="nf'>where'</span><span class="p">(</span><span class="s1>'keyword'</span><span class="p">,</span> <span class="nv>$item</span><span class="p>[</span><span class="s1>'keyword'</span><span class="p">])</span>
<span class="o'>-></span><span class='nf'>update</span>([<span class="s1">'intent'</span> <span class="o">=></span> <span class="nv>$item</span><span class="p">[</span><span class="s1>'intent'</span><span class="p">]]);</span>
<span class="p">}</span>
<span class="p">}</span>}


