Ü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.
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.
Bu hatanın imzası oldukça belirgindir:
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.
Bu hatayla karşılaşan çoğu kişi sırayla şunları dener ve hiçbiri kalıcı sonuç vermez:
Bu denemelerin ortak hatası, sorunu sunucu tarafında aramak. Oysa sunucu sepeti doğru biliyor — kanıtı, sepet sayacının artması.
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.
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:
<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.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.
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.
Düzeltmeyi kanıtlamadan bitmiş saymayın:
wp is not defined gitmiş olmalı."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ı.
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.
Çü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.
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.
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.