WordPress'in 'bir isteğin işlenmesi ve WordPress'in davranışını değiştirme yöntemini açıklayayım.
İsteği ayrıştırma
WordPress bir istek aldığında, isteği kesip bir sayfaya dönüştürme işlemini başlatır. Bu işlemin çekirdeği, WordPress ana sorgu yöntemi WP::main()
çağrıldığında başlar. Bu işlev, doğru olarak tanımladığınız şekilde sorguyu parse_request()
(in includes/class-wp.php
) içinde ayrıştırır . Burada, WordPress URL'yi yeniden yazma kurallarından biriyle eşleştirmeye çalışır . URL eşleştiğinde, URL parçalarının bir sorgu dizesini oluşturur ve sorgu dizesini bozmak urlencode()
gibi özel karakterlerin kullanılmasını önlemek için bu parçaları (iki eğik çizgi arasındaki her şey) kullanarak kodlar &
. Bu kodlanmış karakterler, sorunun orada yaşadığını düşünmenize neden olmuş olabilir, ancak sorgu dizesini ayrıştırırken aslında karşılık gelen "gerçek" karakterlere dönüştürülürler.
İstekle ilişkili sorguyu çalıştırma
WordPress URL'yi ayrıştırdıktan sonra, sınıfın WP_Query
aynı main()
yönteminde yapılan ana sorgu sınıfını ayarlar WP
. Sığır eti, tüm sorgu bağımsız değişkenlerinin ayrıştırıldığı ve sterilize edildiği ve gerçek SQL sorgusunun oluşturulduğu (ve sonunda çalıştırıldığı) yönteminde WP_Query
bulunabilir get_posts()
.
Bu yöntemde, 2730 satırında aşağıdaki kod yürütülür:
$q['name'] = sanitize_title_for_query( $q['name'] );
Bu, yayını mesajlar tablosundan getirmek için dezenfekte eder. Döngü içinde hata ayıklama bilgisinin çıktısı, sorunun burada yaşandığını gösterir: posta adınız, my-permalink~
dönüştürülür ve my-permalink
daha sonra posta veritabanından alınmak için kullanılır.
Post başlık sanitasyon fonksiyonu
İşlev , başlığı sterilize etmeye devam eden uygun parametrelerle sanitize_title_for_query
çağırır sanitize_title
. Şimdi bu işlevin özü sanitize_title
filtreyi uyguluyor :
$title = apply_filters( 'sanitize_title', $title, $raw_title, $context );
Bu filtre, doğal WordPress bir fonksiyon olarak, kendisine bağlı olan: sanitize_title_with_dashes
. Burada bulunan bu işlevin ne yaptığına dair kapsamlı bir genel bakış yazdım . Bu işlevde, soruna neden olan çizgi
$title = preg_replace('/[^%a-z0-9 _-]/', '', $title);
Bu satır alfasayısal karakterler, boşluklar, kısa çizgiler ve alt çizgiler hariç tüm karakterleri ayırır.
Sorununuzu çözme
Bu nedenle, temel olarak sorununuzu çözmenin tek bir yolu vardır: sanitize_title_with_dashes
işlevi filtreden kaldırmak ve yerine kendi işleviniz koymak . Bunu yapmak o kadar da zor değil, ama :
- WordPress, başlıkların sterilize edilmesi sürecini değiştirdiğinde, bunun web siteniz üzerinde büyük etkileri olacaktır.
- Bu filtreye bağlanan diğer eklentiler yeni işlevselliği doğru şekilde işlemeyebilir.
En önemlisi : WordPress, sanitize_title
işlevin sonucunu doğrudan bu satırdaki SQL sorgusunda kullanır :
$where .= " AND $wpdb->posts.post_name = '" . $q['name'] . "'";
Filtreyi değiştirmeyi düşünürseniz, sorguda kullanılmadan önce başlıktan uygun şekilde kaçtığınızdan emin olun!
Sonuç: güvenlik söz konusu olduğunda sorununuzu çözmek gerekli değildir, ancak bunu yapmak istiyorsanız, sanitize_title_with_dashes
kendi işlevinizle değiştirin ve SQL çıkışına dikkat edin.
Not: Tüm dosya adları ve satır numaraları WordPress 4.4.2 dosyalarına karşılık gelir.