WordPress'in wptexturize filtresi, satır içi JavaScript'i sessizce bozuyor; mantıksal && operatörünü HTML varlığı olan && haline getirerek shortcode'lar içinde çalışan script'lerin bozulmasına neden oluyor.

Sorun, bir dizi hesap makinesi shortcode'unu yöneten bir geliştiricinin karşısına çıktı. Haftalarca kusursuz çalışan gönder (submit) butonları aniden yanıt vermeyi bıraktı. Ne bir PHP uyarısı ne de bir konsol hatası vardı; incelenen HTML temiz görünüyordu—ta ki işlenmiş kaynak kod if (!isNaN(bf) && bf > 0) ifadesini ortaya çıkarana kadar. Tek bir sözdizimi (syntax) hatası, tüm script bloğunun çalışmasını engelledi.

Filtre neden önemli?

WordPress, yazı içeriğini tarayıcıya ulaşmadan önce bir dizi filtre aracılığıyla işler. wptexturize bu filtrelerin ilki; düz tırnak işaretlerini tipografik kıvrımlı tırnaklara dönüştürür, ardışık tireleri uzun tirelerle (em-dash) değiştirir ve ampersand (&) işaretlerini temizler. Filtre, kodla değil, düz yazı ile uğraştığını varsayar. Bir shortcode satır içi bir <script> etiketi eklediğinde, filtre hala çalışmaya devam eder ve JavaScript'i sıradan bir metin gibi işler. Bu nedenle && içindeki ampersand işareti &#038; olarak kaçış karakterine (escape) dönüştürülür; tarayıcı da bunu mantıksal VE (AND) operatörü yerine düz bir metin dizisi olarak yorumlar.

