kurumsal-hosting

İşletmeler İçin Dijital Güç: Kurumsal Hosting ile Web Performansınızı Zirveye Taşıyın

Dijitalleşmenin iş dünyasındaki etkisi her geçen gün daha da artarken, şirketlerin çevrimiçi varlıklarını sağlam temeller üzerine kurmaları hayati önem taşıyor. Bu noktada “kurumsal hosting” hizmetleri, sadece bir web sitesini barındırmakla kalmıyor; aynı zamanda güvenlik, hız, performans ve kesintisiz hizmet gibi unsurlarla markaların dijital başarısına yön veriyor. Gelişmiş sunucu teknolojileri ve yüksek performanslı altyapısıyla kurumsal hosting, özellikle ticari sitelerin ihtiyaç duyduğu profesyonel çözümler sunuyor.

Kurumsal hosting, kişisel ya da küçük ölçekli hosting çözümlerinin ötesine geçerek büyük veriyi yöneten, yüksek trafik alan veya birden fazla web sitesi barındıran kurumların gereksinimlerine özel olarak tasarlanır. Güvenilirlik, veri yedekleme, kesintisiz erişim ve teknik destek gibi başlıklar kurumsal hosting hizmetlerinin temelini oluştururken, güçlü donanım altyapısı sayesinde işletmelere ölçeklenebilir ve sürdürülebilir bir dijital ortam sağlar.

Peki, kurumsal hosting’i diğerlerinden ayıran avantajlar neler?

Yüksek Performans ve Hız

Kurumsal hosting paketleri genellikle yüksek işlemci gücü, RAM kapasitesi ve NVMe SSD disk teknolojisi ile donatılmış sunucular üzerinde barındırılır. Bu da web sitesinin yüklenme süresini önemli ölçüde kısaltır. Kullanıcı deneyiminin doğrudan etkilediği SEO sıralamaları için bu hız faktörü oldukça kritiktir. Ayrıca sitenizin açılış süresi ne kadar kısaysa, ziyaretçi dönüşüm oranları da o kadar yüksektir.

Veri Güvenliği ve Yedekleme Garantisi

Kurumlara özel hosting çözümleri, siber saldırılara ve veri kaybına karşı üst düzey koruma sağlar. Düzenli otomatik yedekleme sistemleri, olası bir veri kaybı durumunda verilerin kolayca geri yüklenmesini mümkün kılar. Güvenlik duvarı, anti-malware yazılımlar ve DDoS koruması gibi önlemler sayesinde verileriniz her zaman güvende tutulur.

Kesintisiz Uptime Garantisi

Kurumsal hosting hizmetlerinde uptime süresi genellikle %99,9 gibi yüksek oranlarla garanti altına alınır. Bu da demektir ki siteniz neredeyse hiç kesintiye uğramadan yayında kalır. E-ticaret siteleri, haber portalları, kamuya açık duyuru platformları gibi sürekli erişilebilir olması gereken yapılar için bu özellik vazgeçilmezdir.

Sınırsız Trafik ve Ölçeklenebilirlik

Kurumsal hosting planları çoğu zaman sınırsız trafik desteği sunar. Bu da yüksek ziyaretçi sayılarına ulaştığınız dönemlerde bile sitenizin yavaşlamadan çalışmasına olanak tanır. Aynı zamanda kaynaklar artırılabilir veya düşürülebilir yapıdadır, bu da özellikle dönemsel trafik yoğunluğu yaşayan firmalar için esnek bir çözüm sunar.

Teknik Destek ve Profesyonel Hizmet

Kurumsal hosting sağlayıcıları, müşterilerine genellikle 7/24 teknik destek hizmeti sunar. Uzman ekipler tarafından sunulan bu destek sayesinde, yaşanabilecek sorunlar kısa sürede çözüme kavuşturulur. Ayrıca ücretsiz site taşıma, sunucu yönetimi ve kontrol panel desteği gibi hizmetler de çoğu zaman pakete dahildir.

Hedef Kitlesine Güçlü Bir Dijital Altyapı Sunmak İsteyen Markaların Tercihi

Kurumsal hosting yalnızca teknik avantajlarla sınırlı değildir; aynı zamanda bir markanın dijital vitrini olan web sitesinin güvenilirliğini ve profesyonelliğini doğrudan etkiler. Web sitesi üzerinden hizmet veren firmalar, online ödeme sistemleri kullanan işletmeler ya da sürekli içerik güncelleyen medya şirketleri için kurumsal hosting vazgeçilmez bir ihtiyaçtır.

Hangi İşletmeler Kurumsal Hosting’e Yatırım Yapmalı?

  • E-ticaret Siteleri
    Yoğun trafiğe sahip e-ticaret platformları, anlık veri işleme ve güvenli ödeme sistemleri için yüksek performanslı hosting çözümlerine ihtiyaç duyar. Kurumsal hosting, bu ihtiyacı kesintisiz karşılayarak alışveriş deneyimini iyileştirir.

  • Ajanslar ve Yazılım Firmaları
    Aynı anda birçok müşteri sitesi yöneten ajanslar için kurumsal hosting, birden fazla web sitesini güvenle barındırma imkanı sunar. Hız, güvenlik ve kaynak yönetimi açısından büyük avantaj sağlar.

  • Kurumsal Şirketler ve Holdingler
    Birden çok alt markaya sahip olan büyük ölçekli şirketler, merkezi bir sunucu üzerinden tüm dijital varlıklarını kontrol etmek ister. Kurumsal hosting, bu yapıyı düzenli ve verimli bir şekilde yönetmeye yardımcı olur.

  • Blog ve Haber Portalları
    Günlük binlerce ziyaretçi alan içerik odaklı platformlar için yüksek erişim hızına sahip hosting planları gereklidir. Aksi takdirde site yavaşlar, ziyaretçi kaybı yaşanır. Kurumsal hosting, bu gibi yayıncılar için istikrar sağlar.

  • Eğitim Kurumları ve Online Eğitim Platformları
    Video, görsel, canlı yayın ve interaktif içerikler gibi yoğun kaynak tüketen sistemlerin barındırılması için güçlü hosting altyapısı gerekir. Kurumsal hosting, eğitim sektörü için bu ihtiyacı karşılayan en doğru tercihlerden biridir.

