WordPress kancalarını nereye koymalısınız?Bağlı olmak

Bir WordPress geliştiricisi olduğum sürece, birçok kişi “WordPress kancamı nereye eklemeliyim?” Diye sordu. Evet, bu, WordPress geliştiricileri olmayan daha fazla arkadaşa ihtiyacım olduğuna dair bir işaret, ancak bu makalenin özü değil. Tabii ki, doğru bir cevap yok. Sonunda, cevap çeşitli şeylere bağlı olsa da, bazı farklı kalıpları paylaşmak ve her birinin artılarını ve eksilerini tartışmak istiyorum. Bu nedenle, bu tartışmanın önemli noktaları kaybettiğini düşünüyorum: WordPress eklentisi Fire-aka Hooks-kodumuzu güçlü bir şekilde birleştirmede dikkatli olmamız gereken bir yangın.
Onunla etkileşime giren yangından ayrılmış bir kod yazmak, iyi bir kod yazmanın önemli bir parçasıdır. Aynı zamanda, WordPress eklentisi ateşi veya kanca, çalışma eklentisi için çok önemlidir, yangın eklentisinden ayrılmak her zaman pratik değildir. Ama bu hala önemli bir hedef. Bu her zaman mümkün olmayabilir, ancak bir test yazmanız veya geri çağrı kancasının mantığını yeniden kullanmanız gerektiğinde kendinize teşekkür edeceksiniz. Öyleyse, konuma kancalar, artılar ve eksiler eklemek için bazı yerlere bakalım. Bu kodun ne kadar güçlü veya zayıf birleştirildiğine ve neden mümkün veya sorun olmayabileceğine odaklanacağız.
Çoğumuz OOP PHP’yi WordPress bağlamında nasıl kullanacağımızı öğrendiğimizde, genellikle sınıf yapıcılarına kancalar koymayı öğreniriz. Sınıf yapıcı, sınıf kullanıldığında çalışan sihirli bir yöntemdir. Bu desen kancanın mucizevi bir şekilde eklenmesine neden olur. İşte bu modelin oldukça tipik bir uygulaması: <? Php
Term_control_1 class {
/**
* Nesneler Oluştur*/
Genel işlev __Construct () {
Add_action ('save_post', [$ this, 'save_post'], 10);
}
/**
* Gönderi güncellendiğinde, Kategori 7 olup olmadığını kontrol edin ve özel alanları ekleyin veya silin
*
* @param $ id
*/
genel işlev Save_post ($ id) {
Röforku ('save_post', [$ this, 'save_post']);
if (! boş ($ _post ['post_category'])))) && in_array (7, $ _post ['post_category'])))))) {
update_post_meta ($ id, '_fancy_cats', 1);
} değilse {
delete_post_meta ($ id, '_fancy_cats', 1);
}
}
}
yeni term_control_1 ();Bu kodda, geri dönüş çağrısı işlevinin Save_Post kancasında çalışmasına neden olacak sınıfı beyan ediyoruz.Save_post'ta, sevkiyatta belirli kategorilerin ayarlanıp ayarlanmadığını ve buna göre özel alanları güncellediğini kontrol ediyoruz.Bu kodun çalıştığından emin olmak için, dosyanın altında bir sınıf örneği oluştururuz.
Bu gerçekten işe yarıyor, ancak süper global yazı ve dolayısıyla HTTP ve eklenti yangını ile çok güçlü. Ya bu kodu başka bir yerde çalıştırmak istersek, bir Rakber Post kimliği kullanarak? Bunu yapmak için, sınıftan yapılabilecek başka örnekler oluşturmalıyız. Ayrıca mümkün ama dağınık olan Superglobal sonrası değiştirmemiz gerekiyor. Bu üniteyi nasıl test ederiz? HTTP'nin API'yı giren ve eklenti talepleriyle alay etmeliyiz. Bu yapılabilir – bkz. WP_MOCK – ama her şeyi ayrı olarak test etmek istiyorum. Bu yaklaşım başarılı ama bir sorunu var. Buna ek olarak, bir sorun olabilecek kancaları bırakamayız. Ayrıca, bu sınıf savurgan olan her istek üzerinde kullanılır. Küçük noktalar bir dosyaya baktığımızda, ancak bu model tekrarlanırsa, artar. Sınıfı kullanmadığında gerekli kancalarla başa çıkmak için işlevleri kullanarak işlevlere kancalar ekleyin, aynı zamanda nesne yönelimli tasarım yaklaşımları için de iyi. Ters çağrı işlevi, kullanılan bir işlev yalnızca belirli bir bağlamdan sınıfın ihtiyaç duyduğu doğru bağımlılığa çeviriyi işlemektir. Bu, sınıfın, herhangi bir bağlamda ve işlevin eklenti API'sına irtibat olması için kategorilere dayalı meta yayınları güncellemek için bir sistem görevi görmesini sağlar.
Bu sınıfın geçerli eklenti veya HTTP isteği ile etkileşimi yoktur. Bu onun işi değil. Bu sınıfın dikkati, diğer yangınlarla etkileşime girmemek için sistem mantığıdır. Bu, çıkarların ayrılması ilkesini izlemenin faydalarının pratik bir örneğidir.
Bu sınıf, girişi nasıl aldığını umursamıyor, sadece girdi ile ne yaptığını önemsiyor. Giriş – Post Veri ve Eklenti API ile hala bir bağlantıya ihtiyacımız var. Bu nedenle, bunun için bir işlevimiz olmalı: update_categories ();
}
} Bu işlev yalnızca bu sınıfı dış dünyaya bağlamakla ilgilidir. İyi bir bonus olarak, bu kancayı çıkarmak artık çok kolay. Daha da önemlisi, herhangi bir yazıda, herhangi bir kategori dizisiyle sınıfı yeniden kullanabiliriz. Alanı veya kategoriyi değiştirmek için bu sınıfı genişletebilir, hatta saha yöntemlerini dahili mantıktan ayrı olarak eklemek veya silmek için kullanabiliriz.
Şimdi sınıf mantığını, kanca ve geri arama işlevlerini ayrı ayrı test edebiliriz. Statik bir yöntem kullanarak, kancanızı geri çeken statik bir yönteme sahip bir sınıfa sahip olabilirsiniz. Bu strateji, daha önce tartıştığımız aynı avantajların çoğuna sahiptir, ancak aynı zamanda kodunuzu derlemek için sınıf kullanan kuruluşun faydalarını da sağlar. Bu örnek, temelde aynı şeyleri yapmak için statik yöntemlerle işlevden sınıfa geçer: update_categories ();
}
}
} Şu anda, bu mutlaka daha iyi değil. Bunlar biraz daha yavaş olabilir ve gerçek bir faydası olmayabilir. Ancak küçük bir değişiklikle, daha kullanışlı bir şey olabilir.
Kullandığımız eylemi “admin_int” olarak değiştirelim ve “Add_hooks” yöntemini bu sınıftan çağırmak için kullanalım: <? Php
Add_action ('admin_init', ['term_control_hooks', 'admin_hooks']);
Term_control_hooks sınıfı {
Statik işlev public admin_hooks () {

Add_action (‘save_post’, [__class__, ‘save_post’], 10, 2);
}
Statik genel işlev Save_post ($ id, $ post) {
if (! boş ($ _post [‘post_category’])))))) {
$ category = $ _post [‘post_category’];
$ control = yeni term_control_2 ($ posta, $ kategoriler);
$ control-> update_categories ();
}
}
} Bu örnekte, aynı şeyi yapar, ancak sistemin başka bir yönetici kancalarında çalıştırmamız gereken başka bir bölümümüz varsa, bunu diğer büyük değişiklikler olmadan yapabiliriz.
update_categories ();
}
}
Public load_scripts () {
}
} Şimdi yeni kancalar eklemek için sınıfımızda değişiklikler yalnızca yeni yöntemlere ve add_ace () veya add_fitler () çağrılarına ihtiyaç duyar. Bunu seviyorum çünkü bu sınıfı sınıf dışında mantığı korurken eklenti yangına bağlanmak için bir katman olarak tutacağım. Sınıfımda genellikle mantıklarıyla aynı sınıfa kancalar koyuyorum. Hala güçlü bir şekilde birleştirilmiştir, ancak bazen bu, ilgili kodu bir arada tutma açısından orantılıdır. Bazen okunabilirliğin avantajı diğer sorunlardan daha önemlidir. Ancak, hala yapıcıları kullanmayı sevmiyorum, çünkü nesnelerin durumunu hazırlamanın yanı sıra ikinci dikkatin bir yapıcısını veriyor. Aşağıda, sınıfın “the_concent” filtresini kullanarak bir yayına hareket etmek için bir davet mesajı ekleyeceği bir örnektir. Bu sınıfın, kancayı eklemek ve silmek için ayrı bir yöntemi ve gerçek iade çağrısı vardır:
call_to_ace = $ call_to_ace;
}
/**
* Bir filtre ekleyin
*/
Genel işlev add_hook () {
add_filter (‘the_content’, [$ this, ‘filtre_content’]);
}
/**
* Filtreyi çıkarın
*/
public işlevi remot_hook () {
remove_filter (‘the_content’, [$ this, ‘filtre_content’]);
}
/**
* İçeriği yayınlamak için CTA ekleyin
*
* @param String $ Content
*
* @dize
*/
genel işlev filtre_content ($ content) {
Geri $ içerik. $ this-> call_to_ace;
}
} Bu sınıftaki her yöntemin bir ilgisi vardır. Bu durumda, her bir işlevin veya sınıfın bir işi olması gerektiği tanımına uygun olarak, tek bir sorumluluk ilkesini takip ediyoruz. Ancak, aynı tanıma göre, sınıf değildir, çünkü bu sınıfın iki işi vardır: bir eklenti yangını ile etkileşim ve gönderme içeriği eklemek. Bu tasarımı seviyorum. Tüm sistemi tek bir ünitede korur. Sistem farklı bağlamlarda yeniden kullanılabilir. Onunla _Content filtresini kullanmamız gerekmiyor. Bu örneğe bakın: post_content = $ appender-> filtre_content ($ post-> post_content);
WP_UPDATE_POST ($ Post);
}
RAW Şimdi bir gönderi saklarken aynı değişikliği uygulamak için aynı kodu kullanıyoruz. Bu örnek, tam yangın eklentisinden kesildiğinde bu sınıfın nasıl hayatta kalabileceğini gösterir. Tom McFarlin’e göre, tek sorumluluk ilkesini “sınıf ve her yöntemin tek bir işi olmalı” diye düşünmek. Bunun yerine, “” Bu sınıf değiştirilmek istiyorsa, neyin değiştirilmesi gerekiyor? “

admin

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir