Müsait — Yerel Dijital Ürünler
HCA · Studio
TR İletişim ↗
Teknik Not 02 · Hata Ayıklama

"Sepetiniz boş" hatası ve ertelenmiş JavaScript

Ürün sepete ekleniyor, sepet sayısı artıyor; ama ödeme sayfası "sepetiniz boş" diyor. Bu hatanın en yaygın sebebi önbellek değil — hız eklentisinin blok checkout'un ihtiyaç duyduğu JavaScript'i ertelemesi.

Belirti
Blok checkout boş sepet gösteriyor
Kök neden
Toptan JS erteleme
Süre
15 dakikalık düzeltme
Kısa cevap

WooCommerce blok tabanlı sepet ve ödeme sayfaları, WordPress'in wp JavaScript nesnesine ve wp-* betik paketlerine bağımlıdır. Bir hız eklentisi ya da özel kod tüm betikleri toptan defer ile yüklediğinde bu paketler yanlış sırada çalışır, tarayıcı konsolunda wp is not defined hatası oluşur ve blok kendini boş sepet durumunda çizer. Çözüm, erteleme kuralından WordPress çekirdek betiklerini ve WooCommerce blok betiklerini muaf tutmaktır — sepeti veya önbelleği temizlemek değil.

Belirtiler

Bu hatanın imzası oldukça belirgindir:

  • Ürün sayfasında "sepete ekle" çalışır, üstteki sepet sayacı artar.
  • Sepet sayfası ya boş görünür ya da hiç yüklenmez.
  • Ödeme sayfası "Sepetiniz şu anda boş" mesajı verir.
  • Hata bazı ziyaretçilerde yok — genellikle giriş yapmış yöneticide sorun görünmez.
  • Sunucu hata kaydında (PHP error log) hiçbir şey yoktur.

Son iki madde önemli. Yöneticide sorunun görünmemesi, çoğu hız eklentisinin giriş yapmış kullanıcılar için optimizasyonu devre dışı bırakmasındandır. Bu da site sahibinin sorunu fark etmesini geciktirir; hata yalnızca gerçek müşteride oluşur.

Yanlış teşhisler

Bu hatayla karşılaşan çoğu kişi sırayla şunları dener ve hiçbiri kalıcı sonuç vermez:

  • Önbelleği temizlemek. Geçici olarak düzelmiş gibi görünebilir çünkü ilk yüklemede zamanlama değişir; birkaç dakika sonra tekrarlar.
  • Ödeme sayfasını önbellek dışına almak. Doğru bir ayardır ve yapılmalıdır, ama bu hatanın sebebi bu değildir.
  • Oturum/çerez ayarlarını değiştirmek. Sepetin oturumla ilgisi olduğu varsayımıyla yapılır; oysa sepet sunucuda doğru, sorun ekranda.
  • Temayı veya WooCommerce'i yeniden kurmak. Zaman kaybı.

Bu denemelerin ortak hatası, sorunu sunucu tarafında aramak. Oysa sunucu sepeti doğru biliyor — kanıtı, sepet sayacının artması.

Doğru teşhis: konsol

Teşhis için tek yapılması gereken, ödeme sayfasını giriş yapmadan (gizli sekmede) açıp tarayıcının geliştirici konsoluna bakmaktır.

Uncaught ReferenceError: wp is not defined
    at checkout-blocks.js:1
Uncaught TypeError: Cannot read properties of undefined (reading 'createElement')

Bu iki satırı gördüyseniz teşhis tamamdır. Sepet doğru, sunucu doğru; sayfayı çizen JavaScript çalışamadan ölüyor.

Ekstra doğrulama: sayfa kaynağında <script> etiketlerine bakın. WordPress çekirdek betikleri (wp-polyfill, wp-element, wp-data) da defer ile işaretlenmişse sebep kesinleşir.

Kök neden

WordPress betikleri birbirine bağımlıdır ve bu bağımlılık sırası wp_enqueue_script ile bildirilir. Tarayıcı normalde bu sırayı korur.

defer özniteliği eklendiğinde betikler HTML ayrıştırma bittikten sonra çalışır. Standart, defer edilmiş betiklerin belge sırasına göre çalışmasını söyler — ancak dinamik olarak eklenen, koşullu yüklenen veya satır içi (inline) kod parçalarıyla karışan bir yığında bu garanti pratikte bozulur. Özellikle:

  • Satır içi betikler defer edilemez. WooCommerce blokları, ayarlarını satır içi <script> bloklarıyla aktarır. Bu satır içi kod hemen çalışır; bağımlı olduğu wp-element ise ertelenmiştir. Sıra tersine döner.
  • Modül ve klasik betikler karışır. Farklı yükleme modelleri aynı erteleme kuralına sokulduğunda zamanlama öngörülemez hâle gelir.

Sonuç: wp nesnesi henüz tanımlı değilken ona erişmeye çalışan kod çalışır, hata fırlar ve React tabanlı blok hiç bağlanamaz. Blok bağlanamayınca varsayılan durumunu — boş sepeti — gösterir.

Bu hatayı gerçek bir sitede kök nedene kadar takip ettiğimde kaynak, temaya eklenmiş bir yardımcı eklentideki toptan erteleme kuralıydı: istisna listesi olmadan, sitedeki tüm betiklere defer ekleyen birkaç satır.