Kurumsal Hosting ile Geleceğe Hazırlanın

İşletmelerin dijital dünyadaki başarısı, teknik altyapılarının sağlamlığıyla doğru orantılıdır. Web sitesi, artık yalnızca bir iletişim aracı değil; aynı zamanda güven, kalite ve prestij sembolüdür. Bu yüzden kurumsal hosting, sadece bir hizmet değil, aynı zamanda dijital geleceğinize yapılan uzun vadeli bir yatırımdır.

Verimlilik, güvenlik ve performans odağında hizmet veren kurumsal hosting sağlayıcıları, işletmelerin teknolojik dönüşüm sürecinde önemli bir role sahiptir. Hangi sektörde olursanız olun, güçlü bir altyapı ile fark yaratmak için kurumsal hosting çözümlerini değerlendirmelisiniz.

 

Google Sheets, GSC & ChatGPT API

Google Sheets, GSC & ChatGPT API – SEO Analizi

SEO analizi zaman alıcı olabilir, ancak sürecin otomatikleştirilmesi tekrarlayan görevlerin ortadan kaldırılmasına ve önemli web sitesi optimizasyonlarının hızlandırılmasına yardımcı olur.

Bu kılavuz, SEO denetimlerini kolaylaştırmak ve yapay zeka destekli içgörüler elde etmek için Google E-Tablolar, Google Search Console (GSC) ve ChatGPT API’sini kullanarak özel bir aracın nasıl oluşturulacağını gösterecektir .

Bu araçla şunları yapabileceksiniz:

  • Daha hızlı analiz için GSC veri alımını otomatikleştirin.
  • Eyleme dönüştürülebilir SEO önerileri oluşturmak için yapay zekayı kullanın.

GSC’ye bağlı bir etki alanından bir URL seçeceksiniz, ChatGPT API anahtarınızı gireceksiniz, sayfayı inceleyeceksiniz ve yapay zeka destekli bir analiz çalıştıracaksınız; tüm bunları Google E-Tablolar içinde yapacaksınız.

Hangi SEO analizlerini otomatize ediyoruz?

Bu araç kurulduktan sonra, GSC’den anahtar kelime sıralamaları, yönlendiren URL’ler, son tarama tarihi ve robots.txt dosyasındaki dizinleme durumu dahil olmak üzere önemli SEO verilerine hızlı bir şekilde erişmenizi sağlayacaktır.

ChatGPT, şu konularda analizler yaparak ve öneriler sunarak süreci iyileştirir:

  • Başlık etiketleri .
  • Meta açıklamaları .
  • Başlık etiketleri.
  • İçerik.
  • Anahtar kelime yerleşimi.
  • İç bağlantı .
  • Mobil optimizasyon.
  • Yerel SEO.
  • Şema işaretlemesi.

Bu komut dosyası her şeyi kapsamasa da saniyeler içinde ayrıntılı sayfa içgörüleri sunarak saatlerce manuel çalışma yapmanıza gerek kalmaz.

Daha sonra önerileri inceleyip hangi iyileştirmeleri uygulayacağınıza karar verebilirsiniz.

Kendi GSC özel aracınızı ve betiğinizi kurmak için 8 adım

Senaryonuzu kurmak ilk başta bunaltıcı gelebilir, ancak her adımı dikkatlice takip edin ve her şeyin çalıştığından emin olmak için senaryoyu kopyalayın.

Başlamak için birkaç şeye ihtiyacınız olacak:

Şimdi, bu “aracı” çalışır hale getirmek için sekiz adımlı sürecimde size rehberlik edeceğim.

Adım 1: Aracınız için Google E-Tablosu oluşturun

Eğer bir Google hesabınız varsa, bu işlemi şu adımları izleyerek yapabilirsiniz:

  • Google Drive’ı açın.
  • Aracınızı yerleştirmek istediğiniz klasöre gidin.
  • Arkaplana sağ tıklayın .
  • Google E-Tablolar > Boş elektronik tablo öğesini seçin .

Sayfanın adını istediğiniz gibi değiştirebilirsiniz, ancak ben şunu seçtim: GSC Özel Aracı.

Adım 2: Sayfanızı doldurun

Aşağıdaki adımları dikkatlice izleyerek sayfayı doldurun:

  • “GSC özelliğini seç” ifadesini ekleyin A1.
  • “URL Seçin” ifadesini ekleyin A2.

“Denetim Sonuçları” na geçin A15ve ekleyin. Bunun altına, sırasıyla A15A25aşağıdakileri ekleyin:

  • Bağlantı adresi:
  • Kapsam:
  • Robotlar.txt:
  • Dizinleme Durumu:
  • Son Tarama:
  • Google Kanonik:
  • Kullanıcı Kanonik:
  • Mobil Kullanılabilirlik:
  • Zengin Sonuçlar Uygunluğu:
  • Yönlendiren URL’ler:

D1, ChatGPT API anahtarınızı yapıştıracaksınız . Bu anahtarınız yoksa lütfen yukarıdaki bağlantıya gidin ve bu aracın çalışması için bir tane aldığınızdan emin olun.

“AI Analiz Sonucu”nu F1ve “İstem ChatGPT’ye Gönderildi”yi ekleyin G1.

Şimdi, bu iki sütundaki birkaç satırı birleştirmemiz gerekiyor. Aşağıdaki adımları izleyerek birleştireceksiniz F2– F30ve G2G30

  • Birleştirilecek satırları seçin.
  • Biçim > Hücreleri birleştir > Dikey olarak birleştir seçeneğine gidin .

Birleştirmeniz gereken F ve G satırları için bu adımı tekrarlayın.

Adım 3: Bir Google Cloud projesi oluşturun

Araç için  bir Google Cloud Console veri projesi oluşturun .

Kurulum tamamlandıktan sonra “GSC Özel Aracı” adında yeni bir proje oluşturun.

Bunu , Proje Seç > Yeni Proje’ye giderek ve yukarıdaki ekran görüntüsünde olduğu gibi bilgileri doldurarak  yapabilirsiniz .

Projeye isim vermeyi tamamladığınızda Oluştur’a tıklayın .

