Toplu ürün yükleme: CSV/Excel ve XML feed şablonları nasıl hazırlanır?

Toplu Ürün Yükleme için CSV/Excel ve XML Feed Şablonları Hazırlama

Toplu ürün yükleme işlemleri için CSV/Excel ve XML formatları yaygın olarak kullanılmaktadır. Aşağıda her bir format için hazırlık sürecini ve dikkat edilmesi gerekenleri bulabilirsiniz.

CSV/Excel Şablonu Hazırlama

  • Başlık Satırları: Ürün adı, fiyat, stok durumu, açıklama gibi bilgileri içeren başlıkları oluşturun.
  • Veri Biçimi: Açıklama veya ad gibi metin alanları için uygun uzunlukta veri kullanın.
  • Boş Alan Kontrolü: Gerekli alanların doldurulduğundan emin olun.
  • Dosya Kayıt: Dosyayı .csv formatında kaydedin.

XML Feed Şablonu Hazırlama

  • XML Yapısı: Düzgün bir hiyerarşi oluşturun; her ürün için etiketi kullanın.
  • Elementler: , <price>, <description> gibi gerekli elementleri ekleyin.</li> <li><strong>Veri Kontrolü:</strong> Elementlerin doğru şekilde kapandığından emin olun.</li> <li><strong>Dosya Kayıt:</strong> Dosyayı .xml formatında kaydedin.</li> </ul> <h2>Son Kontroller</h2> Toplu yükleme işlemine başlamadan önce aşağıdaki kontrolleri yapın: <ul> <li><strong>Veri Doğruluğu:</strong> Bilgilerin doğru ve güncel olduğunu kontrol edin.</li> <li><strong>Format Kontrolü:</strong> CSV/Excel ya da XML formatlarının kurallarına uyduğunuzdan emin olun.</li> <li><strong>Yedekleme:</strong> Yükleme öncesinde mevcut verilerin yedeğini alın.</li> </ul> Bu adımları takip ederek toplu ürün yükleme işlemlerini daha kolay ve verimli bir şekilde gerçekleştirebilirsiniz. </div> </div> <!-- QAPage Schema --> <script type="application/ld+json"> { "@context":"https://schema.org", "@type":"QAPage", "@id": "https://qna.com.tr/soru-cevap/toplu-urun-yukleme-csv-excel-ve-xml-feed-sablonlari-nasil-hazirlanir#qa", "mainEntity":{ "@type":"Question", "url": "https://qna.com.tr/soru-cevap/toplu-urun-yukleme-csv-excel-ve-xml-feed-sablonlari-nasil-hazirlanir", "name":"Toplu ürün yükleme: CSV\/Excel ve XML feed şablonları nasıl hazırlanır?", "text":"Toplu ürün yükleme: CSV\/Excel ve XML feed şablonları nasıl hazırlanır?", "answerCount": 1, "upvoteCount": 32, "datePublished": "2025-02-09T22:08:27+03:00", "author": { "@type": "Person", "name": "QNA", "url": "https://qna.com.tr" }, "acceptedAnswer":{ "@type":"Answer", "text":"<h2>Toplu Ürün Yükleme için CSV\/Excel ve XML Feed Şablonları Hazırlama<\/h2>\n\nToplu ürün yükleme işlemleri için CSV\/Excel ve XML formatları yaygın olarak kullanılmaktadır. Aşağıda her bir format için hazırlık sürecini ve dikkat edilmesi gerekenleri bulabilirsiniz.\n\n<h3>CSV\/Excel Şablonu Hazırlama<\/h3>\n\n<ul>\n <li><strong>Başlık Satırları:<\/strong> Ürün adı, fiyat, stok durumu, açıklama gibi bilgileri içeren başlıkları oluşturun.<\/li>\n <li><strong>Veri Biçimi:<\/strong> Açıklama veya ad gibi metin alanları için uygun uzunlukta veri kullanın.<\/li>\n <li><strong>Boş Alan Kontrolü:<\/strong> Gerekli alanların doldurulduğundan emin olun.<\/li>\n <li><strong>Dosya Kayıt:<\/strong> Dosyayı .csv formatında kaydedin.<\/li>\n<\/ul>\n\n<h3>XML Feed Şablonu Hazırlama<\/h3>\n\n<ul>\n <li><strong>XML Yapısı:<\/strong> Düzgün bir hiyerarşi oluşturun; her ürün için <product> etiketi kullanın.<\/li>\n <li><strong>Elementler:<\/strong> <title>, <price>, <description> gibi gerekli elementleri ekleyin.<\/li>\n <li><strong>Veri Kontrolü:<\/strong> Elementlerin doğru şekilde kapandığından emin olun.<\/li>\n <li><strong>Dosya Kayıt:<\/strong> Dosyayı .xml formatında kaydedin.<\/li>\n<\/ul>\n\n<h2>Son Kontroller<\/h2>\n\nToplu yükleme işlemine başlamadan önce aşağıdaki kontrolleri yapın:\n\n<ul>\n <li><strong>Veri Doğruluğu:<\/strong> Bilgilerin doğru ve güncel olduğunu kontrol edin.<\/li>\n <li><strong>Format Kontrolü:<\/strong> CSV\/Excel ya da XML formatlarının kurallarına uyduğunuzdan emin olun.<\/li>\n <li><strong>Yedekleme:<\/strong> Yükleme öncesinde mevcut verilerin yedeğini alın.<\/li>\n<\/ul>\n\nBu adımları takip ederek toplu ürün yükleme işlemlerini daha kolay ve verimli bir şekilde gerçekleştirebilirsiniz.", "image": "https://qna.com.tr/images/toplu-urun-yukleme-csv-excel-ve-xml-feed-sablonlari-nasil-hazirlanir.webp", "upvoteCount": 32, "url": "https://qna.com.tr/soru-cevap/toplu-urun-yukleme-csv-excel-ve-xml-feed-sablonlari-nasil-hazirlanir", "datePublished": "2025-11-25T10:58:02+03:00", "author": { "@type": "Person", "name": "QNA", "url": "https://qna.com.tr" } } } } { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Ana Sayfa", "item": "https://qna.com.tr" },{ "@type": "ListItem", "position": 2, "name": "E-Ticaret & Online Alışveriş", "item": "https://qna.com.tr/kategori/e-ticaret-online-alisveris" },{ "@type": "ListItem", "position": 3, "name": "Toplu ürün yükleme: CSV/Excel ve XML feed şablonları nasıl hazırlanır?", "item": "https://qna.com.tr/soru-cevap/toplu-urun-yukleme-csv-excel-ve-xml-feed-sablonlari-nasil-hazirlanir" }] } { "@context": "https://schema.org", "@type": "ImageObject", "url": "https://qna.com.tr/images/toplu-urun-yukleme-csv-excel-ve-xml-feed-sablonlari-nasil-hazirlanir.webp", "width": 1200, "height": 630 } </script> <br> <h1></h1> <div id="answers"> </div> <div style="padding:12px; border:1px dashed #ccc; border-radius:8px; margin-top:16px;"> Cevap yazmak için lütfen <button id="btnLogin" type="button">Giriş Yap</button>. </div> <script> // Gönder document.getElementById('a_send')?.addEventListener('click', async ()=>{ const body = document.getElementById('a_body').value.trim(); const r = await fetch('/api/answer_create.php', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({question_id: 50106, body_md: body}) }); const d = await r.json(); if (d.ok) location.reload(); else alert(d.error||'Hata'); }); // Düzenle document.querySelectorAll('.btn-edit').forEach(btn=>{ btn.addEventListener('click', async ()=>{ const aid = btn.dataset.id; const cur = btn.closest('.answer').querySelector('.body').innerText; const nv = prompt('Cevabı düzenle:', cur); if (nv===null) return; const r = await fetch('/api/answer_edit.php', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({answer_id: Number(aid), body_md: nv}) }); const d = await r.json(); if (d.ok) location.reload(); else alert(d.error||'Hata'); }); }); // Sil document.querySelectorAll('.btn-del').forEach(btn=>{ btn.addEventListener('click', async ()=>{ if (!confirm('Cevabı silmek istiyor musun?')) return; const aid = btn.dataset.id; const fd = new FormData(); fd.append('answer_id', aid); const r = await fetch('/api/answer_delete.php', { method:'POST', body: fd }); const d = await r.json(); if (d.ok) location.reload(); else alert(d.error||'Hata'); }); }); </script> <script> // Eğer modal fonksiyonu varsa (ör. openLogin), navigasyonu durdurup modal aç document.addEventListener('click', function (e) { const a = e.target.closest('#btnLogin'); if (!a) return; if (typeof window.openLogin === 'function') { e.preventDefault(); // sayfa değiştirme window.openLogin(); // modalı aç } }); </script> <br> <div class="card"> <img src="https://qna.com.tr/images/toplu-urun-yukleme-csv-excel-ve-xml-feed-sablonlari-nasil-hazirlanir.webp" width="100%" loading="lazy" alt="Toplu ürün yükleme: CSV/Excel ve XML feed şablonları nasıl hazırlanır?"> </div> <br> <button id="reportBtn" class="qna-btn qna-btn--ghost" type="button" aria-haspopup="dialog"> 🐞 Hata bildir </button> <dialog id="reportDialog" class="qna-report" aria-labelledby="reportTitle"> <div class="qna-card" role="document"> <header class="qna-card__header"> <div class="qna-card__title"> <span class="qna-badge">🐞</span> <h2 id="reportTitle">Hata bildir</h2> </div> <button type="button" id="reportClose" class="qna-btn qna-btn--icon" aria-label="Kapat"> <svg aria-hidden="true" width="18" height="18" viewBox="0 0 24 24"><path d="M6.4 5l12.6 12.6-1.4 1.4L5 6.4 6.4 5Zm12.6 1.4L6.4 19 5 17.6 17.6 5 19 6.4Z" fill="currentColor"/></svg> </button> </header> <form id="reportForm" class="qna-form" method="post" novalidate> <div class="qna-field"> <label for="r-type">Hata türü</label> <select id="r-type" name="type" required> <option value="" disabled selected>Hata Seçin…</option> <option value="wrong_answer">Cevap Yanlış</option> <option value="wrong_question">Soru Yanlış</option> <option value="outdated">Güncel Değil</option> <option value="wrong_category">Yanlış Kategori</option> <option value="abusive">Uygunsuz içerik (hakaret/nefret/yetişkin)</option> <option value="spam">Spam / Reklam</option> <option value="copyright">Telif / Kopya içerik</option> <option value="broken">Bozuk bağlantı / Teknik sorun</option> <option value="other">Diğer</option> </select> </div> <div class="qna-field"> <label for="r-details">Açıklama</label> <textarea id="r-details" name="details" required minlength="10" maxlength="1000" placeholder="Ne yanlış? Doğrusu nedir? Varsa bağlantı ekleyin."></textarea> </div> <div class="qna-field"> <label for="r-email">E-posta (isteğe bağlı)</label> <input id="r-email" type="email" name="email" inputmode="email" placeholder="ornek@domeyn.com"> </div> <input type="hidden" name="qid" value="50106"> <input type="hidden" name="qslug" value=""> <input type="hidden" name="page_url" value=""> <input type="hidden" name="csrf" value=""> <input type="text" name="website" tabindex="-1" autocomplete="off" class="qna-hp"> <footer class="qna-card__footer"> <button type="submit" class="qna-btn qna-btn--primary">Gönder</button> <button type="button" class="qna-btn qna-btn--soft" id="reportCancel">Vazgeç</button> <p id="reportMsg" class="qna-alert" role="status" aria-live="polite" hidden></p> </footer> </form> </div> </dialog> <script defer> (() => { const btn = document.getElementById('reportBtn'); const dlg = document.getElementById('reportDialog'); const form = document.getElementById('reportForm'); const closeBtn = document.getElementById('reportClose'); const cancelBtn = document.getElementById('reportCancel'); const msg = document.getElementById('reportMsg'); if (!btn || !dlg || !form) { console.warn('[report] Gerekli elemanlar bulunamadı'); return; } // Sayfa URL'sini otomatik doldur if (form.elements.page_url) form.elements.page_url.value = location.href; const open = () => dlg.showModal(); const close = () => dlg.close(); btn.addEventListener('click', open); closeBtn?.addEventListener('click', close); cancelBtn?.addEventListener('click', close); dlg.addEventListener('cancel', (e)=>{ e.preventDefault(); close(); }); // Esc form.addEventListener('submit', async (e) => { e.preventDefault(); // HTML5 doğrulama if (!form.reportValidity()) return; msg.hidden = true; const okBtn = form.querySelector('button[type="submit"]'); const label = okBtn.textContent; okBtn.disabled = true; okBtn.textContent = 'Gönderiliyor…'; try { const fd = new FormData(form); const res = await fetch('/api/report-issue.php', { method: 'POST', body: fd, credentials: 'same-origin' }); let data = {}; try { data = await res.json(); } catch(_) {} if (!res.ok || data.ok === false) { throw new Error(data.message || 'Gönderilemedi'); } msg.textContent = data.message || 'Teşekkürler! İncelemeye aldık.'; msg.hidden = false; // GA event (varsa) if (window.gtag) gtag('event','report_issue_submit',{event_category:'ux', value:1}); setTimeout(() => { close(); form.reset(); msg.hidden = true; }, 900); } catch (err) { console.error('[report] submit error:', err); msg.textContent = (err && err.message) ? err.message : 'Gönderilemedi. Lütfen tekrar deneyin.'; msg.hidden = false; } finally { okBtn.disabled = false; okBtn.textContent = label; } }); })(); </script> <!-- Paylaş butonu --> <button id="shareOpen" class="qna-btn qna-btn--ghost" type="button" aria-haspopup="dialog"> 📤 Paylaş </button> <!-- Paylaş Modal --> <dialog id="shareDialog" class="qna-share" aria-labelledby="shareTitle"> <div class="qna-card" role="document" data-title="" data-url="https://qna.com.tr/soru-cevap/toplu-urun-yukleme-csv-excel-ve-xml-feed-sablonlari-nasil-hazirlanir"> <header class="qna-card__header"> <h2 id="shareTitle">Paylaş</h2> <button type="button" id="shareClose" class="qna-btn qna-btn--icon" aria-label="Kapat">✕</button> </header> <div class="qna-share__grid"> <!-- 8 ağ (WhatsApp, X, Telegram, Facebook, LinkedIn, E-posta, Pinterest, Reddit) --> <a data-net="whatsapp" class="qna-share__item qna--wa" href="#" aria-label="WhatsApp">WhatsApp</a> <a data-net="x" class="qna-share__item qna--x" href="#" aria-label="X">X</a> <a data-net="telegram" class="qna-share__item qna--tg" href="#" aria-label="Telegram">Telegram</a> <a data-net="facebook" class="qna-share__item qna--fb" href="#" aria-label="Facebook">Facebook</a> <a data-net="linkedin" class="qna-share__item qna--li" href="#" aria-label="LinkedIn">LinkedIn</a> <a data-net="email" class="qna-share__item qna--em" href="#" aria-label="E-posta">E-posta</a> <a data-net="pinterest" class="qna-share__item qna--pi" href="#" aria-label="Pinterest">Pinterest</a> <a data-net="reddit" class="qna-share__item qna--rd" href="#" aria-label="Reddit">Reddit</a> </div> <footer class="qna-card__footer"> <!-- İstersen yerel paylaşımı da sun (modal içinde kalsın) --> <button type="button" id="shareNative" class="qna-btn qna-btn--soft">📱 Cihazda paylaş</button> </footer> </div> </dialog> <script defer> (() => { const openBtn = document.getElementById('shareOpen'); const dlg = document.getElementById('shareDialog'); const closeBtn = document.getElementById('shareClose'); const nativeBtn = document.getElementById('shareNative'); const card = dlg?.querySelector('.qna-card'); if (!openBtn || !dlg || !card) return; const title = card.dataset.title || document.title; const baseUrl = card.dataset.url || location.href; // (İsteğe bağlı) UTM ekleyelim – canonical'a dokunmaz const withUtm = (u, src) => { try{ const url=new URL(u); url.searchParams.set('utm_source', src); url.searchParams.set('utm_medium', 'share'); url.searchParams.set('utm_campaign', 'question_share'); return url.toString(); }catch{return u;} }; const make = { x: (t,u)=> `https://twitter.com/intent/tweet?text=${encodeURIComponent(t)}&url=${encodeURIComponent(u)}`, facebook: (t,u)=> `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(u)}`, whatsapp: (t,u)=> /Android|iPhone|Mobile/i.test(navigator.userAgent) ? `https://api.whatsapp.com/send?text=${encodeURIComponent(t+' '+u)}` : `https://web.whatsapp.com/send?text=${encodeURIComponent(t+' '+u)}`, telegram: (t,u)=> `https://t.me/share/url?url=${encodeURIComponent(u)}&text=${encodeURIComponent(t)}`, linkedin: (t,u)=> `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(u)}`, pinterest:(t,u)=> `https://pinterest.com/pin/create/button/?url=${encodeURIComponent(u)}&description=${encodeURIComponent(t)}`, reddit: (t,u)=> `https://www.reddit.com/submit?url=${encodeURIComponent(u)}&title=${encodeURIComponent(t)}`, email: (t,u)=> `mailto:?subject=${encodeURIComponent(t)}&body=${encodeURIComponent(t+'\n'+u)}` }; const open = () => dlg.showModal(); const close = () => dlg.close(); openBtn.addEventListener('click', open); closeBtn?.addEventListener('click', close); dlg.addEventListener('cancel', (e)=>{ e.preventDefault(); close(); }); // Esc // Ağ tıklamaları dlg.querySelectorAll('[data-net]').forEach(a=>{ a.addEventListener('click', (e)=>{ e.preventDefault(); const net = a.dataset.net; const u = withUtm(baseUrl, net); const href = make[net]?.(title, u); if (!href) return; if (net==='email' || net==='whatsapp') { location.href = href; } else { window.open(href, '_blank', 'noopener,noreferrer,width=600,height=540'); } // GA event (varsa) if (window.gtag) gtag('event','share',{method:net, content_type:'question'}); close(); }, {passive:false}); }); // Yerel paylaşım (destek varsa) nativeBtn?.addEventListener('click', async ()=>{ const u = withUtm(baseUrl, 'native'); if (navigator.share) { try { await navigator.share({ title, text:title, url:u }); close(); } catch {} } else { try { await navigator.clipboard.writeText(u); nativeBtn.textContent='Kopyalandı!'; setTimeout(()=>nativeBtn.textContent='📱 Cihazda paylaş',1200); } catch {} } }); })(); </script> <br><br> <div class="card block"> <h3>Aynı kategoriden</h3> <ul class="list"> <li><a href="https://qna.com.tr/soru-cevap/kargo-anlasmasi-nasil-yapilir-desi-bolge-ve-ek-hizmetler">Kargo anlaşması nasıl yapılır? Desi, bölge ve ek hizmetler</a></li><li><a href="https://qna.com.tr/soru-cevap/kredi-karti-dolandiriciligi-nasil-fark-edilir">Kredi kartı dolandırıcılığı nasıl fark edilir?</a></li><li><a href="https://qna.com.tr/soru-cevap/cerez-izinleri-piksel-ve-etik-izleme-nasil-ayarlanir">Çerez izinleri, piksel ve etik izleme nasıl ayarlanır?</a></li><li><a href="https://qna.com.tr/soru-cevap/e-ticarette-fiyatlandirma-stratejileri-nelerdir">E-ticarette fiyatlandırma stratejileri nelerdir?</a></li><li><a href="https://qna.com.tr/soru-cevap/kapida-odeme-avantajlari-nelerdir">Kapıda ödeme avantajları nelerdir?</a></li><li><a href="https://qna.com.tr/soru-cevap/donusum-orani-nedir-ve-nasil-artirilir">Dönüşüm oranı nedir ve nasıl artırılır?</a></li><li><a href="https://qna.com.tr/soru-cevap/cyber-monday-nedir">Cyber Monday nedir?</a></li><li><a href="https://qna.com.tr/soru-cevap/en-cok-satan-e-ticaret-urunleri-nelerdir">En çok satan e-ticaret ürünleri nelerdir?</a></li><li><a href="https://qna.com.tr/soru-cevap/yorum-ve-puan-artirma-etik-tesvikler-ve-moderasyon-kurallari">Yorum ve puan artırma: etik teşvikler ve moderasyon kuralları</a></li><li><a href="https://qna.com.tr/soru-cevap/garanti-belgesi-ve-satis-sonrasi-destek-yukumlulukleri-nelerdir">Garanti belgesi ve satış sonrası destek yükümlülükleri nelerdir?</a></li><li><a href="https://qna.com.tr/soru-cevap/urun-aciklamasi-nasil-yazilir">Ürün açıklaması nasıl yazılır?</a></li><li><a href="https://qna.com.tr/soru-cevap/tuketici-hakem-heyeti-surecleri-ve-satici-olarak-nasil-hazirlanilir">Tüketici Hakem Heyeti süreçleri ve satıcı olarak nasıl hazırlanılır?</a></li><li><a href="https://qna.com.tr/soru-cevap/dilinmek-nedir">Dilinmek nedir?</a></li><li><a href="https://qna.com.tr/soru-cevap/yurtdisina-satista-vergi-muafiyeti-var-mi">Yurtdışına satışta vergi muafiyeti var mı?</a></li><li><a href="https://qna.com.tr/soru-cevap/e-ticarette-vergi-yukumlulukleri-nelerdir">E-ticarette vergi yükümlülükleri nelerdir?</a></li><li><a href="https://qna.com.tr/soru-cevap/lot-ve-son-kullanma-tarihli-urunlerde-fifo-fefo-nasil-uygulanir">Lot ve son kullanma tarihli ürünlerde FIFO/FEFO nasıl uygulanır?</a></li><li><a href="https://qna.com.tr/soru-cevap/dropshipping-nedir-ve-nasil-yapilir">Dropshipping nedir ve nasıl yapılır?</a></li><li><a href="https://qna.com.tr/soru-cevap/kan-basinci-nasil-dusurulebilir">Kan basıncı nasıl düşürülebilir?</a></li><li><a href="https://qna.com.tr/soru-cevap/yurtici-kargo-anlasmalari-nasil-isler">Yurtiçi kargo anlaşmaları nasıl işler?</a></li><li><a href="https://qna.com.tr/soru-cevap/kirilgan-urun-paketleme-dolgu-kutu-secimi-ve-darbe-testi-ipuclari">Kırılgan ürün paketleme: dolgu, kutu seçimi ve darbe testi ipuçları</a></li> </ul> </div> </article> <aside class="sidebar sidebar-sticky"> <nav class="sidebox style-a"> <h3>Kategoriler</h3> <ul class="side-list"> <li> <a href="https://qna.com.tr/kategori/aile-ve-toplum">Aile ve Toplum</a> <span class="badge">550</span> </li><li> <a href="https://qna.com.tr/kategori/akademi-universite">Akademi & Üniversite</a> <span class="badge">794</span> </li><li> <a href="https://qna.com.tr/kategori/anayasa-ve-hukuk">Anayasa ve Hukuk</a> <span class="badge">597</span> </li><li> <a href="https://qna.com.tr/kategori/araclar">Araçlar</a> <span class="badge">954</span> </li><li> <a href="https://qna.com.tr/kategori/askerlik">Askerlik</a> <span class="badge">419</span> </li><li> <a href="https://qna.com.tr/kategori/astroloji">Astroloji</a> <span class="badge">285</span> </li><li> <a href="https://qna.com.tr/kategori/astronomi-ve-kozmoloji">Astronomi & Kozmoloji</a> <span class="badge">2265</span> </li><li> <a href="https://qna.com.tr/kategori/bahce-isleri">Bahçe İşleri</a> <span class="badge">590</span> </li><li> <a href="https://qna.com.tr/kategori/bankacilik-kredi">Bankacılık & Kredi</a> <span class="badge">443</span> </li><li> <a href="https://qna.com.tr/kategori/beslenme-ve-diyet">Beslenme & Diyet</a> <span class="badge">1012</span> </li><li> <a href="https://qna.com.tr/kategori/bilgisayar-bilimleri">Bilgisayar Bilimleri</a> <span class="badge">481</span> </li><li> <a href="https://qna.com.tr/kategori/bilim">Bilim</a> <span class="badge">2267</span> </li><li> <a href="https://qna.com.tr/kategori/bilmece">Bilmece</a> <span class="badge">273</span> </li><li> <a href="https://qna.com.tr/kategori/bitkiler">Bitkiler</a> <span class="badge">358</span> </li><li> <a href="https://qna.com.tr/kategori/biyoloji-ve-genetik">Biyoloji & Genetik</a> <span class="badge">997</span> </li><li> <a href="https://qna.com.tr/kategori/cografya">Coğrafya</a> <span class="badge">1196</span> </li><li> <a href="https://qna.com.tr/kategori/deyimler">Deyimler</a> <span class="badge">268</span> </li><li> <a href="https://qna.com.tr/kategori/dil">Dil</a> <span class="badge">400</span> </li><li> <a href="https://qna.com.tr/kategori/din-ve-inanc">Din ve İnanç</a> <span class="badge">297</span> </li><li> <a href="https://qna.com.tr/kategori/dis-ticaret">Dış Ticaret</a> <span class="badge">215</span> </li><li> <a href="https://qna.com.tr/kategori/doga-ve-cevre">Doğa & Çevre</a> <span class="badge">751</span> </li><li> <a href="https://qna.com.tr/kategori/dugun">Düğün</a> <span class="badge">416</span> </li><li> <a href="https://qna.com.tr/kategori/e-devlet">E-Devlet</a> <span class="badge">389</span> </li><li> <a href="https://qna.com.tr/kategori/e-ticaret-ve-online-alisveris">E-Ticaret & Online Alışveriş</a> <span class="badge">379</span> </li><li> <a href="https://qna.com.tr/kategori/ebeveynlik">Ebeveynlik</a> <span class="badge">478</span> </li><li> <a href="https://qna.com.tr/kategori/egitim-ogrencilik">Eğitim & Öğrencilik</a> <span class="badge">2843</span> </li><li> <a href="https://qna.com.tr/kategori/ehliyet-suruculuk">Ehliyet & Sürücülük</a> <span class="badge">488</span> </li><li> <a href="https://qna.com.tr/kategori/el-sanatlari">El Sanatları</a> <span class="badge">505</span> </li><li> <a href="https://qna.com.tr/kategori/elektronik">Elektronik</a> <span class="badge">484</span> </li><li> <a href="https://qna.com.tr/kategori/emeklilik">Emeklilik</a> <span class="badge">404</span> </li><li> <a href="https://qna.com.tr/kategori/enerji">Enerji</a> <span class="badge">294</span> </li><li> <a href="https://qna.com.tr/kategori/etkinlik-planlama">Etkinlik Planlama</a> <span class="badge">580</span> </li><li> <a href="https://qna.com.tr/kategori/etnik-gruplar">Etnik Gruplar</a> <span class="badge">288</span> </li><li> <a href="https://qna.com.tr/kategori/ev-dekorasyonu">Ev Dekorasyonu</a> <span class="badge">421</span> </li><li> <a href="https://qna.com.tr/kategori/fatura-abonelik">Fatura & Abonelik</a> <span class="badge">427</span> </li><li> <a href="https://qna.com.tr/kategori/felsefe">Felsefe</a> <span class="badge">290</span> </li><li> <a href="https://qna.com.tr/kategori/film">Film</a> <span class="badge">488</span> </li><li> <a href="https://qna.com.tr/kategori/finans">Finans</a> <span class="badge">1956</span> </li><li> <a href="https://qna.com.tr/kategori/fitness-ve-egzersiz">Fitness & Egzersiz</a> <span class="badge">1366</span> </li><li> <a href="https://qna.com.tr/kategori/fizik">Fizik</a> <span class="badge">406</span> </li><li> <a href="https://qna.com.tr/kategori/fotografcilik">Fotoğrafçılık</a> <span class="badge">264</span> </li><li> <a href="https://qna.com.tr/kategori/genel">Genel</a> <span class="badge">139</span> </li><li> <a href="https://qna.com.tr/kategori/geometri">Geometri</a> <span class="badge">264</span> </li><li> <a href="https://qna.com.tr/kategori/gezi-rehberi">Gezi Rehberi</a> <span class="badge">425</span> </li><li> <a href="https://qna.com.tr/kategori/girisimcilik-sirket">Girişimcilik & Şirket</a> <span class="badge">593</span> </li><li> <a href="https://qna.com.tr/kategori/gundem">Gündem</a> <span class="badge">141</span> </li><li> <a href="https://qna.com.tr/kategori/gunluk-yasam-ipuclari">Günlük Yaşam İpuçları</a> <span class="badge">378</span> </li><li> <a href="https://qna.com.tr/kategori/guzellik">Güzellik</a> <span class="badge">448</span> </li><li> <a href="https://qna.com.tr/kategori/hayvanlar">Hayvanlar</a> <span class="badge">745</span> </li><li> <a href="https://qna.com.tr/kategori/hobi-ve-ilgi-alanlari">Hobi & İlgi Alanları</a> <span class="badge">297</span> </li><li> <a href="https://qna.com.tr/kategori/ikamet-adres">İkamet & Adres</a> <span class="badge">403</span> </li><li> <a href="https://qna.com.tr/kategori/iktisat">İktisat</a> <span class="badge">405</span> </li><li> <a href="https://qna.com.tr/kategori/ilce-bilgisi">İlçe Bilgisi</a> <span class="badge">389</span> </li><li> <a href="https://qna.com.tr/kategori/internet-mobil">İnternet & Mobil</a> <span class="badge">463</span> </li><li> <a href="https://qna.com.tr/kategori/is-kariyer">İş & Kariyer</a> <span class="badge">651</span> </li><li> <a href="https://qna.com.tr/kategori/jeoloji">Jeoloji</a> <span class="badge">263</span> </li><li> <a href="https://qna.com.tr/kategori/kimdir">Kimdir?</a> <span class="badge">1947</span> </li><li> <a href="https://qna.com.tr/kategori/kimya">Kimya</a> <span class="badge">305</span> </li><li> <a href="https://qna.com.tr/kategori/kira-konut">Kira & Konut</a> <span class="badge">403</span> </li><li> <a href="https://qna.com.tr/kategori/kisisel-gelisim">Kişisel Gelişim</a> <span class="badge">436</span> </li><li> <a href="https://qna.com.tr/kategori/kpss-memurluk">KPSS & Memurluk</a> <span class="badge">422</span> </li><li> <a href="https://qna.com.tr/kategori/kultur-sanat-ve-edebiyat">Kültür, Sanat & Edebiyat</a> <span class="badge">908</span> </li><li> <a href="https://qna.com.tr/kategori/madencilik">Madencilik</a> <span class="badge">296</span> </li><li> <a href="https://qna.com.tr/kategori/masal-ve-hikaye">Masal ve Hikaye</a> <span class="badge">274</span> </li><li> <a href="https://qna.com.tr/kategori/matematik">Matematik</a> <span class="badge">2302</span> </li><li> <a href="https://qna.com.tr/kategori/meb-islemleri">MEB İşlemleri</a> <span class="badge">476</span> </li><li> <a href="https://qna.com.tr/kategori/meslekler">Meslekler</a> <span class="badge">1720</span> </li><li> <a href="https://qna.com.tr/kategori/meyve-bilgisi">Meyve Bilgisi</a> <span class="badge">268</span> </li><li> <a href="https://qna.com.tr/kategori/mimari">Mimari</a> <span class="badge">451</span> </li><li> <a href="https://qna.com.tr/kategori/mitoloji">Mitoloji</a> <span class="badge">275</span> </li><li> <a href="https://qna.com.tr/kategori/mobil-uygulamalar">Mobil Uygulamalar</a> <span class="badge">529</span> </li><li> <a href="https://qna.com.tr/kategori/moda">Moda</a> <span class="badge">406</span> </li><li> <a href="https://qna.com.tr/kategori/muhendislik">Mühendislik</a> <span class="badge">1334</span> </li><li> <a href="https://qna.com.tr/kategori/muzik">Müzik</a> <span class="badge">555</span> </li><li> <a href="https://qna.com.tr/kategori/ne-zaman">Ne Zaman?</a> <span class="badge">253</span> </li><li> <a href="https://qna.com.tr/kategori/nedir">Nedir?</a> <span class="badge">333</span> </li><li> <a href="https://qna.com.tr/kategori/nehirler-ve-akarsular">Nehirler ve Akarsular</a> <span class="badge">295</span> </li><li> <a href="https://qna.com.tr/kategori/otomotiv">Otomotiv</a> <span class="badge">2041</span> </li><li> <a href="https://qna.com.tr/kategori/oyun">Oyun</a> <span class="badge">398</span> </li><li> <a href="https://qna.com.tr/kategori/pazarlama">Pazarlama</a> <span class="badge">311</span> </li><li> <a href="https://qna.com.tr/kategori/psikoloji-ve-psikiyatri">Psikoloji & Psikiyatri</a> <span class="badge">2554</span> </li><li> <a href="https://qna.com.tr/kategori/risk-yonetimi">Risk Yönetimi</a> <span class="badge">290</span> </li><li> <a href="https://qna.com.tr/kategori/saglik-randevu">Sağlık & Randevu</a> <span class="badge">2230</span> </li><li> <a href="https://qna.com.tr/kategori/sanayi-ve-uretim">Sanayi ve Üretim</a> <span class="badge">275</span> </li><li> <a href="https://qna.com.tr/kategori/seyahat-ulasim">Seyahat & Ulaşım</a> <span class="badge">441</span> </li><li> <a href="https://qna.com.tr/kategori/sgk">SGK</a> <span class="badge">412</span> </li><li> <a href="https://qna.com.tr/kategori/sigorta">Sigorta</a> <span class="badge">284</span> </li><li> <a href="https://qna.com.tr/kategori/siyaset">Siyaset</a> <span class="badge">260</span> </li><li> <a href="https://qna.com.tr/kategori/spor">Spor</a> <span class="badge">1382</span> </li><li> <a href="https://qna.com.tr/kategori/tapu-emlak">Tapu & Emlak</a> <span class="badge">426</span> </li><li> <a href="https://qna.com.tr/kategori/tarih">Tarih</a> <span class="badge">2730</span> </li><li> <a href="https://qna.com.tr/kategori/tarim-ve-bahcecilik">Tarım ve Bahçecilik</a> <span class="badge">2727</span> </li><li> <a href="https://qna.com.tr/kategori/tasarim">Tasarım</a> <span class="badge">470</span> </li><li> <a href="https://qna.com.tr/kategori/tatil-takvimi-ve-resmi-gunler">Tatil Takvimi & Resmi Günler</a> <span class="badge">370</span> </li><li> <a href="https://qna.com.tr/kategori/teknoloji-yazilim">Teknoloji & Yazılım</a> <span class="badge">3589</span> </li><li> <a href="https://qna.com.tr/kategori/trafik-ve-ceza">Trafik ve Ceza</a> <span class="badge">394</span> </li><li> <a href="https://qna.com.tr/kategori/turizm-ve-seyahat">Turizm ve Seyahat</a> <span class="badge">254</span> </li><li> <a href="https://qna.com.tr/kategori/ulke-bilgisi">Ülke Bilgisi</a> <span class="badge">311</span> </li><li> <a href="https://qna.com.tr/kategori/universite-osym">Üniversite & ÖSYM</a> <span class="badge">923</span> </li><li> <a href="https://qna.com.tr/kategori/vergi">Vergi</a> <span class="badge">496</span> </li><li> <a href="https://qna.com.tr/kategori/veri-bilimi">Veri Bilimi</a> <span class="badge">301</span> </li><li> <a href="https://qna.com.tr/kategori/vize-pasaport">Vize & Pasaport</a> <span class="badge">416</span> </li><li> <a href="https://qna.com.tr/kategori/yerlesim-yeri">Yerleşim Yeri</a> <span class="badge">289</span> </li><li> <a href="https://qna.com.tr/kategori/yiyecek-ve-icecek">Yiyecek ve İçecek</a> <span class="badge">2242</span> </li></ul> </nav> <br> <nav class="sidebox style-a"> <h3>📈 En Çok Okunanlar</h3> <ul class="side-list"> <li><a href="https://qna.com.tr/soru-cevap/dogalgazda-sayac-okuma-tarihlerini-nasil-ogrenirim-fatura-tarihini-one-arkaya-alabilir-miyim">Doğalgazda sayaç okuma tarihlerini nasıl öğrenirim, fatura tarihini öne/arkaya alabilir miyim?</a></li> <li><a href="https://qna.com.tr/soru-cevap/alo-182-nedir">Alo 182 nedir?</a></li> <li><a href="https://qna.com.tr/soru-cevap/yurt-disi-e-devlet-sifresi-nasil-alinir-konsolosluk-islemleri-nedir">Yurt disi e-Devlet sifresi nasil alinır, konsolosluk islemleri nedir?</a></li> <li><a href="https://qna.com.tr/soru-cevap/adres-degisikligi-icin-vekalet-verilebilir-mi">Adres değişikliği için vekalet verilebilir mi?</a></li> <li><a href="https://qna.com.tr/soru-cevap/ogretmenler-icin-online-egitim-platformlarinda-veri-analizi-ve-raporlama-nasil-yapilir">Öğretmenler için online eğitim platformlarında veri analizi ve raporlama nasıl yapılır?</a></li> <li><a href="https://qna.com.tr/soru-cevap/bebek-gelisim-tablosu-nedir">Bebek gelişim tablosu nedir?</a></li> <li><a href="https://qna.com.tr/soru-cevap/adres-degisikligi-cezasi-ne-kadar">Adres değişikliği cezası ne kadar?</a></li> <li><a href="https://qna.com.tr/soru-cevap/corba-cesitleri-nelerdir">Çorba çeşitleri nelerdir?</a></li> <li><a href="https://qna.com.tr/soru-cevap/turkiye-ye-internet-nerden-geliyor">Türkiye'ye internet nerden geliyor?</a></li> <li><a href="https://qna.com.tr/soru-cevap/e-nabiz-da-saglik-verileri-nasil-paylasilir">E-Nabız’da sağlık verileri nasıl paylaşılır?</a></li> </ul> </nav> </aside></div> </main> <footer class="site-footer"> <div class="footer-bottom"> © 2025 <a href="https://qna.com.tr">QNA</a> • Tüm hakları saklıdır. • <a href="https://qna.com.tr/sayfa/hakkimizda/">Hakkımızda</a> • <a href="https://qna.com.tr/sayfa/gizlilik/">Gizlilik</a> • <a href="https://qna.com.tr/sayfa/kullanim-sartlari/">Şartlar</a> • <a href="https://qna.com.tr/sayfa/kvkk/">KVKK</a> • <a href="https://qna.com.tr/feed" target="_blank">Rss</a> • <a href="https://qna.com.tr/sayfa/cerez-politikasi/">Çerezler</a> • <a href="#" class="cookie-manage-link" id="cookieManageLink" hidden>Çerez Ayarları</a> </div> </footer> <script> // Tema toggler (varsa mevcut kodun kalsın) (function(){ const btn = document.getElementById('themeToggle'); if(!btn) return; const root = document.documentElement; function setTheme(t){ root.dataset.theme = t; localStorage.setItem('theme', t); btn.textContent = t==='dark'?'☀️':'🌙'; } setTheme(localStorage.getItem('theme') || 'light'); btn.addEventListener('click', ()=> setTheme(root.dataset.theme==='dark'?'light':'dark')); })(); // Mobil menü toggler (function(){ const btn = document.getElementById('hamburgerBtn'); const menu = document.getElementById('mobileMenu'); const backdrop = document.getElementById('mobileBackdrop'); if(!btn || !menu || !backdrop) return; function openMenu(){ menu.hidden = false; backdrop.hidden = false; btn.setAttribute('aria-expanded','true'); // odak ilk linke const first = menu.querySelector('a'); first && first.focus(); document.body.style.overflow = 'hidden'; } function closeMenu(){ menu.hidden = true; backdrop.hidden = true; btn.setAttribute('aria-expanded','false'); document.body.style.overflow = ''; btn.focus(); } btn.addEventListener('click', ()=>{ const isOpen = btn.getAttribute('aria-expanded') === 'true'; isOpen ? closeMenu() : openMenu(); }); backdrop.addEventListener('click', closeMenu); document.addEventListener('keydown', (e)=>{ if(e.key === 'Escape'){ closeMenu(); }}); })(); </script> <script> (function(){ const btn = document.getElementById('hamburgerBtn'); const drawer = document.getElementById('offcanvasMenu'); const closeBtn = drawer ? drawer.querySelector('.offcanvas-close') : null; const backdrop = document.querySelector('.offcanvas-backdrop'); if(!btn || !drawer || !backdrop){ console.warn('Offcanvas: gerekli elemanlar bulunamadı'); return; } // Focus trap için ilk ve son focuslanabilir öğeler function getFocusables(root){ return Array.from(root.querySelectorAll('a, button, input, textarea, select, [tabindex]:not([tabindex="-1"])')) .filter(el => !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden')); } function openDrawer(){ drawer.classList.add('is-open'); backdrop.hidden = false; requestAnimationFrame(()=> backdrop.classList.add('is-open')); document.body.classList.add('menu-open'); btn.setAttribute('aria-expanded', 'true'); btn.classList.add('is-active'); // ikon animasyonu // focus yönetimi const f = getFocusables(drawer); (f[0] || closeBtn || drawer).focus(); } function closeDrawer(){ drawer.classList.remove('is-open'); backdrop.classList.remove('is-open'); document.body.classList.remove('menu-open'); btn.setAttribute('aria-expanded', 'false'); btn.classList.remove('is-active'); // ikon animasyonu // backdrop animasyonu bitince tamamen gizle setTimeout(()=> { backdrop.hidden = true; }, 200); btn.focus(); } function toggleDrawer(){ if(drawer.classList.contains('is-open')) closeDrawer(); else openDrawer(); } btn.addEventListener('click', function(e){ e.preventDefault(); // güvenli toggleDrawer(); }); if(closeBtn) closeBtn.addEventListener('click', closeDrawer); backdrop.addEventListener('click', closeDrawer); // ESC ile kapat document.addEventListener('keydown', function(e){ if(e.key === 'Escape' && drawer.classList.contains('is-open')) closeDrawer(); // focus trap (Tab ile dışarı taşmasın) if(e.key === 'Tab' && drawer.classList.contains('is-open')){ const f = getFocusables(drawer); if(!f.length) return; const first = f[0], last = f[f.length - 1]; if(e.shiftKey && document.activeElement === first){ last.focus(); e.preventDefault(); } else if(!e.shiftKey && document.activeElement === last){ first.focus(); e.preventDefault(); } } }); })(); </script> <!-- ÇEREZ BANNER --> <div class="cookie-banner" id="cookieBanner" role="dialog" aria-modal="true" aria-labelledby="cookieTitle" hidden> <div class="cookie-inner container"> <div class="cookie-text"> <h2 id="cookieTitle">Çerezleri Kullanıyoruz</h2> <p> Deneyiminizi iyileştirmek için zorunlu çerezler kullanıyoruz. Analitik ve pazarlama çerezleri için izninizi rica ederiz. <a href="https://qna.com.tr/sayfa/cerez-politikasi/" target="_blank" rel="noopener">Çerez Politikası</a> </p> </div> <div class="cookie-actions"> <button class="btn btn-secondary" id="cookiePrefsOpen" type="button" aria-haspopup="dialog" aria-controls="cookiePrefs"> Tercihleri Yönet </button> <button class="btn btn-accept" id="cookieAcceptAll" type="button">Tümünü Kabul Et</button> </div> </div> </div> <!-- TERCİHLER PANELİ (MODAL) --> <div class="cookie-prefs-backdrop" id="cookieBackdrop" hidden></div> <div class="cookie-prefs" id="cookiePrefs" role="dialog" aria-modal="true" aria-labelledby="cookiePrefsTitle" hidden> <div class="cookie-prefs-head"> <h3 id="cookiePrefsTitle">Çerez Tercihleri</h3> <button class="cookie-close" id="cookiePrefsClose" type="button" aria-label="Kapat">✕</button> </div> <form class="cookie-prefs-body"> <fieldset class="cookie-group"> <legend>Gerekli Çerezler</legend> <p class="muted">Site güvenliği ve temel işlevler için gereklidir. Devre dışı bırakılamaz.</p> <label class="switch"> <input type="checkbox" checked disabled> <span>Her zaman etkin</span> </label> </fieldset> <fieldset class="cookie-group"> <legend>Analitik Çerezler</legend> <p class="muted">Site performansı ve kullanım analizi için anonim istatistikler.</p> <label class="switch"> <input type="checkbox" id="consentAnalytics"> <span>Analitik’e izin ver</span> </label> </fieldset> <fieldset class="cookie-group"> <legend>Pazarlama Çerezleri</legend> <p class="muted">Size uygun içerik ve kampanyalar göstermek için kullanılır.</p> <label class="switch"> <input type="checkbox" id="consentMarketing"> <span>Pazarlama’ya izin ver</span> </label> </fieldset> <div class="cookie-prefs-actions"> <button class="btn btn-secondary" type="button" id="cookieRejectAll">Tümünü Reddet</button> <button class="btn btn-accept" type="submit" id="cookieSave">Kaydet</button> </div> </form> </div> <style> /* Mobil: bottom sheet gibi, tam görünür alan + içeriği kaydırılabilir */ .cookie-prefs{ position: fixed; left: 0; right: 0; bottom: 0; top: auto; max-height: min(90vh, 640px); /* ekranı taşmasın */ display: flex; flex-direction: column; overflow: hidden; /* başlık sabit, gövde kayar */ border-radius: 12px 12px 0 0; padding-bottom: env(safe-area-inset-bottom); } /* Modal iç kaydırma */ .cookie-prefs-body{ overflow: auto; max-height: calc(90vh - 56px - 70px); /* başlık + butonlar düşülerek */ } /* Masaüstü: tam ortala */ @media (min-width: 720px){ .cookie-prefs{ top: 50%; left: 50%; right: auto; bottom: auto; transform: translate(-50%, -50%); /* gerçek merkezleme */ width: min(720px, calc(100vw - 48px)); max-height: min(85vh, 680px); border-radius: 12px; } .cookie-prefs.show{ transform: translate(-50%, -50%) !important; } .cookie-prefs-body{ max-height: calc(85vh - 56px - 70px); /* başlık+alt butonlar */ } } /* Başlık ve alt butonlar sabit kalsın */ .cookie-prefs-head{ position: sticky; top: 0; z-index: 1; } .cookie-prefs-actions{ position: sticky; bottom: 0; background: var(--card); padding-top: 8px; } /* Backdrop ve z-index hiyerarşisi (modal üstte) */ .cookie-banner{ z-index: 200; } .cookie-prefs-backdrop{ z-index: 210; } .cookie-prefs{ z-index: 220; } /* ============ Cookie Banner ============ */ .cookie-banner[hidden]{display:none!important} .cookie-banner{position:fixed;left:0;right:0;bottom:0;z-index:200;background:var(--card);color:var(--fg);border-top:1px solid var(--border);box-shadow:0 -8px 24px rgba(0,0,0,.08)} .cookie-inner{display:grid;align-items:center;gap:10px;padding:12px 16px} @media(min-width:760px){.cookie-inner{grid-template-columns:1fr auto}} .cookie-text h2{font-size:16px;margin:0 0 4px} .cookie-text p{margin:0;color:var(--muted)} .cookie-text a{color:var(--brand);text-decoration:none} .cookie-text a:hover{text-decoration:underline} .cookie-actions{display:flex;gap:8px;justify-content:flex-center} .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:8px 12px;border-radius:10px;border:1px solid var(--border);background:var(--card);color:var(--fg);font-weight:700;cursor:pointer;transition:transform .12s ease,background .18s ease,border-color .18s ease} .btn:hover{transform:translateY(-1px)} .btn-accept{background:linear-gradient(135deg,var(--brand),var(--brand-2));color:#fff;border-color:transparent} .btn-secondary:hover{background:color-mix(in oklab,var(--brand) 6%,var(--card))} /* ============ Cookie Prefs Modal ============ */ .cookie-prefs[hidden],.cookie-prefs-backdrop[hidden]{display:none!important} .cookie-prefs-backdrop{position:fixed;inset:0;z-index:210;background:rgba(0,0,0,.35);opacity:0;transition:opacity .2s ease} .cookie-prefs{position:fixed;inset:auto 0 0 0;z-index:220;margin:0 auto;max-width:720px;background:var(--card);color:var(--fg);border-top:1px solid var(--border);border-radius:12px 12px 0 0;box-shadow:0 -20px 50px rgba(2,6,23,.18);transform:translateY(16px);opacity:0;transition:transform .24s ease,opacity .24s ease} @media(min-width:720px){.cookie-prefs{top:50%;transform:translateY(10px);border-radius:12px}} .cookie-prefs.show{transform:translateY(0);opacity:1} .cookie-prefs-backdrop.show{opacity:1} .cookie-prefs-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;border-bottom:1px solid var(--border);background:color-mix(in oklab,var(--card) 92%,transparent)} .cookie-close{border:1px solid var(--border);background:var(--card);color:var(--fg);border-radius:10px;padding:6px 10px;cursor:pointer} .cookie-prefs-body{padding:10px 14px 14px} .cookie-group{border:1px solid var(--border);border-radius:10px;padding:10px 12px;margin:10px 0} .cookie-group legend{font-weight:700;padding:0 6px} .cookie-group .muted{color:var(--muted);font-size:13px;margin:6px 0 8px} /* Toggle switch */ .switch{display:inline-flex;align-items:center;gap:8px;user-select:none} .switch input{appearance:none;width:42px;height:24px;border-radius:999px;position:relative;background:#cbd5e1;outline:none;transition:background .2s ease;border:1px solid var(--border)} .switch input::after{content:"";position:absolute;inset:2px auto 2px 2px;width:18px;height:18px;border-radius:50%;background:#fff;transition:transform .2s ease} .switch input:checked{background:color-mix(in oklab,var(--brand) 70%,#cbd5e1)} .switch input:checked::after{transform:translateX(18px)} .cookie-prefs-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:8px} .cookie-manage-link{display:inline-block;font-size:13px;color:var(--muted);text-decoration:none} .cookie-manage-link:hover{color:var(--brand)} @media(prefers-reduced-motion:reduce){.cookie-banner,.cookie-prefs,.cookie-prefs-backdrop{transition:none!important}} </style> <script> (function(){ const KEY = "qna_cookie_consent_v1"; // versiyonlayabilirsin const banner = document.getElementById('cookieBanner'); const prefs = document.getElementById('cookiePrefs'); const backdrop = document.getElementById('cookieBackdrop'); const openPrefsBtn = document.getElementById('cookiePrefsOpen'); const acceptAllBtn = document.getElementById('cookieAcceptAll'); const closePrefsBtn = document.getElementById('cookiePrefsClose'); const rejectAllBtn = document.getElementById('cookieRejectAll'); const manageLink = document.getElementById('cookieManageLink'); const analyticsChk = document.getElementById('consentAnalytics'); const marketingChk = document.getElementById('consentMarketing'); function getConsent(){ try{ return JSON.parse(localStorage.getItem(KEY)) || null; }catch{ return null; } } function setConsent(val){ localStorage.setItem(KEY, JSON.stringify(val)); } function showBanner(){ banner.hidden = false; // odak rahatlığı için banner’a fokus atmayalım; butona basınca modal açılır } function hideBanner(){ banner.hidden = true; } function openPrefs(){ backdrop.hidden = false; prefs.hidden = false; requestAnimationFrame(()=>{ backdrop.classList.add('show'); prefs.classList.add('show'); }); // focus (prefs.querySelector('h3') || prefs).focus?.(); } function closePrefs(){ backdrop.classList.remove('show'); prefs.classList.remove('show'); setTimeout(()=>{ backdrop.hidden = true; prefs.hidden = true; }, 200); } // Başlangıç const saved = getConsent(); if(!saved){ showBanner(); }else{ // “Ayarları yönet” linkini göster (footer’a taşıyabilirsin) manageLink.hidden = false; // Onaylara göre scriptleri yükle applyConsent(saved); } // Etkileşimler openPrefsBtn?.addEventListener('click', openPrefs); acceptAllBtn?.addEventListener('click', ()=>{ const consent = { necessary: true, analytics: true, marketing: true, ts: Date.now() }; setConsent(consent); hideBanner(); manageLink.hidden = false; applyConsent(consent); }); closePrefsBtn?.addEventListener('click', closePrefs); rejectAllBtn?.addEventListener('click', ()=>{ const consent = { necessary: true, analytics: false, marketing: false, ts: Date.now() }; setConsent(consent); closePrefs(); hideBanner(); manageLink.hidden = false; applyConsent(consent); }); // Kaydet (form submit) prefs?.querySelector('form')?.addEventListener('submit', function(e){ e.preventDefault(); const consent = { necessary: true, analytics: !!analyticsChk?.checked, marketing: !!marketingChk?.checked, ts: Date.now() }; setConsent(consent); closePrefs(); hideBanner(); manageLink.hidden = false; applyConsent(consent); }); // Yönet linki manageLink?.addEventListener('click', (e)=>{ e.preventDefault(); openPrefs(); }); // ESC ile modal kapansın document.addEventListener('keydown', (e)=>{ if(e.key === 'Escape' && !prefs.hidden){ closePrefs(); } }); // === Onaylara göre scriptleri yükle === function applyConsent(c){ // Önce mevcut opsiyonel scriptleri kaldır (sayfayı yeniden yüklemeden tercih değişimi) cleanupOptionalScripts(); if(c.analytics){ loadAnalytics(); } if(c.marketing){ loadMarketing(); } } function cleanupOptionalScripts(){ // Örnek: veri-attribute ile yönet document.querySelectorAll('script[data-optional="1"]').forEach(s=> s.remove()); } // === Google Analytics function loadAnalytics(){ const gaSrc = "https://www.googletagmanager.com/gtag/js?id=G-WZ63TFWS3W"; addScript(gaSrc, { async: true, optional: true }); addInlineScript(` window.dataLayer = window.dataLayer || []; function gtag(){ dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'G-WZ63TFWS3W', { anonymize_ip: true, transport_type: 'beacon' }); `, { optional: true }); } // === Pazarlama pikseli (meta, ads vs.) function loadMarketing(){ // (ör: Meta Pixel) // addScript('https://connect.facebook.net/en_US/fbevents.js', { async:true, optional:true }); // addInlineScript(`fbq('init', 'PIXEL_ID'); fbq('track', 'PageView');`, { optional:true }); } function addScript(src, {async=false, defer=false, optional=false}={}){ const s = document.createElement('script'); s.src = src; if(async) s.async = true; if(defer) s.defer = true; if(optional) s.dataset.optional = "1"; document.head.appendChild(s); return s; } function addInlineScript(code, {optional=false}={}){ const s = document.createElement('script'); if(optional) s.dataset.optional = "1"; s.textContent = code; document.head.appendChild(s); return s; } })(); </script> <style> /* Google-only Auth Modal (clean setup) */ #loginModal{ display:none; position:fixed; inset:0; z-index:9999; align-items:center; justify-content:center; background:rgba(0,0,0,.55); } #loginModal[aria-hidden="false"]{ display:flex; } #loginModal .modal-content{ background:#fff; width:min(420px,92vw); border-radius:14px; padding:18px 18px 20px; box-shadow:0 20px 60px rgba(0,0,0,.25); position:relative; color:#0b1220; } #loginModal .close{ position:absolute; right:10px; top:8px; border:0; background:transparent; font-size:26px; cursor:pointer; line-height:1; } .title{margin:0 0 12px; font-weight:800} .muted{color:#6b7280; font-size:13px} </style> <div id="loginModal" aria-hidden="true" role="dialog" aria-modal="true" aria-labelledby="authTitle"> <div class="modal-content" id="loginModalContent"> <button class="close" aria-label="Kapat" onclick="closeLogin()">×</button> <h3 id="authTitle" class="title">Google ile Giriş</h3> <p class="muted">Tek tıkla giriş. Kayıt ve şifre akışları kaldırıldı.</p> <!-- Google Identity Services --> <div id="g_id_onload" data-client_id="372305773433-jgishubgbpnor9848opboscpqsng9fsb.apps.googleusercontent.com" data-callback="handleCredentialResponse" data-auto_prompt="false"></div> <div class="g_id_signin" data-type="standard" data-size="large" data-theme="outline" data-text="signin_with"></div> </div> </div> <script> // Minimal modal helpers function openLogin(){ var m = document.getElementById('loginModal'); if(!m){ console.warn('loginModal bulunamadı'); return; } m.setAttribute('aria-hidden','false'); } function closeLogin(){ var m = document.getElementById('loginModal'); if(m) m.setAttribute('aria-hidden','true'); } window.openLogin = openLogin; window.closeLogin = closeLogin; // Delegation for header button (#btnLogin) and optional .auth-link document.addEventListener('click', function(e){ var loginBtn = e.target.closest && e.target.closest('#btnLogin'); if(loginBtn){ e.preventDefault(); openLogin(); return; } var a = e.target.closest && e.target.closest('.auth-link'); if(a){ e.preventDefault(); openLogin(); } }); // Backdrop / ESC close document.addEventListener('click', function(e){ var m = document.getElementById('loginModal'); if(!m) return; if(m.getAttribute('aria-hidden')==='false' && e.target===m){ closeLogin(); } }); document.addEventListener('keydown', function(e){ var m = document.getElementById('loginModal'); if(!m) return; if(m.getAttribute('aria-hidden')==='false' && e.key==='Escape'){ closeLogin(); } }); // Load GIS once (function ensureGIS(){ if(document.getElementById('google-gis')) return; var s=document.createElement('script'); s.src='https://accounts.google.com/gsi/client'; s.async=true; s.defer=true; s.id='google-gis'; document.head.appendChild(s); })(); // Debug helper: show toast-like message function toast(msg){ console.log('[auth]', msg); } // Google callback async function handleCredentialResponse(resp){ try{ const r = await fetch('/google_login.php', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({ id_token: resp.credential }), credentials: 'same-origin' }); const text = await r.text(); console.log('google_login.php =>', r.status, text); const j = JSON.parse(text); if(j.ok){ location.reload(); }else{ alert(j.error || 'Giriş başarısız'); } }catch(err){ console.error('FETCH/JSON error:', err); alert('Ağ hatası'); } } window.handleCredentialResponse = handleCredentialResponse; </script> </body> </html>