Bir WordPress Eklentisini Genişletilebilir Hale Getirme
Yayınlanan: 2022-03-10Hiç bir eklenti kullandınız ve biraz farklı bir şey yapmasını dilediniz mi? Belki de eklentinin ayarlar sayfasının kapsamı dışında benzersiz bir şeye ihtiyacınız vardı.
Ben şahsen bununla karşılaştım ve bahse girerim sizde de var. Bir WordPress eklenti geliştiricisiyseniz, büyük olasılıkla bazı kullanıcılarınız eklentinizi kullanırken bununla da karşılaşmıştır.
İşte tipik bir senaryo: Sonunda, ihtiyacınız olan her şeyi yapan eklentiyi buldunuz - küçük bir önemli şey dışında. Bu küçücük şeyi etkinleştirmek için herhangi bir ayar veya seçenek yoktur, bu nedenle belgelere göz attığınızda bu konuda hiçbir şey yapamayacağınızı görürsünüz. Özelliği WordPress eklentisinin destek forumunda talep ediyorsunuz - ancak zar yok. Sonunda, onu kaldırır ve aramaya devam edersiniz.
Bu eklentinin geliştiricisi olduğunuzu düşünün. Bir kullanıcı belirli bir işlevsellik isterse ne yapardınız?
İdeal olan onu uygulamaktır. Ancak özellik çok özel bir kullanım durumu için olsaydı, eklemek pratik olmazdı. Kullanıcılarınızın yalnızca %0,1'inin kullanabileceği bir eklenti ayarına sahip olmak iyi olmaz.
Yalnızca kullanıcılarınızın çoğunu etkileyen özellikleri uygulamak istersiniz. Gerçekte, kullanıcıların %80'i özelliklerin %20'sini kullanır (80/20 kuralı). Bu nedenle, herhangi bir yeni özelliğin çok talep edildiğinden ve uygulamadan önce kullanıcılarınızın %80'inin bundan yararlanacağından emin olun. İstenen her özellik için bir ayar oluşturduysanız, eklentiniz karmaşık ve şişkin hale gelir ve kimse bunu istemez.
En iyi seçeneğiniz, eklentiyi genişletilebilir, kod açısından akıllı hale getirmektir, böylece diğer insanlar onu kendi ihtiyaçları için geliştirebilir veya değiştirebilir.
Bu makalede, eklentinizi genişletilebilir yapmanın neden iyi bir fikir olduğunu öğreneceksiniz. Bunu yapmayı nasıl öğrendiğime dair birkaç ipucu da paylaşacağım.
Bir Eklentiyi Genişletilebilir Yapan Nedir?
Özetle, genişletilebilir bir eklenti, nesne yönelimli programlamanın SOLID ilkelerinin "O" kısmına, yani açık/kapalı ilkesine bağlı olduğu anlamına gelir.
Açık/kapalı ilkesine aşina değilseniz, temel olarak, bir şeyi değiştirmek için diğer kişilerin kodunuzu düzenlemesi gerekmemesi gerektiği anlamına gelir.
Bu ilkeyi bir WordPress eklentisine uygulamak, içinde başkalarının davranışını değiştirmesine olanak tanıyan hükümler varsa, bir eklentinin genişletilebilir olduğu anlamına gelir. Tıpkı WordPress'in insanların WordPress'in farklı alanlarına "bağlanmasına" izin vermesi gibi, ancak eklenti düzeyinde.
Tipik Bir Eklenti Örneği
Olmayan bir örnek eklenti ile başlayarak, genişletilebilir bir eklentiyi nasıl oluşturabileceğimizi görelim.
En son üç gönderinin başlıklarını görüntüleyen bir kenar çubuğu widget'ı oluşturan bir eklentimiz olduğunu varsayalım. Eklentinin kalbinde, bu üç gönderinin başlıklarını liste etiketlerinde basitçe saran bir işlev bulunur:
function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); $posts = get_posts( $args ); $output = '
- ';
foreach ( $posts as $post ) {
$çıktı .= '
- ' $post->post_title . ' '; } $çıktı .= '
Bu kod çalışıp işi bitirirken, oldukça genişletilebilir değildir.
Niye ya? İşlev kendi yöntemleriyle ayarlandığından, kodu doğrudan değiştirmeden davranışını değiştirmenin bir yolu yoktur.
Bir kullanıcı üçten fazla gönderi görüntülemek veya belki de gönderilerin başlıklarını içeren bağlantılar eklemek isterse ne olur? Bunu yukarıdaki kodla yapmanın bir yolu yok. Kullanıcı, eklentinin nasıl çalıştığına takılıp kalıyor ve onu değiştirmek için hiçbir şey yapamıyor.
Yüz Ayar Dahil Cevap Değil mi
Kullanıcıların özelleştirmesine izin vermek için yukarıdaki eklentiyi geliştirmenin birkaç yolu vardır.
Böyle bir yol, ayarlara birçok seçenek eklemek olabilir, ancak bu bile kullanıcıların eklentiden isteyeceği tüm olasılıkları karşılamayabilir.
Kullanıcı aşağıdakilerden herhangi birini yapmak isterse ne olur (senaryolara daha sonra tekrar bakacağız):
- WooCommerce ürünlerini veya belirli bir kategorideki gönderileri görüntülemek;
- öğeleri basit bir liste yerine başka bir eklenti tarafından sağlanan bir karuselde görüntüleyin;
- özel bir veritabanı sorgusu gerçekleştirin ve ardından bu sorgunun gönderilerini listede kullanın.
Widget'ımıza yüz ayar ekleseydik, yukarıdaki kullanım durumlarını ele alabilirdik. Ancak bu senaryolardan biri değişirse ve şimdi kullanıcı yalnızca şu anda stokta olan WooCommerce ürünlerini görüntülemek isterse? Widget'ın buna uyum sağlaması için daha da fazla ayara ihtiyacı olacaktır. Çok yakında, bir gazilyon ayarımız olacak.
Ayrıca, çok sayıda ayar içeren bir eklenti tam olarak kullanıcı dostu değildir. Mümkünse bu yoldan uzaklaşın.
Peki, bu sorunu nasıl çözeceğiz? Eklentiyi genişletilebilir hale getirirdik.
Genişletilebilir Hale Getirmek İçin Kendi Kancalarımızı Ekliyoruz
Eklentinin yukarıdaki kodunu inceleyerek ana işlevin gerçekleştirdiği birkaç işlem görüyoruz:
-
get_posts
kullanarak gönderileri alır. - Yazı başlıklarının bir listesini oluşturur.
- Oluşturulan listeyi döndürür.
Diğer insanlar bu eklentinin davranışını değiştirecek olsaydı, çalışmaları büyük olasılıkla bu üç işlemi içerecekti. Eklentimizi genişletilebilir hale getirmek için, diğer geliştiricilere açmak için bunların etrafına kancalar eklememiz gerekir.
Genel olarak, bunlar bir eklentiye kanca eklemek için iyi alanlardır:
- ana süreçlerin etrafında ve içinde,
- çıktı HTML'si oluştururken,
- gönderi veya veritabanı sorgularını değiştirmek için,
- bir fonksiyondan değerler döndürmeden önce.
Genişletilebilir Eklentinin Tipik Bir Örneği
Bu temel kuralları alarak, eklentimizi genişletilebilir hale getirmek için aşağıdaki filtreleri ekleyebiliriz:
- get_posts argümanlarını değiştirmek için
myplugin_get_posts_args
get_posts
, - get_posts sonuçlarını geçersiz kılmak için
myplugin_get_posts
get_posts
, - bir liste girişinin oluşturulmasını özelleştirmek için
myplugin_list_item
ekleyin, - döndürülen oluşturulan listeyi geçersiz kılmak için
myplugin_get_some_post_titles
ekleyin.
İşte tüm kancaların eklendiği kod:
function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); // Let other people modify the arguments. $posts = get_posts( apply_filters( 'myplugin_get_posts_args', $args ) ); // Let other people modify the post array, which will be used for display. $posts = apply_filters( 'myplugin_get_posts', $posts, $args ); $output = '
- ';
foreach ( $posts as $post ) {
// Liste girişini diğer kişilerin değiştirmesine izin verin.
$çıktı .= '
- ' application_filters('myplugin_list_item', $post->post_title, $post ) . ' '; } $çıktı .= '
Yukarıdaki kodu GitHub arşivinden de alabilirsiniz.
Buraya çok sayıda kanca ekliyorum, bu örnek kod oldukça basit ve küçük olduğu için pratik görünmeyebilir, ancak bu benim amacımı açıklıyor: Diğer geliştiriciler, yalnızca dört kanca ekleyerek artık eklentinin davranışını her türlü şekilde özelleştirebilir.
Kancalar İçin Ad Alanı ve Bağlam
Devam etmeden önce, uyguladığımız kancalarla ilgili iki önemli şeyi not edin:
- Kancaları
myplugin_
ile adlandırıyoruz.
Bu, kancanın adının başka bir eklentinin kancasıyla çakışmamasını sağlar. Bu sadece iyi bir uygulamadır, çünkü aynı ada sahip başka bir kanca çağrılırsa, istenmeyen etkilere yol açabilir. - Ayrıca bağlam için tüm kancalarda
$args
bir referans gönderiyoruz.
Bunu, başkaları kodun akışındaki bir şeyi değiştirmek için bu filtreyi kullanırlarsa, kancanın neden çağrıldığına dair bir fikir edinmek için bu$args
parametresini referans olarak kullanabilirler, böylece ayarlamalarını buna göre yapabilirler.
Kancalarımızın Etkileri
Daha önce bahsettiğim benzersiz senaryoları hatırlıyor musunuz? Bunları tekrar gözden geçirelim ve kancalarımızın onları nasıl mümkün kıldığını görelim:
- Kullanıcı WooCommerce ürünlerini veya belirli bir kategorideki gönderileri görüntülemek istiyorsa, eklentinin gönderileri sorguladığı zaman için kendi argümanlarını eklemek için
myplugin_get_posts_args
filtresini kullanabilir veya gönderileri kendi listeleriyle tamamen geçersiz kılmak içinmyplugin_get_posts
kullanabilir. - Kullanıcı öğeleri basit bir liste yerine başka bir eklenti tarafından sağlanan bir döngüde görüntülemek isterse, işlevin tüm çıktısını
myplugin_get_some_post_titles
ile geçersiz kılabilir ve bunun yerine oradan bir döngü çıktısı alabilir. - Kullanıcı özel bir veritabanı sorgusu gerçekleştirmek ve ardından bu sorgunun listedeki gönderilerini kullanmak isterse, ilk senaryoya benzer şekilde
myplugin_get_posts
kullanarak kendi veritabanı sorgusunu kullanabilir ve gönderi dizisini değiştirebilir.
Çok daha iyi!
Filtrelerimizi Nasıl Kullanacağımıza Hızlı Bir Örnek
Geliştiriciler, yukarıdaki filtrelerimize bağlanmak için add_filter
kullanabilir (veya eylemler için add_action
kullanabilir).
Yukarıdaki ilk senaryomuzu ele alarak, bir geliştirici oluşturduğumuz myplugin_get_posts_args
filtresini kullanarak WooCommerce ürünlerini görüntülemek için aşağıdakileri yapabilir:
add_filter( 'myplugin_get_posts_args', 'show_only_woocommerce_products' ); function show_only_woocommerce_products( $args ) { $args['post_type'] = 'product'; return $args; }
Eylem Kancalarını da Kullanabiliriz
apply_filters
kullanmanın yanı sıra, kodumuzu genişletilebilir hale getirmek için do_action
da kullanabiliriz. İkisi arasındaki fark, ilkinin başkalarının bir değişkeni değiştirmesine izin vermesi, ikincisi ise diğerlerinin kodumuzun çeşitli bölümlerinde ek işlevler yürütmesine izin vermesidir.
Eylemleri kullanırken, aslında eklentinin akışını diğer geliştiricilere gösteriyoruz ve diğer şeyleri birlikte yapmalarına izin veriyoruz.
Örneğimizde yararlı olmayabilir (çünkü yalnızca bir kısa kod görüntülüyoruz), ancak diğerlerinde yardımcı olabilir. Örneğin, genişletilebilir bir yedekleme eklentisi verildiğinde, yedekleme dosyasını Dropbox gibi bir üçüncü taraf hizmetine de yükleyen bir eklenti oluşturabiliriz.
"Harika! Ama Eklentimi Genişletilebilir Yapmayı Neden Önemseyim ki?”
Pekala, bu fikir hala satılmadıysa, diğer insanların eklentinizin davranışını değiştirmesine izin vermenin neden iyi bir fikir olduğuna dair birkaç düşünce.
Eklentiyi Daha Fazla Özelleştirme Olasılığına Açar
Herkesin farklı ihtiyaçları vardır. Ve eklentinizin hepsini tatmin etmemesi ve tahmin edemezsiniz. Eklentinizin davranışının önemli alanlarında değişikliklere izin vermek için eklentinizi açmak harikalar yaratabilir.
İnsanların Eklentinin Koduna Dokunmadan Değişiklikler Yapmasına İzin Veriyor
Diğer geliştiriciler, eklentinizin dosyalarını doğrudan değiştirmeye zorlanmayacaktır. Bu çok büyük bir avantajdır çünkü bir eklentinin dosyasını doğrudan değiştirmek genellikle kötü bir uygulamadır. Eklenti güncellenirse, yaptığınız tüm değişiklikler silinir.
Başkalarının kullanması için kendi kancalarımızı eklersek, eklentinin değişiklikleri harici bir konuma, örneğin başka bir eklentiye yerleştirilebilir. Bu şekilde yapıldığında, orijinal eklentiye hiçbir şekilde dokunulmaz ve hiçbir şey bozulmadan özgürce güncellenebilir ve diğer eklentideki tüm değişiklikler olduğu gibi kalır.
Çözüm
Genişletilebilir eklentiler gerçekten harika ve bize birçok özelleştirme olanağı sunuyor. Eklentinizi genişletilebilir hale getirirseniz, kullanıcılarınız ve diğer geliştiricileriniz bunun için sizi sevecektir.
WooCommerce, Easy Digital Downloads ve ACF gibi eklentilere bir göz atın. Bu eklentiler genişletilebilir ve WordPress'in eklentiler dizinindeki diğer birçok eklenti onlara işlevsellik kattığı için bunu kolayca anlayabilirsiniz. Ayrıca, eklentilerin çeşitli yönlerini değiştiren çok çeşitli eylem ve filtre kancaları sağlarlar. Yukarıda saydığım temel kurallar, onlarla ilgili çalışmamda ortaya çıktı.
Eklentinizi genişletilebilir hale getirmek için birkaç çıkarım:
- Açık/kapalı prensibini takip edin. Başkalarının bir şeyi değiştirmek için kodunuzu düzenlemesi gerekmez.
Eklentinizi genişletilebilir hale getirmek için şu yerlere kanca ekleyin:
- büyük süreçlerin etrafında ve içinde,
- çıktı HTML'sini oluştururken,
- gönderi veya veritabanı sorgularını değiştirmek için,
- bir fonksiyondan değerler döndürmeden önce.
- Adlandırma çakışmalarını önlemek için kancalarınızın adlarını eklentinizin adıyla adlandırın.
- Kancayla ilgili diğer değişkenleri aktarmayı deneyin, böylece diğer insanlar kancada neler olup bittiğine dair bir bağlam elde etsinler.
- Başkalarının da öğrenebilmesi için eklentinizin kancalarını belgelemeyi unutmayın.
Daha fazla okuma
Eklentileri genişletme hakkında daha fazla bilgi edinmek istiyorsanız, işte bazı kaynaklar:
- WordPress Eklentinizi Genişletilebilir Hale Getirme, GitHub
Bu makaledeki tüm örnek kodlar. - Smashing Magazine'den Thomas Maier, "WordPress Hook'larına Başlamak İçin Yararlı İpuçları"
- "Bir WordPress Eklentisi Nasıl Oluşturulur", Daniel Pataki, Smashing Magazine
- "Kancalar," Eklenti El Kitabı, WordPress.org