Şimdi Google Search Console API’sini projenize bağlayalım.

Arama çubuğuna gidin ve “Google Search Console API” yazın, seçin ve sonraki ekranda Etkinleştir’e tıklayın.

Hala yapmamız gereken çok şey var ve bu projeyi en kısa zamanda yeniden ele alacağız.

Adım 4: Erişim kimlik bilgilerini ekleyin

Daha fazla ayarlama yapmak için Google Cloud Console’unuza dönün.

Ekranın sol tarafındaki Kimlik Bilgileri’ne tıklayın :

Ekranın üst kısmındaki + Kimlik Bilgilerini Oluştur’a tıklayın ve OAuth istemci kimliğini seçin .

Configure Consent Screen’e gidin ve External’i seçin . Ekranı oluşturun ve ardından şunları girin:

  • Uygulama adı.
  • Destek e-postası (GSC hesabına bağlı).
  • Geliştiricinin iletişim bilgileri.

Kaydedin ve Add or Remove Scopes yazan bir sonraki ekrana geçin .

Google Search Console API kapsamlarını seçin ve güncelleyin. Ardından, Kaydet ve devam et .

Erişim izni vermek istediğiniz kullanıcıları ekleyin ve ardından Kaydet ve devam et’e tıklayın .

Adım 5: GSC verileri için bir Google Cloud projesine geçin

Hamburger simgesine tıklayın ve Bulut genel görünümü > Gösterge Tablosu’na gidin .

Sayfada bulunan Proje numaranızı kopyalamak istiyorsunuz .

Proje numarasına gidin, seçin ve CTRL + C kullanarak kopyalayın.

Google E-Tablolar dosyanıza gidin ve Proje Ayarları yazan dişli simgesine tıklayın .

Proje numaranızı metin kutusuna yapıştırın ve Projeyi ayarla’ya tıklayın .

Adım 6: Google Apps Komut Dosyanıza Gidin

Şimdi Proje Ayarlarınıza geri dönecek ve düzenleyicide  “appsscript.json” dosyasını göster’e tıklayacaksınız.

Editörün içinde appsscript.json dosyasına gidin ve dosyadaki her şeyi aşağıdaki kodla değiştirin:

{
  "timeZone": "America/New_York",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": [
    "https://www.googleapis.com/auth/webmasters",
    "https://www.googleapis.com/auth/webmasters.readonly",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/spreadsheets.currentonly"
  ],
  "runtimeVersion": "V8"
}

Her şeyi yapıştırdıktan sonra Code.js dosyasına gidip şu kodu yapıştıracaksınız:

// Store the OAuth token and logs in script properties