Çözüm

Erteleme kuralı kaldırılmaz — sadece muafiyet listesi kazanır. WordPress çekirdek betikleri ve WooCommerce blok betikleri ertelenmemelidir.

add_filter( 'script_loader_tag', function ( $tag, $handle ) {

    // Ertelenmemesi gereken tanıtıcılar
    $skip_prefixes = array( 'wp-', 'wc-', 'woocommerce' );
    $skip_exact    = array( 'jquery', 'jquery-core', 'jquery-migrate' );

    foreach ( $skip_prefixes as $prefix ) {
        if ( 0 === strpos( $handle, $prefix ) ) {
            return $tag;
        }
    }
    if ( in_array( $handle, $skip_exact, true ) ) {
        return $tag;
    }

    // Sepet ve ödeme sayfalarında hiç erteleme yapma
    if ( function_exists( 'is_checkout' ) && ( is_checkout() || is_cart() ) ) {
        return $tag;
    }

    if ( false !== strpos( $tag, ' defer' ) || false === strpos( $tag, ' src=' ) ) {
        return $tag;
    }

    return str_replace( ' src=', ' defer src=', $tag );

}, 10, 2 );

Hazır bir hız eklentisi kullanıyorsanız aynı mantık eklentinin ayar ekranından uygulanır: JavaScript erteleme/birleştirme bölümünde bir hariç tutma listesi bulunur. Oraya wp-, wc- ve woocommerce ile başlayan tanıtıcılar eklenir; mümkünse sepet ve ödeme sayfaları optimizasyondan tamamen muaf tutulur.

Doğrulama

Düzeltmeyi kanıtlamadan bitmiş saymayın:

  1. Gizli sekmede (giriş yapmadan) ürünü sepete ekleyin.
  2. Ödeme sayfasını açın; sepet dolu görünmeli.
  3. Konsolda hata olmamalı — özellikle wp is not defined gitmiş olmalı.
  4. Ödeme yöntemleri listesinin eksiksiz göründüğünü kontrol edin. Aynı hata, özel ödeme geçitlerinin blok checkout'ta hiç görünmemesine de yol açar.
  5. Önbelleği temizleyip test tekrarlayın — düzeltme, önbellekli ilk ziyarette de geçerli olmalı.

Özet

"Sepetiniz boş" hatası genellikle bir sepet hatası değil, bir betik yükleme sırası hatasıdır. Sunucu sepeti doğru bilir; onu ekrana çizecek JavaScript çalışamaz.

Genel kural: hız optimizasyonu istisnasız uygulanmaz. Toptan erteleme, birleştirme veya geciktirme kuralları WordPress çekirdek betiklerini ve ödeme akışını dışarıda bırakmalıdır. Hızın bedeli satış olmamalı.

Hızlı teşhis
Belirti
Sepet sayacı artıyor ama ödeme sayfası boş sepet gösteriyor
Kritik ipucu
Yönetici girişinde sorun yok, gizli sekmede var
Konsol hatası
Uncaught ReferenceError: wp is not defined
Kök neden
Tüm betiklere istisnasız defer eklenmesi
Çözüm
wp-, wc-, woocommerce tanıtıcılarını erteleme dışında bırak
Ek koruma
Sepet ve ödeme sayfalarında optimizasyonu tamamen kapat
İlgili belirti
Özel ödeme geçidi blok checkout'ta hiç görünmüyor
Sık Sorulan Sorular

Bu hata hakkında.

Sepete ürün ekleniyor ama ödeme sayfası boş diyor, neden?

Büyük olasılıkla sunucu sepeti doğru biliyor ama sepeti ekrana çizen JavaScript çalışamıyor. Blok tabanlı sepet ve ödeme sayfaları WordPress'in wp nesnesine bağımlıdır; bir hız eklentisi tüm betikleri ertelediğinde bu nesne zamanında tanımlanmaz ve blok kendini boş sepet olarak çizer.

Sorun neden yalnızca giriş yapmamış ziyaretçilerde görünüyor?

Çünkü hız eklentilerinin çoğu, giriş yapmış kullanıcılar için önbellek ve betik optimizasyonunu devre dışı bırakır. Yönetici olarak siteyi gezerken optimizasyon uygulanmaz ve hata oluşmaz. Bu yüzden testleri her zaman gizli sekmede, giriş yapmadan yapmak gerekir.

Önbelleği temizlemek çözüm mü?

Hayır. Geçici olarak düzelmiş gibi görünebilir çünkü ilk yüklemede betik zamanlaması değişir, ama sorun kısa süre sonra tekrarlar. Kalıcı çözüm, erteleme kuralına WordPress çekirdek ve WooCommerce betiklerini hariç tutan bir liste eklemektir.

Hız için JavaScript ertelemeyi tamamen kapatmalı mıyım?

Gerekmez. Erteleme, ödeme akışı dışındaki sayfalarda değerli bir kazanç sağlar. Yapılması gereken, kuralı istisnasız uygulamamak: wp-, wc- ve woocommerce ile başlayan betikleri muaf tutmak ve sepet ile ödeme sayfalarında optimizasyonu tamamen kapatmak yeterlidir.

Teklif ve Uygunluk

Yerel aramada görünür.
Üründe inandırıcı.