Küresel görevlere güvenelim mi?


21

@toscho, bu düşünceye, tekrar düşünmemi sağlayan bir yorum yaptı . Dünya çapında, özellikle de benzeri ülkelerle ilgili olarak ne kadar güven duymalıyız $post?

Ne olmuş yani? Genel değişken, kontrolünüz yapılmadan önce herkesin üzerine yazılabilir. Global değişkenlerin amacı bu: global erişim.

$postörneğin, kesinlikle temanın içinde ya da eklentiler tarafından en çok modifiye edilen küresellerden biridir. Yine de, örneğin ilgili gönderileri ayarlamak için, belirli bir şablon içindeki diğer uygulamalarda en yaygın kullanılan globaldir.

Özel sorguların kullanımının neden olduğu belirli sorunları olan birkaç gönderiyi yanıtlamak (ve yorumlamak) yerine, çoğu sorunun sıfırlanmayan özel sorgular nedeniyle ortaya çıktığı (özel sorgular ana sorgu tarafından belirlenen küreleri değiştirir) ortaya çıkmaktadır.

Bundan, $postgüvenilir olmadığı açıktır . Özel bir sorguyu kullanan kötü yazılmış herhangi bir kod parçası, $postgenel olarak değiştirebilir ve bu da bir şeyleri kırar (ilgili yazılar gibi).

Yalnızca bir avuç WordPress geliştiricisi, çekirdeğin iç işleyişinde yeterince bilgilidir ve neyin kaçınıp neyin kaçınmayacağını bilir. Daha fazla kullanıcı popülasyonunun WordPress çekirdeğinin nasıl çalıştığı hakkında hiçbir fikri yok.

Onlar sadece bir tema indirir ve gerekli olanı yapmak için eklentileri yüklerler, hatta bir öğreticiden kodu kopyalarlar. İlgili yazılarını tek yazılarına ayıran kötü yazılmış bir eklenti yüklediklerini söyleyin, buna neyin neden olduğunu nasıl anlayacaklar? Bunu kendi başlarına çözebilecekler mi veya tema yazarına bu sorun hakkında bir e-posta yazacak veya bu siteye bir soru gönderecek yüzüncü kişi olacak mı?

Sorum şu: Genel bir $postbenzeri güvenilmez olduğunda, ithal edilen diğer kodların neden olduğu bu sorunlara karşı nasıl korunabilirsiniz ? Hiç böyle bir global kullanıyor muyuz $post? Alternatifler neler?

Karar vermeden önce aklımı burada paylaşmak: Global'in ana sorgunun sıfırlandığından emin olmak için kullanmadan wp_reset_postdata()ya da kullanmadan wp_reset_query()önce ya da bazı temalarda ve eklentilerde de gördüm . Fakat neden başkası eklentisini düzgün bir şekilde kodlamadığı için kodumu temamda şişirmeliyim? Birisi özel sorgusunu düzgün bir şekilde sıfırladıysa, bu işlem gereksiz bir ikinci kez yapılır, bu iyi bir şey değildir.$post$post

Düşündüğüm ikinci yöntem ise yöntemini kullanmak $wp_queryve sonra da yöntemlerini kullanmak $wp_query->post.

Bu konuda herhangi bir düşünce takdir edilecektir.


Gönderiyi sıfırlamak sadece bir var diğerini kopyalar, kodunuzda milyonlarca kez arayabilir ve performansta herhangi bir isabet göremezsiniz, bu yüzden bu konuda neyin iyi olmadığını bilmiyorum.
Milo

Yanıtlar:


16

Hiç emin olamaz: Bir üzücü gerçek vardır bazı kod kırmak olmaz senin kodu ve orada hiçbir şey bunu önlemek için ne yapabilirim. Özellikle her şeyin küresel olduğu WordPress'te .

Yani evet, küresel dedi $postkadar özel kullanarak, en kullanılan global var biridir bakımı ne için olabilir iyi bir fikir.

Benim kodumla nadiren doğrudan küresel erişiyorum $post.

Ne zaman içinde tekil yarışma, kullandığım get_queried_object()olmadığını kontrol genellikle ve $postbir geçerli WP_Postörneği:

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

$postDoğrudan kontrol ettiğim nadir durumlarda da bu kontrolü yapıyorum .

get_queried_object()Bazı kodlar kullanırsa beklenmeyen bir değer döndürdüğünü düşünün query_posts, ancak hey, eğer birileri güvenilir kodlar kullanıyorsa , query_postssiteleri bozulursa hak eder :)

Dahası, bazı koşullar beklersem bunları kontrol ediyorum, örneğin belirli posta tipleri veya belirli bir durum.

Daha fazla kontrole ihtiyacım olursa ve daha fazla yerde, bunları yapmak için bir işlev oluştururum:

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

Özel bir sorgu içindeyken, döngüdeyken, çağrı the_post(), post nesnesini sıfırlar, bu nedenle iyi olması gerekir. O zaman wp_reset_postdata()özel bir sorgudan sonra aramak benim sorumluluğum ve bunu elbette yapıyorum :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.