const scriptProperties = PropertiesService.getScriptProperties();
const OPENAI_URL = “https://api.openai.com/v1/chat/completions”;
const SYSTEM_MESSAGE = { role: “system”, content: “You are a helpful SEO expert.” };
function log(message) {
Logger.log(message); // Regular Apps Script logging
constlogs = scriptProperties.getProperty(‘customLogs’) || ”;
scriptProperties.setProperty(‘customLogs’, logs + ‘\n’ + message); // Append message to logs
}
function resetLogs() {
scriptProperties.deleteProperty(‘customLogs’); // Clear logs for a new execution
}
function getLogs() {
returnscriptProperties.getProperty(‘customLogs’) || ‘No logs available.’;
}
function fetchOAuthToken() {
lettoken = scriptProperties.getProperty(‘oauthToken’);
if (!token) {
token = ScriptApp.getOAuthToken();
scriptProperties.setProperty(‘oauthToken’, token);
log(‘OAuth token fetched and stored.’);
}
returntoken;
}
function onOpen() {
constui = SpreadsheetApp.getUi();
ui.createMenu(‘Search Console’)
.addItem(‘Authorize GSC’, ‘promptReauthorization’)
.addItem(‘Fetch GSC Properties’, ‘fetchGSCProperties’)
.addItem(‘Select URL’, ‘fetchUrlsForSelectedProperty’)
.addItem(‘Fetch Keywords’, ‘fetchKeywordsForSelectedUrl’) // Yeni menü ekleme
.addItem(‘Inspect URL’, ‘inspectUrl’)
.addItem(‘AI Analyze’, ‘aiAnalyze’)
.addToUi();
}
function fetchKeywordsForSelectedUrl() {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
constselectedProperty = sheet.getRange(‘B1’).getValue();
constselectedUrl = sheet.getRange(‘B2’).getValue();
if (!selectedProperty || selectedProperty === ‘Select a property’ || !selectedUrl || selectedUrl === ‘Select a URL’) {
SpreadsheetApp.getUi().alert(‘Please select a valid property and URL before fetching keywords.’);
return;
}
constoauthToken = fetchOAuthToken();
constkeywords = getTopKeywordsForUrl(selectedProperty, selectedUrl, oauthToken);
if (!keywords || keywords.length === 0) {
sheet.getRange(‘A3’).setValue(‘No keywords found’).setFontWeight(‘bold’);
return;
}
sheet.getRange(‘A3:D12’).clearContent();
sheet.getRange(‘A3’).setValue(‘Keyword’).setFontWeight(‘bold’);
sheet.getRange(‘B3’).setValue(‘Clicks’).setFontWeight(‘bold’);
sheet.getRange(‘C3’).setValue(‘Impressions’).setFontWeight(‘bold’);
sheet.getRange(‘D3’).setValue(‘CTR’).setFontWeight(‘bold’);
keywords.forEach((keyword, index) => {
if (index < 10) {
sheet.getRange(`A${3 + index}`).setValue(keyword.query).setFontWeight(‘bold’);
sheet.getRange(`B${3 + index}`).setValue(keyword.clicks);
sheet.getRange(`C${3 + index}`).setValue(keyword.impressions);
sheet.getRange(`D${3 + index}`).setValue(keyword.ctr);
}
});
}
function fetchUrlsForSelectedProperty() {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
constselectedProperty = sheet.getRange(‘B1’).getValue();
if (!selectedProperty || selectedProperty === ‘Select a property’) {
SpreadsheetApp.getUi().alert(‘Please select a valid property before fetching URLs.’);
return;
}
constoauthToken = fetchOAuthToken();
consturls = getUrlsForProperty(selectedProperty, oauthToken);
if (!urls || urls.length === 0) {
sheet.getRange(‘A2’).setValue(‘No URLs found’).setFontWeight(‘bold’);
sheet.getRange(‘B2’).clearContent();
log(`No URLs found for property ${selectedProperty}`);
return;
}
sheet.getRange(‘A2’).setValue(‘Select a URL’).setFontWeight(‘bold’);
sheet.getRange(‘B2’).setDataValidation(
SpreadsheetApp.newDataValidation()
.requireValueInList([‘Select a URL’].concat(urls), true)
.build()
);
sheet.getRange(‘B2’).setValue(‘Select a URL’).setFontWeight(‘bold’);
}
function promptReauthorization() {
constui = SpreadsheetApp.getUi();
constresponse = ui.alert(
‘Re-authorize Script’,
‘Re-authorizing will revoke current permissions and require you to authorize again. Do you want to continue?’,
ui.ButtonSet.YES_NO
);
if (response === ui.Button.YES) {
try {
scriptProperties.deleteProperty(‘oauthToken’); // Clear old token
consttoken = fetchOAuthToken(); // Fetch and store new token
log(“OAuth Token: ” + token);
ui.alert(‘Authorization successful. No further action is required.’);
} catch (e) {
ui.alert(‘Authorization failed: ‘ + e.toString());
}
} else {
ui.alert(‘Re-authorization canceled.’);
}
}
function fetchGSCProperties() {
resetLogs();
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
constoauthToken = fetchOAuthToken();
constsites = getSitesListFromGSC(oauthToken);
if (!sites || sites.length === 0) {
SpreadsheetApp.getUi().alert(‘No GSC properties found. Please ensure you have access to GSC properties.’);
return;
}
constsiteUrls = [‘Select a property’].concat(
sites.map(site => site.siteUrl).sort()
);
sheet.getRange(‘A1’).setValue(‘Select GSC property’).setFontWeight(‘bold’);
sheet.getRange(‘B1’).setDataValidation(
SpreadsheetApp.newDataValidation()
.requireValueInList(siteUrls, true)
.build()
);
sheet.getRange(‘B1’).setValue(‘Select a property’).setFontWeight(‘bold’);
sheet.setColumnWidth(1, 150);
sheet.setColumnWidth(2, 350);
}
let isProcessing = false; // Global flag to prevent recursive triggering
function getApiRequestDetails(selectedProperty) {
constpayload = {
startDate: getThreeMonthsAgo(),
endDate: getToday(),
dimensions: [“page”],
rowLimit: 100,
orderBy: [{ fieldName: “clicks”, sortOrder: “DESCENDING” }]
};
constapiUrl = `https://www.googleapis.com/webmasters/v3/sites/${encodeURIComponent(selectedProperty)}/searchAnalytics/query`;
return { url: apiUrl, payload: payload };
}
function getSitesListFromGSC(oauthToken) {
try {
consturl = ‘https://www.googleapis.com/webmasters/v3/sites’;
constheaders = {
‘Authorization’: ‘Bearer ‘ + oauthToken,
‘Content-Type’: ‘application/json’
};
constoptions = {
method: ‘get’,
headers: headers,
muteHttpExceptions: true
};
constresponse = UrlFetchApp.fetch(url, options);
log(`Response Code: ${response.getResponseCode()}`);
log(`Response Content: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
constjson = JSON.parse(response.getContentText());
returnjson.siteEntry || [];
} else {
thrownewError(`Error fetching data: ${response.getResponseCode()} – ${response.getContentText()}`);
}
} catch (e) {
log(`Error: ${e.toString()}`);
return [];
}
}
function getUrlsForProperty(property, oauthToken) {
try {
constapiUrl = `https://www.googleapis.com/webmasters/v3/sites/${encodeURIComponent(property)}/searchAnalytics/query`;
log(`API URL: ${apiUrl}`);
log(`OAuth Token: ${oauthToken}`);
constpayload = {
startDate: getThreeMonthsAgo(),
endDate: getToday(),
dimensions: [“page”],
rowLimit: 100,
orderBy: [{ fieldName: “clicks”, sortOrder: “DESCENDING” }]
};
log(`Payload: ${JSON.stringify(payload)}`);
constheaders = {
Authorization: `Bearer ${oauthToken}`,
“Content-Type”: “application/json”
};
constoptions = {
method: “post”,
contentType: “application/json”,
headers: headers,
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
constresponse = UrlFetchApp.fetch(apiUrl, options);
log(`Response Code: ${response.getResponseCode()}`);
log(`Response: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
constjson = JSON.parse(response.getContentText());
returnjson.rows ? json.rows.map(row => row.keys[0]) : [];
} else {
thrownewError(`Failed to fetch data: ${response.getResponseCode()} – ${response.getContentText()}`);
}
} catch (e) {
log(`Error: ${e.toString()}`);
return [];
}
}
function getTopKeywordsForUrl(property, url, oauthToken) {
try {
constapiUrl = `https://www.googleapis.com/webmasters/v3/sites/${encodeURIComponent(property)}/searchAnalytics/query`;
log(`API URL: ${apiUrl}`);
log(`OAuth Token: ${oauthToken}`);
constpayload = {
startDate: getThreeMonthsAgo(),
endDate: getToday(),
dimensions: [“query”],
dimensionFilterGroups: [
{
filters: [
{
dimension: “page”,
operator: “equals”,
expression: url
}
]
}
],
rowLimit: 10,
orderBy: [{ fieldName: “clicks”, sortOrder: “DESCENDING” }]
};
log(`Payload: ${JSON.stringify(payload)}`);
constheaders = {
Authorization: `Bearer ${oauthToken}`,
“Content-Type”: “application/json”
};
constoptions = {
method: “post”,
contentType: “application/json”,
headers: headers,
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
constresponse = UrlFetchApp.fetch(apiUrl, options);
log(`Response Code: ${response.getResponseCode()}`);
log(`Response: ${response.getContentText()}`);
if (response.getResponseCode() === 200) {
constjson = JSON.parse(response.getContentText());
returnjson.rows ? json.rows.map(row => ({
query: row.keys[0],
clicks: row.clicks,
impressions: row.impressions,
ctr: row.ctr
})) : [];
} else {
thrownewError(`Failed to fetch data: ${response.getResponseCode()} – ${response.getContentText()}`);
}
} catch (e) {
log(`Error: ${e.toString()}`);
return [];
}
}
function getToday() {
consttoday = newDate();
returntoday.toISOString().split(“T”)[0];
}
function getThreeMonthsAgo() {
constdate = newDate();
date.setMonth(date.getMonth() – 3);
returndate.toISOString().split(“T”)[0];
}
function inspectUrl() {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
consturl = sheet.getRange(‘B2’).getValue();
constproperty = sheet.getRange(‘B1’).getValue();
// Clear previous inspection results in A15:D30
sheet.getRange(‘A15:D30’).clearContent();
sheet.getRange(‘A15’).setValue(‘Inspecting…’).setFontWeight(‘bold’);
if (!url || url === ‘Select a URL’) {
SpreadsheetApp.getUi().alert(‘Please select a valid URL in cell B2 before inspecting.’);
sheet.getRange(‘A15’).setValue(‘No URL selected’).setFontWeight(‘bold’);
return;
}
constoauthToken = fetchOAuthToken();
try {
constresult = callUrlInspectionApi(property, url, oauthToken);
// Extract fields from the response
constindexStatus = result.indexStatusResult || {};
constmobileUsability = result.mobileUsabilityResult || {};
constrichResults = result.richResultsInfo || {};
constreferringUrls = indexStatus.referringUrls?.join(‘, ‘) || ‘None’;
// Populate inspection results in the sheet
sheet.getRange(‘A15’).setValue(`Inspection Results`).setFontWeight(‘bold’);
sheet.getRange(‘A16’).setValue(`URL:`).setFontWeight(‘bold’);
sheet.getRange(‘B16’).setValue(url);
sheet.getRange(‘A17’).setValue(`Coverage:`).setFontWeight(‘bold’);
sheet.getRange(‘B17’).setValue(indexStatus.coverageState || ‘Unknown’);
sheet.getRange(‘A18’).setValue(`Robots.txt:`).setFontWeight(‘bold’);
sheet.getRange(‘B18’).setValue(indexStatus.robotsTxtState || ‘Unknown’);
sheet.getRange(‘A19’).setValue(`Indexing State:`).setFontWeight(‘bold’);
sheet.getRange(‘B19’).setValue(indexStatus.indexingState || ‘Unknown’);
sheet.getRange(‘A20’).setValue(`Last Crawled:`).setFontWeight(‘bold’);
sheet.getRange(‘B20’).setValue(indexStatus.lastCrawlTime || ‘Not Available’);
sheet.getRange(‘A21’).setValue(`Google Canonical:`).setFontWeight(‘bold’);
sheet.getRange(‘B21’).setValue(indexStatus.googleCanonical || ‘Unknown’);
sheet.getRange(‘A22’).setValue(`User Canonical:`).setFontWeight(‘bold’);
sheet.getRange(‘B22’).setValue(indexStatus.userCanonical || ‘Unknown’);
sheet.getRange(‘A23’).setValue(`Mobile Usability:`).setFontWeight(‘bold’);
sheet.getRange(‘B23’).setValue(mobileUsability.verdict || ‘Unknown’);
sheet.getRange(‘A24’).setValue(`Rich Results Eligibility:`).setFontWeight(‘bold’);
sheet.getRange(‘B24’).setValue(richResults.verdict || ‘Unknown’);
sheet.getRange(‘A25’).setValue(`Referring URLs:`).setFontWeight(‘bold’);
sheet.getRange(‘B25’).setValue(referringUrls);
// Log and alert full response for debugging
constfullResponse = JSON.stringify(result, null, 2);
log(`Full Inspection Result: ${fullResponse}`);
//SpreadsheetApp.getUi().alert(`Inspection Completed. Full Response:\n\n${fullResponse}`);
} catch (error) {
sheet.getRange(‘A15’).setValue(‘Inspection Failed’).setFontWeight(‘bold’);
log(`Error inspecting URL: ${error.message}`);
SpreadsheetApp.getUi().alert(`Error inspecting URL: ${error.message}\n\nLogs:\n${getLogs()}`);
}
}
function callUrlInspectionApi(property, url, oauthToken) {
constapiUrl = ‘https://searchconsole.googleapis.com/v1/urlInspection/index:inspect’;
constpayload = {
siteUrl: property,
inspectionUrl: url,
languageCode: ‘en-US’
};
constheaders = {
Authorization: `Bearer ${oauthToken}`,
‘Content-Type’: ‘application/json’
};
constoptions = {
method: ‘post’,
contentType: ‘application/json’,
headers: headers,
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
log(`API URL: ${apiUrl}`);
log(`Payload: ${JSON.stringify(payload)}`);
try {
constresponse = UrlFetchApp.fetch(apiUrl, options);
constresponseCode = response.getResponseCode();
constresponseText = response.getContentText();
log(`Response Code: ${responseCode}`);
log(`Response Content: ${responseText}`);
if (responseCode === 200) {
constjsonResponse = JSON.parse(responseText);
if (jsonResponse && jsonResponse.inspectionResult) {
returnjsonResponse.inspectionResult;
} else {
log(`Unexpected API Response Structure: ${responseText}`);
thrownewError(‘Unexpected API response format. “inspectionResult” field is missing.’);
}
} else {
log(`Failed API Call: ${responseText}`);
thrownewError(`Failed to inspect URL. Response Code: ${responseCode}. Response: ${responseText}`);
}
} catch (error) {
log(`Error during API call: ${error}`);
thrownewError(`Error inspecting URL: ${error.message}`);
}
}
function callChatGPT(prompt, temperature = 0.9, maxTokens = 800, model = “gpt-3.5-turbo”) {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
constsecretKey = sheet.getRange(‘D1’).getValue().trim(); // Retrieve the OpenAI API key from D1
if (!secretKey) {
thrownewError(“API Key is missing in cell D1. Please provide a valid OpenAI API key.”);
}
constpayload = {
model: model,
messages: [
SYSTEM_MESSAGE,
{ role: “user”, content: prompt }
],
temperature: temperature,
max_tokens: maxTokens
};
constoptions = {
method: “POST”,
headers: {
“Content-Type”: “application/json”,
“Authorization”: “Bearer ” + secretKey
},
payload: JSON.stringify(payload)
};
try {
constresponse = UrlFetchApp.fetch(OPENAI_URL, options);
constresponseData = JSON.parse(response.getContentText());
if (responseData.choices && responseData.choices[0] && responseData.choices[0].message) {
returnresponseData.choices[0].message.content.trim();
} else {
log(“Unexpected response format from OpenAI: ” + JSON.stringify(responseData));
return”Sorry, I couldn’t process the request.”;
}
} catch (error) {
log(“Error calling OpenAI API: ” + error);
return”Sorry, there was an error processing your request.”;
}
}
function aiAnalyze() {
constsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
consturl = sheet.getRange(‘B2’).getValue();
constkeywords = sheet.getRange(‘A3:A12’).getValues().flat().filter(Boolean); // Get non-empty keywords
constinspectionData = sheet.getRange(‘A16:B20’).getValues();
// Validate input fields
if (!url || keywords.length === 0 || inspectionData.some(row => row.length < 2 || !row[0].trim() || !row[1].trim())) {
SpreadsheetApp.getUi().alert(“Ensure the following are filled before running AI Analyze:\n- URL in B2\n- Keywords in A3:A12\n- Inspection data in A16:B20”);
return;
}
// Prepare the prompt for ChatGPT
constprompt = `
Analyze this URL: ${url}
Also the view-source version from: ${url}
against these keywords: ${keywords.join(“, “)}
Considering the URL inspection data from Google Search Console:
${inspectionData.map(row => `${row[0]}: ${row[1]}`).join(“\n”)}
Suggest a short list of specific recommendations on how I can improve the page’s SEO. Make sure the recommendations include details such as change this to that, or add something, etc… Be concrete with SEO recommendations.
`;
// Display the prompt in G1
sheet.getRange(‘G1’).setValue(“Prompt Sent to ChatGPT”).setFontWeight(“bold”);
sheet.getRange(‘G2:G30’).clearContent(); // Clear previous content in column G
sheet.getRange(‘G2:G30’).merge(); // Merge cells G2:G30
sheet.getRange(‘G2’).setValue(prompt).setVerticalAlignment(“top”); // Add the prompt and align to top
sheet.setColumnWidth(7, 400); // Set column G width to 400px
// Call ChatGPT API
constanalysisResult = callChatGPT(prompt);
// Display the result in the spreadsheet (Column F)
sheet.getRange(‘F1’).setValue(“AI Analysis Result”).setFontWeight(“bold”);
sheet.getRange(‘F2:F30’).clearContent(); // Clear previous content
sheet.getRange(‘F2:F30’).merge(); // Merge the cells
sheet.getRange(‘F2’).setValue(analysisResult).setVerticalAlignment(“top”); // Add the AI result and align to top
sheet.setColumnWidth(6, 400); // Set column F width to 400px
// Log the response
log(“AI Analysis Completed: ” + analysisResult);
}
1719037803636

Yapay Zeka ile WordPress – Call Action

ChatGPT ile Teknik Geliştirme – Call Action

Son projelerimden birinde, WordPress siteleri için içeriklere dinamik olarak telefon bağlantısı ve pop-up form linki ekleyen bir fonksiyon geliştirdim.

📌 Telefon numarası ve form linki içeriğe ekleniyor ve kullanıcı bu linklere tıklayarak ya doğrudan arama yapabilir ya da pop-up formunu açabilir.

📌 Mesaj içeriğin sonuna ekleniyor.

📌 Sayfa başlığına özel bir mesaj oluşturuyor.

Kodun detaylarını ve SEO faydalarını inceleyin. Kendi projelerinizde nasıl kullanabileceğinizi değerlendirin!

Desteğe ihtiyaç duyarsanız DM’den yazabilirsiniz.

Kod: https://github.com

1716129464565

Yapay Zeka ile WordPress Geliştirme – Sayfalandırma

ChatGPT ile Teknik SEO Geliştirmeleri

WordPress kategori içeriklerinizde /page/2, /page/3 ve /page/4 gibi deva eden sayfalamalarda görünüyor ise, kopya riski var demektir.

📌 Arama motorları, aynı içeriği birden fazla URL’de bulduklarında bunu kopya içerik olarak değerlendirir.

📌 Aynı içeriği barındıran sayfaların çoğalması, bu bütçenin verimsiz kullanılmasına neden olabilir.

📌 Arama motorları, aynı içeriğe sahip farklı sayfalar arasında otoriteyi bölüştürebilir.

ChatGPT ile yazdığım kod sayesinde yalnızca kategori ilk sayfasındada içeriğin görünmesini sağlayabilirsiniz.

Kod:

global $wp_query;
$total_pages = $wp_query->max_num_pages;
$current_page = max( 1, get_query_var( ‘paged’ ) );
$term = get_queried_object();
if ( $term && $current_page == 1 ) {
echo ‘<div class=”container”>’ . term_description( $term->term_id, ‘product_cat’ ) . ‘</div>’;
}

1732047368096

Yapay Zeka ile WordPress Geliştirme – Ürün İsmi

ChatGPT ile Teknik SEO Geliştirmeleri

Woocemmerce sitenizde, ürün başlıklarını <h3> ile gösterilmesi arama motorlarının sayfanızı daha iyi anlamasına yardımcı olabilir.

📌Ürün başlıkları genellikle anahtar kelimeler içerir. Bu anahtar kelimeleri başlık etiketleri içinde kullanmak, arama motorlarına bu kelimelerin önemli olduğunu işaret eder ve ilgili aramalarda sayfanızın daha üst sıralarda görünmesine yardımcı olur.

ChatGPT ile yazdığım kodu content-product.php dosyasına ürün başlıklarını <h3> etiketi ile göstermek için ekleyebilirsiniz.

Kod:
<h3 class=”woocommerce_before_shop_loop_item_title”><?php echo get_the_title(); ?></h3>

1716046103308

Yapay Zeka ile WordPress Geliştirme – Ürün Varyasyonu

ChatGPT ile Teknik SEO Geliştirmeleri

WooCommerce kullanan e-ticaret sitelerinizde, ürün varyasyonlarının seçimine göre URL oluşması ve meta başlık, meta açıklamasının dinamik olarak güncellenmesi SEO açısından fayda sağlar.

ChatGPT ile yazdığım kod sayesinde ürün varyasyonları için aşağıdaki geliştirmeleri yapabilirsiniz.

📌 Varyasyonların benzersiz meta etiketlere sahip olması,

📌 Her varyasyon sayfasının canonical etiketinin esas sayfaya verilmesi,
(ana ürün sayfasının otoritesini artırır ve sıralamasını iyileştirir)

📌 Her varyasyonun ayrı ayrı izlenmesi ve analiz edilmesi,
(hangi varyasyonların daha iyi performans gösterdiğini belirler)

📌 Varyasyon seçildiğinde sayfa yeniden yüklenmeden açılır.

Kod erişebilirsiniz.


function add_custom_js() {<br />
?&gt;<br />
<script type="text/javascript">
        jQuery(document).ready(function($) {
            var $form = $('form.variations_form');</p>
<p>            // URL'deki parametreyi kontrol ederek varyasyonu seçin
            function selectVariationFromUrl() {
                var params = new URLSearchParams(window.location.search);
                params.forEach(function(value, key) {
                    var $select = $form.find('select[name="' + key + '"]');
                    if ($select.length > 0) {
                        $select.val(value).trigger('change');
                    }
                });
                $form.trigger('check_variations');
            }</p>
<p>            // Sayfa yüklendiğinde varyasyonu seçin
            selectVariationFromUrl();</p>
<p>            // Varyasyon değiştiğinde URL'yi, sayfa başlığını ve meta açıklamasını güncelleyin
            $form.on('change', 'select', function() {
                var params = [];
                var variationNames = [];</p>
<p>                $form.find('select').each(function() {
                    var attribute = $(this).attr('name');
                    var value = $(this).val();
                    if (value) {
                        params.push(attribute + '=' + value);
                        variationNames.push($(this).find('option:selected').text());
                    }
                });</p>
<p>                var newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + params.join('&');
                window.history.replaceState({ path: newUrl }, '', newUrl);</p>
<p>                // Sayfa başlığını ve meta açıklamasını güncelle
                if (variationNames.length > 0) {
                    var newTitle = document.title.split(' - ')[0] + ' - ' + variationNames.join(', ');
                    document.title = newTitle;</p>
<p>                    var metaDescription = document.querySelector('meta[name="description"]');
                    if (metaDescription) {
                        var newDescription = newTitle + ' - En iyi fiyatla pozitifpastacilik.com\'dan satın alın! Binlerce çeşit pasta malzemesi, ayağınıza gelsin!';
                        metaDescription.setAttribute('content', newDescription);
                    }
                }
            });
        });
    </script><br />
&lt;?php<br />
}<br />
add_action(&#8216;wp_footer&#8217;, &#8216;add_custom_js&#8217;);<br />
1719134667992

Yapay Zeka ile WordPress Geliştirme – Ürün Kategorisi

ChatGPT ile SEO Teknik Geliştirme – PLP Optimizasyon

WooCommerce ürün listeleme sayfasında, alt kategori veya üst kategoriyi listeleyerek kullanıcıların gezinmesini kolaylaştırabilirsiniz.

📌 Alt kategorilerin ve üst kategorin görsel olarak sunulması, kullanıcıların ilgilendikleri ürünlere daha hızlı ve kolay bir şekilde ulaşmalarını sağlar.

📌 İlgili içeriklere daha hızlı erişim sağlar ve hemen çıkma oranını azaltır.

📌 İç linkleme ile sitenizdeki bağlantı otoritesinin daha iyi dağılmasını sağlar.

ChatGPT ile yazdığım kod sayesinde site içi linkleme stratejinizin bir parçası olarak, hem kullanıcı deneyimini iyileştirebilir hem de arama motorlarının sitenizi daha iyi taramasını ve anlamasını sağlayabilirsiniz.

Kod erişim sağlayabilirsiniz.



function display_subcategories_or_parent_category() {
    if ( is_product_category() ) {
        $current_category = get_queried_object();
        $args = array(
            'child_of'     => $current_category->term_id,
            'taxonomy'     => 'product_cat',
            'hide_empty'   => false,
            'title_li'     => '',
            'orderby'      => 'name',
            'order'        => 'ASC'
        );
        
        $subcategories = get_categories( $args );

        echo '

‘; if ( ! empty( $subcategories ) ) { echo ‘

‘; } echo ‘

‘; } else { // Alt kategori yoksa üst kategoriyi listele $parent_category = get_term( $current_category->parent, ‘product_cat’ ); if ( $parent_category && ! is_wp_error( $parent_category ) ) { echo ‘

‘; echo ‘

‘; } } echo ‘

‘; } } add_action( ‘woocommerce_before_main_content’, ‘display_subcategories_or_parent_category’, 15 );

1732047368096

Yapay Zeka ile WordPress Site Geliştirme

Gelişen altyapıların yanı sıra, WordPress’in kullanım kolaylığı ve ücretsiz olması sayesinde popülerliği devam ediyor.

Projelerde kullanılan temalar ve sektörün gereksinimlerine bağlı olarak SEO ihtiyaçları farklılık gösterebilir.

Bu yaklaşımla, projemiz için ChatGPT ile ürettiğimiz kodların bazılarını sizinle paylaşıyorum.

PLP Optimizasyon
Product Title
Pagination
Product Attribute

Screen Shot 2024-12-05 at 01.28.33

Yapay Zeka ile Ticimax SEO Geliştirme

Yapay Zeka ile Ticimax SEO Geliştirme

Yıllar önce sektöre yazılımcı olarak başlamış olmanın en büyük avantajı, ChatGPT ile oluşturduğum kodu okuyup eksik parçaları bir araya getirebilmemdir.

Yakın zamanda woocemmerce kullanıcıları için yaptığım bir paylaşımda, kaynak dosyalarına erişimle İleri Düzey SEO geliştirmeleri yapılabileceğinden bahsetmiştim. Link : https://lnkd.in/grvThWCe

Rayzer Digital ekibi olarak, yalnızca WordPress altyapısını değil, SEO hizmeti verdiğimiz Ticimax altyapısına sahip aşağıdaki projemizde özel kod geliştirerek SEO çalışması sağladığımızı duyurmaktan mutluluk duyarım.

Kod’un işlevi;

📌 Belirlediğiniz kategoride, belirleyeceğiniz kategori, ürün v.b sayfalarınıza iç bağlantı sağlayabilirsiniz.

📌 İç bağlantı linkini arttırabilirsiniz.

 

CSS – Modüller -> Script Yönetimi – > Kategori Dosyası 


/* Ana slider konteyner */
.button-group {
    display: flex;
    justify-content: center; /* Masaüstünde ortalar */
    align-items: center;
    overflow-x: auto; /* Yatay kaydırmayı etkinleştir */
    scroll-snap-type: x mandatory; /* Scroll snapping özelliği */
    gap: 10px; /* Butonlar arasındaki boşluk */
    padding: 10px;
    background-color: #f9f9f9;
    border-bottom: 1px solid #ddd;
    scrollbar-width: none; /* Firefox için scrollbar gizle */
    touch-action: pan-x; /* Mobil cihazlarda yatay kaydırma */
}

.button-group::-webkit-scrollbar {
    display: none; /* Chrome, Safari için scrollbar gizle */
}

/* Slider butonları */
.button-group a {
    flex: 0 0 auto; /* Sabit genişlikte butonlar */
    padding: 10px 20px;
    font-size: 16px;
    text-decoration: none;
    color: #000;
    border: 1px solid #ccc;
    border-radius: 5px;
    background-color: #fff;
    scroll-snap-align: start; /* Scroll snapping noktası */
    transition: all 0.3s ease;
}

.button-group a:hover {
    background-color: #f0f0f0;
    border-color: #000;
}

/* Mobil uyumluluk */
@media screen and (max-width: 768px) {
    .button-group {
        justify-content: flex-start; /* Mobilde butonlar sola yaslanır */
    }

    .button-group a {
        font-size: 14px; /* Daha küçük yazı boyutu */
        padding: 8px 16px; /* Daha kompakt buton boyutu */
    }
}

 

JavaScript – Modüller -> Script Yönetimi – > Kategori Dosyası 


// Her sayfa için sabit 4 kategori eşlemesi
const categoryMapping = {
"erkek-spor-ayakkabi": [
{ name: "Erkek Ayakkabı", link: "/erkek-ayakkabi" },
{ name: "Erkek Bot", link: "/erkek-bot-ayakkabi-modelleri" },
{ name: "Erkek Sandalet & Terlik", link: "/erkek-sandalet-terlik-modelleri" },
{ name: "Sneaker Erkek Ayakkabı", link: "/sneaker-erkek-ayakkabi-modelleri" }
],
"erkek-ayakkabi": [
{ name: "Erkek Spor Ayakkabı", link: "/erkek-spor-ayakkabi" },
{ name: "Erkek Bot", link: "/erkek-bot-ayakkabi-modelleri" },
{ name: "Erkek Klasik Ayakkabı", link: "/erkek-klasik-ayakkabi" },
{ name: "Yazlık Erkek Ayakkabı", link: "/yazlik-erkek-ayakkabi" }
],
"erkek-bot-ayakkabi-modelleri": [
{ name: "Erkek Klasik Ayakkabı", link: "/erkek-klasik-ayakkabi" },
{ name: "Erkek Spor Ayakkabı", link: "/erkek-spor-ayakkabi" },
{ name: "Erkek Ayakkabı", link: "/erkek-ayakkabi" },
{ name: "Erkek Casual Ayakkabı", link: "/erkek-casual-ayakkabi" }
],
"sneaker-erkek-ayakkabi-modelleri": [
{ name: "Erkek Günlük Ayakkabı", link: "/erkek-gunluk-ayakkabi" },
{ name: "Yüksek Taban Erkek Ayakkabı", link: "/yuksek-taban-erkek-ayakkabi" },
{ name: "Erkek Spor Ayakkabı", link: "/erkek-spor-ayakkabi" },
{ name: "Erkek Ayakkabı", link: "/erkek-ayakkabi" }
]
};

// Bulunduğunuz sayfayı algılar
function getCurrentPage() {
    const path = window.location.pathname;
    return path.split("/").filter(Boolean).pop(); // URL'deki son parçayı alır
}

// İlgili kategorileri alır ve butonları oluşturur
function renderCategories() {
    const currentPage = getCurrentPage();
    const relatedCategories = categoryMapping[currentPage];

    if (!relatedCategories) return; // Sayfa eşleşmesi yoksa çık

    const container = document.getElementById("category-buttons");
    relatedCategories.forEach(category => {
        const link = document.createElement("a");
        link.href = category.link;
        link.textContent = category.name;
        container.appendChild(link);
    });
}

// Sayfa yüklendiğinde çalıştır
document.addEventListener("DOMContentLoaded", renderCategories);

HTML – Tasarım – Blok Yönetimi – Kategori – Yeni Blok Ekle 


<div class="button-group" id="category-buttons">
    <!-- Dinamik butonlar buraya eklenecek -->
</div>
Screen Shot 2024-08-08 at 11.45.46

Yapay Zeka Destekli Avukat SEO Projesi

Yapay Zeka Destekli Avukat SEO 

Site altyapısını SEO temelleriyle hazırladığım ve ardından tasarım geliştirmeleri ile süreci ileriye taşıdığım projenin başarısını sizinle paylaşmaktan gurur duyuyorum. Bu konuda bize güvenen Av. Tuğba Kopuz Şahin‘ne teşekkür ederim.

Sektörün zorluklarına rağmen, ChatGPT ile ürettiğimiz SEO odaklı içerikler ile başarı sağladık. Bu süreçte, Av. Tuğba Kopuz Şahin’in uzmanlığıyla EEAT kriterlerine uygun olacak düzeyde içeriklerimizi geliştirmesinde, önemli bir katkı sağladı.