İletişim telefonunu düzenledikten sonra ana sayfa başlığının boşaldığını görmek, çoğu zaman içerik kaybından ziyade tema panelinin kayıt mantığıyla ilgilidir. Birden fazla sekmesi olan panelde her form yalnızca o sekmenin alanlarını gönderir. Kayıt kodu bütün ayarları aynı anda güncellerse, gönderilmeyen alanları boş değer kabul edip mevcut bilgilerin üzerine yazabilir.
Gönderilmemiş alanla boş bırakılan alanı ayırın
SEO sekmesinde başlık ve açıklama bulunurken telefon alanı başka sekmede olabilir. Bu form gönderildiğinde phone anahtarı POST verisinde yoktur. Kullanıcının telefonu silmek istemesiyle formun telefon alanını hiç içermemesi aynı şey değildir. Kayıt kodunun bu ayrımı bilmesi gerekir.
Basit bir metin alanında anahtar yoksa mevcut değeri koruyun. Anahtar varsa ve değer boşsa, kullanıcının bilinçli olarak alanı temizlemesine izin verin. Her alanı $_POST['alan'] ?? '' ile okuyup koşulsuz güncellemek bu iki durumu birleştirir. Sonuçta ilgisiz ayarların silinmesi, formların kapanması veya menü tercihlerinin kaybolması görülebilir.
Sekme için izin verilen alanları tanımlayın
Paneldeki bütün seçenekleri tek listede güncellemek yerine her sekmenin kaydedebileceği alanları belirlemek daha denetlenebilir bir yöntemdir. Örneğin SEO sekmesi yalnızca SEO başlığı ve açıklamasını, iletişim sekmesi telefon ve form görünürlüğünü yönetebilir. Gönderilen keyfi bir option adını doğrudan veritabanına yazmayın.
Bir kayıt isteğinde önce kullanıcının uygun yetkiye sahip olduğunu kontrol edin. Ardından nonce doğrulamasını yapın. WordPress belgeleri nonce değerinin yetkilendirme yerine geçmediğini özellikle belirtir; ikisi farklı kontrollerdir. Kullanıcının yalnızca panel sayfasını görebilmesi, her kaydetme isteğinin otomatik güvenli olduğu anlamına gelmez.
Onay kutusunun özel durumunu ele alın
HTML onay kutusu seçili olmadığında çoğunlukla form verisine dahil edilmez. Bu nedenle yalnızca “anahtar varsa kaydet” yaklaşımı, kutunun kapatılmasını engelleyebilir. Ancak bütün sekmelerde eksik kutuyu kapalı kabul etmek de hatalıdır: SEO sekmesinde iletişim formu kutusu zaten yoktur.
Doğru ayrım, ilgili sekme kaydedilirken o sekmenin onay kutusunu kontrol etmektir. İletişim sekmesindeki form kutusu gönderilmemişse kapalı olarak kaydedilebilir. Başka bir sekmenin kaydında ise aynı ayara dokunulmaz. Bu yaklaşımı renk tercihi, bildirim seçeneği ve benzeri alanlar için de düşünün.
Alan türüne uygun temizleme kullanın
Tek satırlı başlık, çok satırlı açıklama, e-posta ve URL aynı türde veri değildir. WordPress’in ilgili temizleme fonksiyonlarını kullanın ve çıktı verirken bulunduğu HTML bağlamına uygun kaçış işlemini uygulayın. Temizleme ile çıktı kaçışı aynı görevi yerine getirmez; kayda uygun hâle getirilen veri, HTML özelliğine basılırken de doğru işlenmelidir.
Analytics gibi script alanı ayrıca değerlendirilir. Normal metin temizliği script etiketini bozabilir. Öte yandan bütün kullanıcıların filtrelenmemiş kod kaydetmesine izin vermek de doğru değildir. WordPress’in unfiltered_html yetkisiyle sınırlandırılan bir alan, yalnızca uygun yönetici tarafından düzenlenmelidir. Çoklu site kurulumlarında bu yetkinin farklı davranabileceğini unutmayın.
Hatanın düzelmesini nasıl doğrularsınız?
Önce ana sayfa başlığı, telefon, menü ikonu ve form kutusuna farklı değerler girin. SEO sekmesini kaydedin ve diğer değerlerin korunduğunu kontrol edin. Ardından iletişim formu kutusunu kapatıp kaydedin; kutunun gerçekten kapandığını ama SEO başlığının değişmediğini doğrulayın. Son olarak metin alanını bilinçli olarak boş bırakın ve temizleme işleminin gerçekleştiğini kontrol edin.
Testi yalnızca “Ayarlar kaydedildi” mesajına bakarak bitirmeyin. Kaydedilen veriyi ve ziyaretçi tarafındaki görünümü birlikte inceleyin. Yanlış bir kayıt davranışı tekrar ediyorsa veritabanından her seferinde eski değeri geri almak kalıcı çözüm değildir. Sorunu formun gönderdiği alanlar ile kayıt kodunun güncellediği alanların karşılaştırılması ortaya çıkarır.
Kaynaklar
WordPress — Nonces ve current_user_can. Sekme örnekleri bu rehberin uygulama senaryosudur.
Yazı hakkında konuş