Yazı içeriğine doğrudan JavaScript gömen geliştiriciler (hesap makineleri, form doğrulayıcılar, etkileşimli widget'lar) bu durumdan etkilenir. Sorun sadece hesap makineleriyle sınırlı değildir; &&, & veya benzeri karakterler kullanan tüm satır içi script'ler bozulabilir. Dönüşüm sunucu tarafında gerçekleştiği için tarayıcı orijinal kodu asla görmez ve hata, tipik bir JavaScript istisnası (exception) olarak ortaya çıkmaz.

Kimler etkileniyor ve neler kaybediyorlar?

  • Site sahipleri: Bozuk bir hesap makinesi veya form, ziyaretçileri hayal kırıklığına uğratabilir, hemen çıkma oranlarını (bounce rates) artırabilir ve güveni sarsabilir.
  • Geliştiriciler: Loglarda veya konsol çıktısında hiçbir iz bırakmayan "hayalet" hataları aramakla geçen saatler.
  • İçerik editörleri: Shortcode içeren sayfaları düzenlerken farkında olmadan işlevselliği bozabilirler.

Maliyet sadece zamanla sınırlı değildir; özellikle fiyatlandırma, kredi tahminleri veya sağlık değerlendirmeleri için özel hesap makinelerine güvenen sitelerde, kaybedilen dönüşümlere (conversions) dönüşebilir.

Filtrenin ne yaptığı (basitçe)

  1. Düz tırnakları tespit eder' ve " işaretlerini "akıllı" tipografik versiyonlarıyla değiştirir.
  2. Ampersand işaretlerini temizler – halihazırda geçerli bir HTML varlığı oluşturmadığı sürece & işaretini &amp; şekline dönüştürür.
  3. Tüm içerik dizisine uygulanır – shortcode'lar tarafından oluşturulan <script> etiketlerinin içindekiler de dahil.

Filtre && ile karşılaştığında, mevcut bir HTML varlığının parçası olmayan iki ampersand görür ve bu nedenle her birini ayrı ayrı kaçış karakterine dönüştürerek &#038;&#038; sonucunu verir.

Bozulma nasıl durdurulur?

1. Kod içeren sayfalar için filtreyi kapatın

add_action( 'template_redirect', function () {
    if ( is_page() ) {
        remove_filter( 'the_content', 'wptexturize' );
        remove_filter( 'widget_text_content', 'wptexturize' );
    }
} );

Bu kod parçacığı, wptexturize filtresini yalnızca sayfa şablonlarında devre dışı bırakarak yazılar ve diğer içerik türleri için tipografik iyileştirmeleri korur. Ayrıca, satır içi script'lerin ikincil bir kaynağı olabilecek widget metinlerinden de filtreyi kaldırır.

2. && kullanımından kaçınmak için mantığı yeniden yazın

Filtreyi kaldırmak istenmiyorsa, mantıksal VE operatörüne ihtiyaç duyulmayacak şekilde JavaScript'i yeniden yapılandırın (refactor):

// Original
if (a && b) { … }

// Refactored
var ok = a;
if (ok) { ok = b; }
if (ok) { … }

Bu yöntem birkaç ekstra satır eklese de filtreyi tetikleyen ampersand işaretini ortadan kaldırır. Bu yaklaşım basit koşullar için işe yarar ancak karmaşık ifadeler için hantal hale gelebilir.

3. Tüm script'leri harici hale getirin

En sağlam çözüm, kodu satır içi gömmek yerine JavaScript dosyalarını kuyruğa eklemektir (enqueue):

wp_enqueue_script( 'my-calculator', get_template_directory_uri() . '/js/calculator.js', [], null, true );

Kuyruğa eklenen script'ler the_content filtrelerini tamamen atlar. Ayrıca tarayıcı önbelleklemesinden yararlanırlar ve küçültülebilir (minify) veya diğer varlıklarla paketlenebilirler.

Sorunu gerçek ortamda tespit etme

Bir script bariz bir hata vermeden çalışmayı durdurduğunda, sayfa kaynağını (DOM denetleyicisini değil) görüntüleyin ve &#038; ifadesini arayın. Eğer bunu bir <script> bloğu içinde bulursanız, suçlu filtredir. Sorun konsolda görünmeyecektir çünkü tarayıcı ayrıştırılmak üzere sözdizimsel olarak geçerli bir script hiç almamıştır.

Karşı görüş: wptexturize neden tutulmalı?

wptexturize, ön yüzde okunabilirliği artırır. Kıvrımlı tırnaklar ve düzgün tire karakterleri, düz yazıya daha profesyonel bir görünüm kazandırır ve birçok site sahibi bunu vazgeçilmez bir estetik özellik olarak görür. Filtreyi küresel olarak kaldırmak, metni ham ve tipografik olarak sade haline geri döndürecektir.

Taviz yolu, seçici olarak devre dışı bırakmaktır: filtreyi yalnızca kodun bulunduğu yerlerde kapatın veya çıktısını metinleştirme (texturizing) işleminden muaf tutulduğunu açıkça belirten özel bir kısa kod (shortcode) kullanın. WordPress halihazırda wp_kses_post ve diğer temizleme (sanitisation) yardımcılarını sunmaktadır; geliştiriciler, her iki yöntemin de avantajlarından yararlanmak için bunları remove_filter çağrılarıyla birleştirebilir.

Bundan sonra neye dikkat edilmeli

WordPress çekirdeği (core), <script> etiketlerini otomatik olarak muaf tutacak bir wptexturize değişikliği henüz duyurmadı. Böyle bir değişiklik yapılana kadar, geliştiriciler satır içi (inline) kodlarını manuel olarak korumalıdır. Filtreyi bağlam duyarlı (context-aware) hale getirmeye yönelik öneriler için çekirdek geliştirme takipçisini (core development tracker) takip edin. Bu süreçte, JavaScript enjekte eden tüm kısa kodları (shortcode) veya sayfa oluşturucu (page builder) öğelerini denetleyin ve yukarıdaki üç düzeltmeden birini uygulayın.

Özetle: Eğer WordPress siteniz satır içi (inline) JavaScript çalıştırıyorsa, wptexturize'ın bunu sessizce yeniden yazmadığını doğrulayın. Kaçış karakteri eklenmiş (escaped) tek bir ampersand (&) işareti bile tüm bir özelliğin işlevsiz kalmasına neden olabilir; çözüm ise genellikle birkaç satır PHP kodu veya harici scriptlere geçiş yapmaktır.