WordPress'te İç İçe Döngüler Kullanmanın Sorunları
Sabah saat 8:00. Bisiklet ve metro yolculuğundan sonra işe başladım. Dragon Ball bardağımdan yayılan kahve kokusu duyularımı uyandırıyor ve kendimi iyi hissediyorum. Tarayıcımı ve kod düzenleyicimi açmanın (ki bu elbette Vim'dir – Atom kullanmamın imkanı yok) ve bazı işleri halletmenin zamanı geldi.
Kahvemden ilk yudumumu alırken, gelen kutumdaki tek destek biletini okudum: görünüşe göre, Nelio İçeriğiyle ilgili sorunu olan bir müşteri var— eklentimiz sosyal mesajları düzgün şekilde paylaşmıyor. Tuhaf! AFAIK, bu sorun sadece onun başına geliyor, bu yüzden kurulumuyla ilgili bir sorun olduğuna eminim… Bahse girerim üçüncü taraf bir eklentidir . Her zaman öyledir.
Güne başlamanın en iyi yolu bu değil ama en azından eğlenceli bir gün olacağını biliyorum. Şimdi neler olduğunu araştırma zamanı… WordPress geliştirmenin kolay olduğunu kim söyledi? Birkaç saat içinde Toni ve ben neyin yanlış olduğunu bulabildik: WordPress Döngüsü. Ya da, eğer kesin olursam, Nested WordPress Loops demeliyim.
Ne olduğunu ve nasıl düzelttiğimizi bilmek ister misiniz? Okumaya devam edin ve WordPress döngüsü hakkında daha fazlasını keşfedin!
Hızlı Hatırlatma—WordPress Döngüsü Nedir?
Birkaç yıl önce Antonio Villegas , WordPress döngüsünün ne olduğunu, nasıl çalıştığını, onu nasıl değiştirebileceğinizi ve bazı gelişmiş püf noktalarını açıklayan bir dizi yazı yazdı. Ne yazık ki, sadece İspanyolca olarak mevcutlar… ama eğer ilgileniyorsanız, bize bildirin, biz de onları İngilizce'ye çevirelim. Her neyse, bu gönderileri beğendim çünkü konuya çok iyi bir giriş yaptılar:
WordPress Döngüsü, web sitenizdeki bir sayfaya gittiğinizde hangi içeriğin (yazılar, sayfalar veya özel içerik) görüntüleneceğini belirler. (…)
Esasen WordPress şu şekilde çalışır: Döngü, bir dizi parametreyi hesaba katarak, kullanıcınızın ilgilendiği gönderileri elde etmek için WordPress veritabanını sorgular.
Başka bir deyişle, döngü, WordPress'in bir dizi gönderiyi alma ve onları “manipüle etme” (genellikle ekranda görüntülemek için) yolundan başka bir şey değildir. Döngünün çok basit bir örneğini görelim:
Tüm farklı parçaları tanımlayabiliyor musunuz? Çok basit, bakın: 3-6. satırlarda aramamızın parametrelerini belirliyoruz (bu durumda 5 gönderi istiyoruz), 9 ve 10. satırlarda bulduğumuz tüm gönderileri gözden geçiriyoruz (temelde yazdırıyoruz) başlıkları bir listede) ve son olarak 15. satırda bu döngüyü geri alıyoruz ve sorguyu WordPress'in yaptığı her şeye sıfırlıyoruz.
Artık döngünün nasıl çalıştığını anladığınıza göre, Nelio'da bize ne olduğunu görelim.
Birden Fazla Döngüyü Aynı Anda Çalıştırmak
Eklentimizde , bir gönderinin tanımlayıcısı verildiğinde, onunla ilgili verileri içeren bir dizi döndüren basit bir işlev tanımladık. Bunun gibi bir şey:
Gördüğünüz gibi, güneşin altında yeni bir şey yok. Bu fonksiyonda, döngüyü 5-7 satırları üzerinde oluşturuyoruz, sorguladığımız yazının 9-12 satırlarda olduğundan emin oluyoruz ve olağan işi yapıyoruz: gönderiyi yüklüyoruz (satır 14), yapacağımız diziyi oluşturuyoruz. dön ve bitir. Oldukça basit, değil mi?
Örneğin, bu işlevi 1 posta kimliğiyle çağırdığımızı ve beklediğimiz sonucun bir sonraki olduğunu varsayalım:
Şaşırtıcı bir şekilde, müşterimizin kurulumunda çalıştırdığımızda elde ettiğimiz şey bu:
Gördüğünüz gibi, başlık artık İlk Gönderim değil, tamamen farklı bir şey. Açıklanamayan bir nedenden dolayı, işlevimiz, merak ediyorsanız, blogumuzdaki farklı bir gönderiye karşılık gelen Bazı Rastgele Başlık döndürdü. Burada ne oluyor yahu? Görünüşte basit olan işlevimiz neden bu kadar sefil bir şekilde başarısız oluyor? Açıklama basit ve talihsiz…
Lanet olsun, İç İçe Döngüler!
Müşterimiz, bir gönderinin içeriğine ilgili gönderilerin bir listesini ekleyen bir eklenti yükledi. Özünde, bu diğer eklenti şunları yapar:
Yani, bu diğer eklenti temel olarak ilgili gönderileri aramak için yeni bir döngü başlatır (örnekte sadece 25 gönderisini yüklüyoruz), bu gönderileri alır, içeriğe ekler ve wp_reset_postdata() kullanarak "orijinal sorguyu" sıfırlar. . Çok uzak çok iyi.
Şimdi dikkat edin: Bu snippet ne zaman yayınlanıyor? Bu, the_content bağlı bir işlevdir, bu nedenle the_content filtresi her çalıştığında bu snippet de çalışır. Başka bir deyişle, bu üçüncü taraf eklentisi etkinse, (en azından) eklentimiz 18. satırları çalıştırdığında çalışır! ? Öyleyse, eklentimizde yürütme 19. satıra ulaştığında, sorgunun değişmiş olması çok olasıdır… 25 yazının başlığı nedir?
Ne…! İşte orada! Yüklediğim başlık 25 tekabül ediyor, bu aslında iç içe döngünün kendi döngümün üzerine yazdığı ve benim kendi gönderime yapılan referansı kaybettiğim anlamına geliyor. ??
Çoklu İç İçe Döngülerle Nasıl Çalışılır ve Sorunlardan Kaçının
En azından sonunda neler olduğunu biliyoruz. İç içe döngüler oldukça yaygındır, bu yüzden artık neyin yanlış olduğunu bildiğimize göre, çözüm basit ve anlaşılır olmalıdır. Yoksa öyle mi? Cevabı Codex'te bulamadım, bu yüzden WordPress Forumlarında sordum…
…ve birkaç dakika sonra Pascal Birchler'den bir cevap aldım (ne kadar harika!).
Ne yazık ki, cevap çok rahatlatıcı değildi. Temel olarak, paylaştığım snippet'lerle ilgili iki sorun var:
-
wp_reset_postdataönceden etkin olan sorguyu değil, ana döngünün sorgusunu sıfırlar. Başka bir deyişle, üçüncü taraf eklentisi sorgumuzu geri yükleyemez… ? - Bu sorunu çözmenin önerilen yolu, ilk etapta onu tanıtmamaktır! Yani, filtreleri tetikleyebilecek aramaları hiç kullanmayın. ?
Aldığım ücretsiz ve ilgisiz destek için çok minnettar olmama rağmen, gerçek şu ki çözümden memnun değildim. Uygulamamı kullanmak ve "filtre korumalı" olmak istedim, bu yüzden farklı ve radikal bir düzeltmeyi seçtim: bir şablon etiketini her çalıştırdığımda, emin olmak için $query->reset_postdata() ) manuel olarak sıfırlarım. her zaman doğru gönderiyle çalışıyorum:
Dürüst olmak gerekirse, bu çözümle pek gurur duymuyorum? Açıkça bir geçici çözüm mü?… ama, hey, en azından işe yarıyor! ?
Ve bugünlük bu kadar! Yeni bir şeyler öğrendiğini umuyordum. Ve bu soruna daha iyi bir çözüm biliyorsanız, lütfen bana bildirin?
Unsplash'ta Öne Çıkan Resim Paul.
ev borcu WordPress sitesi