Eklenti Geliştirme Amaçları En İyi Uygulamalar? [kapalı]


135

Eklenti geliştirme için nesnel en iyi uygulamaları toplamak için bir topluluk wiki başlatmak . Bu soru @ EAMann'ın wp hacker'larına yaptığı yorumlardan ilham aldı .

Buradaki fikir, hangi objektif en iyi uygulamaların olabileceği konusunda işbirliği yapmaktır, böylece bunları potansiyel olarak bazı topluluk işbirliği gözden geçirme süreçlerinde kullanabiliriz.

GÜNCELLEME: İlk birkaç yanıtı gördükten sonra, cevap başına sadece bir fikir / öneri / en iyi uygulama yapmamız gerektiği ve kişilerin göndermeden önce hiçbir kopyası olmadığından emin olmak için listeyi gözden geçirmesi gerektiği ortaya çıktı.


Community wiki'nin bu konuda (ve diğerleri) SE ile nasıl düzgün çalışması gerektiğini anlamıyorum, ama belki de bu meta soru. Sadece cevaplarda çoğunlukla çoğaltır.
hakre

@hakre: Harika nokta. Bir şey gördükten sonra, insanların "cevap" başına sadece bir fikir eklemesi gerektiğini açıklamaya ekleyeceğim ve mevcut cevabımı birden fazla cevap olarak değiştireceğim.
MikeSchinkel

Yanıtlar:


72

Eylemleri ve Filtreleri Kullan

: İnsanların bazı verileri eklemek veya değiştirmek istiyorum düşünüyorsanız sağlamak () apply_filters dönmeden önce .

PS Hayal kırıklığına uğrattığım ve sorunuzun yöneltdiği bir şey, yalnızca son kullanıcılar için tasarlanan, yani kendi kancaları olmayan eklentilerin yüzdesi. WordPress'in çoğu eklenti gibi tasarlandığını hayal edin. Esnek ve çok niş bir çözüm olurdu.

WordPress, diğer eklentilerin bağlı olduğu eklentileri otomatik olarak yükleyebilme yeteneğine sahip olsaydı, belki de işler farklı olurdu? Genellikle, sıfırdan ihtiyaç duyduğum işlevselliği yazmam gerekiyor, çünkü müşteriler işleri kesin bir şekilde istiyorlar ve mevcut eklentiler mevcutken% 90'ı kalan% 10'u güncelleme esnekliğine izin vermiyor.

Gerçekten, WordPress topluluğunun liderlerinin, en iyi uygulamaları takip etmek için (diğer geliştiriciler için kanca eklemek gibi) eklentilerin ödüllendirilmesini sağlamanın bir StackExchange sitesinde ödüllendirilmesini sağlamanın bir yolunu belirlemelerini diliyorum.

Başka bir sorudan örnek alalım :

Örnek: Birisi bir makaleyi yeniden retweetlediğinde eklentimde bir şeyler yapmak istiyorum. Popüler retweet eklentisi ne olursa olsun, takılabildiğim ve ateşleyebildiğim özel bir kanca olsaydı, bu harika olurdu. Yok, bu yüzden eklemek için eklentilerini değiştirebilirim, ancak bu sadece kopyam için işe yarıyor ve bunu yeniden dağıtmayı denemek istemiyorum.

İlgili


55

Scriptleri / CSS'yi wp_enqueue_scriptve ile yüklewp_enqueue_style

Eklentiler, özellikle jQuery ve WP Core'a dahil olan diğer JS dosyaları için JS / CSS dosyalarının kopya versiyonlarını yüklememeli / denememelidir.

Eklentiler her zaman kullanmalı wp_enqueue_scriptve wp_enqueue_styleJS ve CSS dosyalarını bağlarken ve asla doğrudan <script>etiketlerden kullanmamalıdır.

İlgili


1
Öneri : Orada dependancies kullanma hakkında küçük bir not yapıştırmaya değer olabilir (enqueue sisteminin bir parçası olduğundan).
t31os

Doğru, ama daha iyisi, daha önce stilleri ve komut dosyalarını kaydetmeniz ve ardından bu komut dosyalarını ID yoluyla sıkılaştırmanızdır. Bu, diğer geliştiricilerin komut dosyalarını değiştirmesi veya özel eklentilerde kullanması için çok iyidir. Ayrıca siparişi değiştirmek veya yazlık bir dosya oluşturmak daha kolaydır.
buelge

2
Ayrıca, gerektiği yerlerde sayfalara komut dosyaları ve stiller yükleyin. scribu.net/wordpress/optimal-script-loading.html
MR

49

I18n desteği

Geliştiricinin kendi eklentisini çevirme konusunda ilgisi olmasa bile, tüm çıkış dizeleri, ilgili taraflarca uluslararasılaşmaya izin vermek için uygun bir metin alanına bağlanmalıdır.

initİşlem sırasında dil dosyalarını yüklemenin çok önemli olduğuna dikkat edin, böylece kullanıcı eylemi gerçekleştirebilir.

WordPress Geliştiricileri için Kodeks'e bakın: I18n

Ve ayrıca bu yazı: WP dilinin doğru şekilde yüklenmesi .

WordPress 4.6'dan beri

WP 4.6 yük sırasını ve kontrol edilen yerleri değiştirdi, geliştiriciler ve kullanıcılar için çok daha kolay hale geldi.

'My-plugin' adlı bir textdomain eklentisini göz önünde bulundurarak, WordPress şimdi FIRST: /wp-content/languages/plugins/my-plugin-en_US.mo adresinde bir çeviri dosyası
arayacaktır.

Eğer orada bir tane bulamazsa, o zaman eklentinin bakmasını söylediği yere bakacaktır (kodeksi izlerseniz her zamanki eklentiler 'dil' klasöründe):
/ wp-content / plugins / my-plugin / languages ​​/ my- plugin-en_US.mo

Son olarak, eğer bir dil dosyası bulunamazsa, varsayılan konumu kontrol edecektir:
/wp-content/languages/my-plugin-en_US.mo

İlk kontrol 4.6’da eklenmiş ve kullanıcılara dil dosyasını ekleyebilecekleri belirli bir yer vermiş, geliştiricinin dil dosyasını nereye eklediğini bilmeleri gerektiği gibi, şimdi de kullanıcının eklentinin textdomain: / wp-content / dilleri / eklentileri / TEXTDOMAIN-LOCAL.mo


Aşağıda eski yol (WP 4.6+ dan beri geçerli değil)

[...]
Son olarak, eklentiyle birlikte verilen dil dosyalarını yüklemeden önce özel kullanıcı dil dosyalarının WP_LANG_DIR adresinden yüklenmesinin önemli olduğunu belirtmek isterim . Aynı etki alanı için birden fazla mo dosyası yüklendiğinde, ilk bulunan çeviri kullanılacaktır. Bu şekilde, eklenti tarafından sağlanan dil dosyaları, kullanıcı tarafından çevrilmeyen dizgelerin geri dönüşü olarak işlev görür.

public function load_plugin_textdomain()
{
    $domain = 'my-plugin';
    // The "plugin_locale" filter is also used in load_plugin_textdomain()
    $locale = apply_filters( 'plugin_locale', get_locale(), $domain );

    load_textdomain( 
            $domain, 
            WP_LANG_DIR . '/my-plugin/' . $domain . '-' . $locale . '.mo' 
    );
    load_plugin_textdomain( 
            $domain, 
            FALSE, 
            dirname( plugin_basename(__FILE__) ) . '/languages/' 
    );
}

Benim için en önemlisi. Yapması gereken fazladan bir iş değil, eklentinizi İngilizce'yi İngilizce konuşamayan milyonlarca kullanıcı için daha kullanışlı hale getirecek şeylerden biri. Herhangi bir kelimeyi kendiniz çevirmek bile zorunda değilsiniz, her şeyi tercüme etmek için hazırlayın.
2ndkauboy

Bu kadar değerli, ancak yapılması gereken kolay bir şey, sadece katılıyorum demek istedim ve her eklenti yazarı bunu yapmalı.
t31os

48

Eklentilerin WP_DEBUG ile Hata Yapmamasını Sağlayın

Eklentilerinizi her zaman WP_DEBUGaçık olarak test edin ve geliştirme süreci boyunca ideal olarak açık olmasını sağlayın. Bir eklenti, HİÇBİR hata atmalı WP_DEBUG. Bu, kullanımdan kaldırılmış bildirimleri ve işaretlenmemiş dizinleri içerir.

Hata ayıklamayı açmak için wp-config.phpdosyanızı WP_DEBUGsabit olacak şekilde ayarlayın true. Daha fazla bilgi için Hata Ayıklama Kodeksine bakın.


Lütfen her cevap için yalnızca en iyi uygulamayı yapma konusunda GÜNCELLEME bakınız; Birden fazla cevaba böler misiniz?
MikeSchinkel

Elbette, hiç sorun değil. Bunun için üzgünüm.
John P Bloch

Teşekkürler ve gözetiminiz değildi, o benim. @ Hakre'nin kopyalar hakkındaki sorusuna ve bu çalışmanın nasıl yapıldığına dayanarak cevap başına en iyi uygulama sorma sorusunu revize ettim.
MikeSchinkel

6
Bu cevabı iki kez yükseltebilseydim, yapardım. Dev bir site üzerinde çalışırken ve WP_DEBUG'ı kapatmak zorunda kalmam çok sinir bozucu çünkü kullanmam gereken bir eklenti her yerde uyarılar ve uyarılar yayıyor.
Ian Dunn

42

WordPress Çekirdeğinde İlk Olan İşlevleri Kullan

Yapabilirseniz: kendiniz yazmak yerine WordPress çekirdeğinde bulunan mevcut işlevleri kullanın . Özel PHP işlevlerini yalnızca WordPress çekirdeğinde önceden var olan uygun bir işlev olmadığında geliştirin.

Bunun bir yararı, değiştirilmesi gereken işlevleri kolayca izlemek için "kullanımdan kaldırılmış bildirimleri günlüğe kaydetme " özelliğini kullanabilmenizdir . Diğer bir avantaj, kullanıcıların işlev belgelerini Kodeks'te görüntüleyebilir ve deneyimli bir PHP geliştiricisi olmasalar bile eklentinin ne yaptığını daha iyi anlamalarıdır.

İlgili


Buradaki en büyük sorunlardan biri, uygun bir mevcut işlevin var olduğunu öğrenmek. Yararlı olan şey, topluluğun hangi fonksiyonun en iyi şekilde kullanılacağı hakkında yorum yapmasına olanak sağlamak için kod ve / veya işlevsellik ihtiyacını postalamak için bir yer olacaktır. Belki StackExchange bunun için kullanılabilir?
MikeSchinkel

Puh. Bu oldukça zor olurdu ve sanırım bir çeşit sonsuz iş. Kodeksi bu şekilde genişletmek en iyisi olacağını düşünüyorum çünkü zaten var.
kaiser

Kodeksi genişletmek ve belki de oradan ilgili stockexchange iş parçacıklarına bağlantı yeterince iyi olurdu sanırım.
kaiser

4
Bununla ilgili bir sorun, bir çok çekirdeğin yeniden kullanılabilirlik için yapısal olarak tasarlanmamış olmasıdır. Sadece post-type davranışı gibi kendi eklenti oluşturma biçimimi oluşturmak için görüntü işleme / meta veri işlevlerinin yarısını kopyalayıp hafifçe değiştirmek zorunda kaldım, çünkü downsize () gibi bir işlev post-type = 'eki için sabit kodlanmış bir denetim içeren bazı işlevler çağırıyor '. Esnek olmayan wp_count_posts () gibi başka bir örnek var. Çekirdeği yeniden kullanabilmeniz için önce WP'nin tam bir yeniden düzenlemeye ihtiyacı var.
wyrfel

Bu konuda tamamen katılıyorum. Benim her zaman favori örneği: wp-login.php. Yani, "Eğer yapabilirsen" cevabı için iyi bir başlangıç ​​oldu ...
kaiser

35

Kaldırma, bir eklentinin tüm verilerini kaldırmalıdır

Bir WordPress kurulumundan kaldırıldıktan sonra, bir eklenti tüm dosyaları, klasörleri, veritabanı girişlerini ve oluşturduğu tabloları ve yarattığı seçenek değerlerini silmeli .

Eklentiler, ayarları dışa aktarma / içe aktarma seçeneği sunabilir, böylece ayarlar silinmeden önce WordPress'in dışına kaydedilebilir.

İlgili


4
Bu, varsayılan davranış olmalıdır, evet, ancak kullanıcıdan bir video oyununu kaldırırken, kaydedilmiş oyunları ve indirilen materyalleri kaldırmak isteyip istemediğinizi soran gibi, bazı verileri tutmasını da istemelidir. Bir kullanıcı, eklentiyi yalnızca test amaçlı olarak devre dışı bırakıyor olabilir ve seçenekleri yeniden etkinleştirdiklerinde ayarlamaya devam etmek istemeyebilir.
EAMann

1
Sadece bir eklenti tamamen kaldırıldığında, devre dışı bırakıldığında değil.
Travis Northcutt

2
Anlıyorum ... ama bazen eklentileri sileceğim, böylece onları depoda henüz barındırılmayan bir yedekleme veya beta sürümünden manuel olarak yeniden ekleyebilirim ...
EAMann

4
@EAMann: Bunun için ve eklentileri başka bir sunucuya geçirmek için, bir eklenti ayarları dışa aktarmak ve almak için bir mekanizma sağlamalıdır.
hakre

2
Birkaç eklentinin ayarlarında "Kaldır" butonu sunduğunu gördüm, büyük kırmızı uyarılar ile tüm verileri silecek. Bu devre dışı bırakma işleminden ayrı ve bence üstesinden gelmek için harika bir yol. Bir eklentiyi kaldırmak için herkes "Sil" düğmesini kullanmaz.
gabrielk

34

Giriş Verileriyle SQL Enjeksiyonunu Önleyin

Bir eklenti , MySQL veritabanını sorgulamak için giriş değerlerini kullanmadan önce doğrudan veya dolaylı olarak alınan (örneğin veya ile ) alınan tüm kullanıcı girişlerini sterilize etmelidir .$_POST$_GET

Bakınız: SQL deyimlerini biçimlendirme .


5
Ayrıca veri geliyor sterilize edilmelidir dışarı veritabanının. Temel olarak, kodlanmış olmayan herhangi bir veriye asla güvenmeyin. codex.wordpress.org/Data_Validation de iyi bir referans.
Ian Dunn

31

Tüm Global Ad Alanı Öğelerini Önekle

Bir eklenti, TÜM global ad alanı öğelerini (sabitler, fonksiyonlar, sınıflar, değişkenler, hatta özel taksonomiler, posta tipleri, widget'lar, vb. Gibi) önceden eklemelidir. Örneğin, adında bir işlev oluşturmayın init(); bunun yerine, böyle bir şey adlandırın jpb_init().

Yaygın olarak adların önünde üç veya dört harfli bir ön ek kullanılmalı veya PHP Ad Alanı Özelliği kullanılmalıdır . Karşılaştırma: PHP sınıfı sabitleri için tek harfli ön ek?

İlgili


31

Sınıf ve nesne yönelimli PHP5 kodu kullanın

Temiz, nesne yönelimli PHP5 kodu yazmamak için hiçbir sebep yoktur. PHP4 desteği bir sonraki sürümden sonra sona erecektir (WP 3.1). Elbette, tüm işlev isimlerinizi endlessly_long_function_names_with_lots_of_underscores ile bitirin, ancak basit bir sınıf yazmak ve içindeki her şeyi bir araya getirmek çok daha kolaydır. Ayrıca, sınıfınızı ayrı bir dosyaya koyun ve buna göre adlandırın böylece kolayca genişletip devam ettirebilirsiniz:

// in functions.php
require 'inc/class-my-cool-plugin.php';
new MyCoolPlugin();

// in inc/class-my-cool-plugin.php
class MyCoolPlugin {
    function __construct() {
        // add filter hooks, wp_enqueue_script, etc.

        // To assign a method from your class to a WP 
        // function do something like this
        add_action('admin_menu', array($this, "admin"));
    }

    public function admin() {
        // public methods, for use outside of the class
        // Note that methods used in other WP functions 
        // (such as add_action) should be public
    }

    private function somethingelse() {
        // methods you only use inside this class
    }
}

yeni MyCoolPlugin () kullanmayın; WP'yi Hook aracılığıyla takmanız daha iyi olur: plugins_loaded
bueltge

O konuda emin değilim. Plugins_loaded kodeksine göre, yüklenen ilk şeylerden biri, bu yüzden böyle bir yapı yapmanın ya da bir eylem olarak eklemenin çok az fark yarattığını düşünüyorum.
Husky,

5
herkes için daha iyi hale getiren en iyi uygulamalardan sadece bir tanesi.
Arlen Beiler,

1
Plugins_loaded içine bir kanca eklemek görebildiğim kadarıyla sıfır iyileştirmeler yapar ve herhangi bir gelişme olmadığı için en iyi uygulama olmaz, çünkü eğer bir şey varsa bellek kullanımı artarsa, bir işlemden geçmesi gerektiği için hızı azaltın Sadece eklenen eylemler yerine. Ayrıca OO kullanımı en iyi uygulama olarak düşünülmemelidir.
Backie

4
@IanDunn: PHP4 desteği istiyorsanız, ancak PHP4 desteği 4 yıldan fazla bir süre önce 2008'den bu yana bırakıldı. PHP4'e özgü kontrolleri kullanmak için hiçbir neden yok.
Husky


23

Sadece ihtiyacınız olan dosyaları ekleyin ...

Ön uçtaysanız, yönetici alanıyla ilgili kod eklemeyin.


21

Eklenti Kaldırma İşleminde Veri Kaybını Duyurun

Kaldırma üzerine bir eklenti gerekir o veri var silme olacak bir kullanıcı istemi ve kullanıcı bunu yaparken ve bir eklenti önce verileri silme ile tamamdır onayını alacaksınız gerektiğini de kullanıcıya verilerini tutmak için seçeneğe izin kaldırma üzerine. (Bu fikir @EAMann'dan.)

İlgili


3
Wordpress'in kendisi yöneticide, bunun gerçekleştiğine dair bir uyarı mesajı görüntüler (en azından şu an bagajda).
hakre

WordPress tarafından görüntülenen uyarı iletisinin yanı sıra, eklentinin kullanıcıya bilgi vermesi imkansızdır, çünkü kaldırma sırasında zaten devre dışı bırakılmıştır. Fakat # 20578 numaralı bilete bakınız .
JD

19

Eklentinin klasör adı değiştirilsin

/ Eklentileri / pluginname / {çeşitli}

Klasör için kullanılan "eklenti adı" her zaman değiştirilebilir olmalıdır.

Bu normalde sabitleri tanımlamak ve bunları eklenti boyunca tutarlı bir şekilde kullanmakla idare edilir.

Söylemeye gerek yok ki birçok popüler eklenti günahkardır.

İlgili:

  • plugins_url() eklentiye dahil olan kaynaklara kolay bağlantı için.

Eklentinin klasörünü yeniden adlandırmak, otomatik güncellemelerin bozulmasına neden olacak, bu yüzden yapılacak en iyi şey olduğundan emin değilim.
mtekk

Değişikliği yine de yaptıktan sonra eklentiyi yeniden etkinleştirmeniz gerekir (isim değişikliği muhtemelen eklentinin devre dışı bırakılmasına neden olur), hangi noktada WP eklentilerle ilgili uygun DB girişlerini yeniden oluşturacak veya güncelleyecektir (böylece tüm güncellemeleri kırmak).
t31os

Sabit kullanmak yerine plugin_basename(__FILE__), eklentinin yerel adını bulmak için kullanın. Bu, aynı eklentinin kopyalarının (test, başka bir yerde birden fazla hesap, ancak her eklenti için yalnızca bir tane) olması için yararlıdır.
Raphael

19

WordPress kullanın (yerleşik) Hata yönetimi

Sadece return;bazı kullanıcı girişi yanlışsa yapmayın . Onlara biraz bilgi verilmesi yanlış yapıldı.

function some_example_fn( $args = array() ) 
{
    // If value was not set, build an error message
    if ( ! isset( $args['some_value'] ) )
        $error = new WP_Error( 'some_value', sprintf( __( 'You have forgotten to specify the %1$s for your function. %2$s Error triggered inside %3$s on line %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );

    // die & print error message & code - for admins only!
    if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) ) 
        wp_die( $error->get_error_code(), 'Theme Error: Missing Argument' );

    // Elseif no error was triggered continue...
}

Herkes için bir hata (nesne)

Önyükleme sırasında temanız veya eklentiniz için genel bir hata nesnesi ayarlayabilirsiniz:

function bootstrap_the_theme()
{
    global $prefix_error, $prefix_theme_name;
    // Take the theme name as error ID:
    $theme_data = wp_get_theme();
    $prefix_theme_name = $theme_data->Name;
    $prefix_error = new WP_Error( $theme_data->Name );

    include // whatever, etc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );

Daha sonra talep üzerine sınırsız Hata ekleyebilirsiniz:

function some_theme_fn( $args )
{
    global $prefix_error, $prefix_theme_name;
    $theme_data = wp_get_theme();
    if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // some required value not set
        $prefix_error->add( $prefix_theme_name, sprintf( 'The function %1$s needs the argument %2$s set.', __FUNCTION__, '$args[\'whatever\']' ) );

    // continue function...
}

Sonra temanın sonunda hepsini getirebilirsin. Bu sayede sayfayı oluşturmayı kesmezsiniz ve geliştirme için tüm hatalarınızı yine de verebilirsiniz

function dump_theme_errors()
{
    global $prefix_error, $prefix_theme_name;

    // Not an admin? OR: No error(s)?
    if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
        return;

    $theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
    echo '<h3>Theme Errors</h3>';
    foreach ( $theme_errors as $error )
        echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );

Daha fazla bilgiyi bu Q'da bulabilirsiniz . İlgili bir bilet ait "birlikte çalışma" gidermek WP_Errorve wp_die()oradan bağlantılıdır ve başka bilet izleyecektir. Yorumlar, eleştirmenler ve beğeniler.


Bir WP_Error nesnesini, yalnızca özelliklerine erişirseniz ve örneği bir nesne olarak asla geçemezseniz neden başlatıyorsunuz?
ProfK

@ProfK Daha kısa olması için elden geçirdim ve başlık / içerik wp_die();hatalıydı (tersine çevrildi). S: Hakkında) Tamamen anlamadım. Eğer WP_Error sınıfının bir örneğini kurarken sizin gibi fonksiyonları aracılığıyla kendi verilerine tam erişime sahip get_error_code();, get_error_message();, get_error_data();ve çoğul haller. Ayrıca, temanızın veya eklentinizin açılışında yalnızca bir kez başlatabilir ve $error->add();diğer hataları doldurmak için kullanabilirsiniz ve sonunda $error->get_error_messages();hepsini yakalamak için altbilgiye yazdırabilirsiniz .
kaiser

@ProfK Gelecekteki güncellemeleri bu Q'ya göndereceğim . Şu anda wp error sınıfının davranışını inceliyorum ve ortak bir tema hatası API'sı (taslak zaten yapıldı) hakkında bir bilet yazmak istiyorum. Q'nun altında bir araya getiren WP_Errorve wp_die()birbirine yaklaşan (zaten bir düzeltme eki bulunan) başka bir biletin bağlantısını bulacaksınız .
kaiser

18

Genel Ad Alanına Eklenen Adları En Aza İndir

Bir eklenti gerektiğini azaltmak çarpınca olanlar tarafından mümkün olduğunca küresel ad alanına ekler isimlerin sayısını en aza indirir .

Bu, eklentinin işlevlerini bir sınıfa yerleştirerek veya PHP isim alanları özelliğini kullanarak yapılabilir . Her şeyi öneklemek de yardımcı olabilir ama o kadar da esnek değil.

İşlevler ve sınıfların yanında, bir eklenti global değişkenler getirmemelidir . Sınıfları normal olarak kullanmak onları eskimiş ve eklenti bakımını kolaylaştırıyor.

İlgili


Lütfen "küresel değişkenleri tanıtmamalıyım" cevabını kendi cevabına taşıyabilir misin ? Yani (hem ben katılmıyorum olabilir düşünüyorum çünkü özel durumlar ve ben başkalarının görüşlerinden öğrenmek istiyorum çünkü.) Bu sorunun ayrı tarafından ilişkilidir ve aslında bir ben tartışmaya istiyorum
MikeSchinkel

17

PhpDoc kullanarak yorum yapma

En iyi uygulama PhpDoc stiline yakın. Eğer "Eclipse" gibi bir IDE kullanmazsanız, sadece PhpDoc El Kitabına bir göz atabilirsiniz .

Bunun nasıl çalıştığını tam olarak bilmek zorunda değilsin. Profesyonel Geliştiriciler yine de kodu okuyabilir ve buna bir özet olarak ihtiyaç duyar. Hobi kodlayıcıları ve kullanıcıları, aynı bilgi düzeyinde açıkladığınız yöntemi takdir edebilir.


17

Add_option'dan önce Settings API'sini kullanın

Add_option işlevi aracılığıyla DB'ye seçenekler eklemek yerine, bunları sizin için her şeyi halleden Ayarlar API'sini kullanarak bir dizi olarak saklamanız gerekir .

Add_option'dan önce Theme Modifications API'sini kullan

Değişiklikler API oldukça basit bir yapı ve seçenek ekleyerek ve almak sağlayan bir güvenli yoldur. Her şey veritabanınızda serileştirilmiş değer olarak kaydedilir. Kolay, güvenli ve basit.


1
Ve ayrıca, kullanın update_optionve asla add_option, güncelleme işlevi mevcut olmadığı zaman seçenek yaratacaktır .. :)
t31os

3
Asla kullanma demiştim add_option. add_optionSeçeneğin zaten ayarlanmış olması durumunda değiştirilmediği için iyi bir kullanım durumu vardır , bu yüzden zaten mevcut olan kullanıcı tercihlerini korumak için aktivasyonda kullanıyorum.
ProfK

1
Diğer bir kullanım durumu add_option, otomatik yüklemeyi açıkça devre dışı bırakmak istediğiniz zamandır. update_optionotomatik yükü true değerine zorlar, böylece otomatik yükleme özelliğini devre dışı bırakmak, add_optionilk seçenek oluştururken kullanın.
Dave Romsey

16

Eklenti Kullanıcılarının Gizliliğini Koruyun

(Önceden: Anonim API İletişimi)

Bir eklenti harici bir sistem veya API ile iletişim kuruyorsa (örneğin, bazı Web servisleri), bunu isimsiz bir şekilde yapmalı veya kullanıcıya, eklentinin kullanıcısı ile ilgili hiçbir verinin kontrolsüz bir ikinci tarafa sızmasını sağlayan isimsiz bir seçenek sunmalıdır.


15

WordPress.org'daki Host Eklentileri

Eklentileri barındırmak için WordPress.org'da sağlanan SVN deposunu kullanın . Kullanıcı deneyimini daha kolay güncellemenizi sağlar ve daha önce SVN'yi hiç kullanmadıysanız, onu haklı çıkaran bir bağlamda kullanarak gerçekten anlamanızı sağlar.


15

İzinleri Kullanarak Erişim Denetimi Sağlayın

Pek çok durumda, kullanıcılar herkesin eklentiniz tarafından oluşturulan alanlara, özellikle de birden çok karmaşık işlem yapan eklentilerle erişebilmelerini istemeyebilir, tek bir sabit kodlanmış yetenek kontrolü yeterli olmayabilir.

En azından, eklentinizin kullanılabileceği tüm farklı işlem türleri için uygun yetenek denetimlerini yapın.


12

Eklenti Ayarlarını İçe / Dışa Aktar

Eklentiler arasında yaygın değildir, ancak eklentiniz (bazılarında) ayarlara sahipse, yapılandırma ve kullanıcı girişi gibi verilerin İçe Aktar / Dışa Aktarmasını sağlamalıdır .

İthalat / İhracat bir eklentinin kullanılabilirliğini arttırır.

Böyle bir ithalat ve ihracat işlevselliğine (ve aynı zamanda bir geri alma mekanizmasına sahip) örnek bir eklenti Breadcrumb NavXT'dir (Wordpress Plugin) (tam açıklama: orada benim için bazı küçük kodlar, çoğu mtekk tarafından yapıldı).

İlgili


12

Kodunuzu düzenleyin

Yapıldığı sırada yazılmayan kodları okumak çok zor. İlk önce / request, tanımlayın, wp_enqueue_style & _script, vb., Ardından eklenti / temanın ihtiyaç duyduğu işlevleri ve en sonunda oluşturucu (örn. Yönetici ekranı, temayla bütünleşen şeyler vb.).

Css ve js gibi şeyleri kendi klasörlerinde ayırmaya çalışın. Ayrıca bunu, dizi yassılaştırıcılar ve benzerleri gibi yalnızca yardımcı olan işlevlerle yapın. "Ana" dosyayı olabildiğince temiz ve kolay okunması, bir yıl içinde güncelleme yapmaya çalıştığınız ve daha uzun süredir kodu görmediğiniz zaman, kullanıcılara, geliştiricilere ve size yardımcı olacak bir yoldur.

Sıklıkla tekrarladığınız bir yapıya sahip olmak da iyidir, bu yüzden her zaman yolunuzu bulursunuz. Farklı projeler üzerinde bilinen bir yapının geliştirilmesi, bunu daha iyi hale getirmeniz için zaman kazandıracak ve müşteriniz başka bir geliştiriciye geçse bile, "kaos bıraktığını" asla duymayacaksınız. Bu itibarınızı arttırır ve uzun vadeli bir hedef olmalıdır.


Bunun, insanların tartışacağı ve tüm saygın insanların katılacağı objektif en iyi uygulamaları nesnelleştirmeyecek bir tarz hakkında biraz korktum. Sadece nesnel en iyi uygulamaları ele almamız çok önemlidir, bu nedenle insanlar ne kadar iyi olursa olsun tartışmalı konulara sahip olmanın aksine listeyi “kutsamayı” kabul etmeye istekli olacaktır.
MikeSchinkel

11

Tarzı ile ölmek

iyi bir şekilde ölün Tüm eklentiler (ve hatta temalar) işlevleri wp_die(), kullanıcıya ne olduğu hakkında biraz bilgi vermek için kritik yerlerde kullanmalıdır . Php hataları can sıkıcı ve wp_diekullanıcıya eklentinin yanlış yaptığı konusunda güzel bir tarz mesaj verebilir. Ayrıca, kullanıcı hata ayıklamayı devre dışı bıraktıysa, eklenti bozulur.

Kullanımı wp_die()da eklentileri / temalar ile uyumlu olmasını sağlar wordpress testsuite .

İlgili:

11

Kullanıcılar için Yardım Ekranları sağlayın

RTFM'yi (tıklama yardımı) bir cevap olarak söylemek, soruyu tekrar tekrar cevaplamak zorunda kalmaktan daha iyidir.

/**
  * Add contextual help for this screen
  * 
  * @param $rtfm
  * @uses get_current_screen
  */ 
  function ContextualHelp( /*string*/ $rtfm) 
  { 
     $current_screen = get_current_screen();
     if ($current_screen->id == $this->_pageid) 
     {
        $rtfm .= '<h3>The WordPress Plugin - Screen A</h3>';
        $rtfm .= '<p>Here are some tips: donate to me ' .
     }
     return $rtfm; 
  }
add_action('contextual_help', array($this,'ContextualHelp'),1,1);

güncelleme / not: (bkz. kaiser'den gelen yorumlar): Yukarıdaki örnek bir sınıfta kullanılacaktır.


Herkesin araç kutusunda olmalı (belirli bir yönetici kullanıcı arayüzünü açıklamanız gerektiği sürece). +1
kaiser

Btw: Bunun bir Sınıfta yer alması ve $ this -> _ page_id ile nasıl etkileşime gireceğini ve eylem kancasını bir Class.'sız bir eklenti dosyasından ya da Class'sız bir eklenti dosyasından eklemenin nasıl olacağını söylemelisin. .
kaiser


9

doğrudan değil, her zaman Kanca ile işlevi içerir.

Örnek:

  • İçin kullanmayın eklenti sınıf kanca olmadan yeni yoluyla dahil

  • Hook plugins_loaded kullanın

    // add the class to WP                                   
    function my_plugin_start() {                                                               
        new my_plugin();   
    }                                                        
    add_action( 'plugins_loaded', 'my_plugin_start' );

Güncelleme: küçük bir canlı örnek: Plugin-svn-trunk-page ve sözde bir örnek

//avoid direct calls to this file where wp core files not present
if (!function_exists ('add_action')) {
        header('Status: 403 Forbidden');
        header('HTTP/1.1 403 Forbidden');
        exit();
}

if ( !class_exists( 'plugin_class' ) ) {
    class plugin_class {

        function __construct() {
        }

    } // end class

    function plugin_start() {

        new plugin_class();
    }

    add_action( 'plugins_loaded', 'plugin_start' );
} // end class_exists

Ayrıca multisite kurulumunda mu_plugins_loaded ile yükleyebilirsiniz, işlem referans koduna bakınız : http://codex.wordpress.org/Plugin_API/Action_Reference Ayrıca burada, bu kancayla wP'nin ne kadar içerdiğini görüyorsunuz: http: // adambrown. info / p / wp_hooks / hook / plugins_loaded? version = 2.1 & file = wp-settings.php Bunu çok sık kullanıyorum ve zor ve erken değil, zor yeni bir sınıf olarak daha iyi ();


@bueltige --- bunu biraz daha açıklayabilir misiniz
NetConstructor.com

3
küçük bir canlı örnek: [Plugin-svn-trunk-page] svn.wp-plugins.org/filter-rewrite-rules/trunk/… ve sözde bir örnek //avoid direct calls to this file where wp core files not present if (!function_exists ('add_action')) { header('Status: 403 Forbidden'); header('HTTP/1.1 403 Forbidden'); exit(); } if ( !class_exists( 'plugin_class' ) ) { class plugin_class { function __construct() { } } // end class function plugin_start() { new plugin_class(); } add_action( 'plugins_loaded', 'plugin_start' ); } // end class_exists
saat

2
@ Netconstructor.co - Konuyu güncelledim, yorum kod için çirkin
bueltge

8

GPL Uyumlu Lisansı Altındaki Lisans Eklentileri

Eklentiler ve temalar gereken bir WordPress uyumlu lisansı altında lisanslı. Bu, WordPress ile "program" olarak yeniden dağıtılmalarını sağlar. Önerilen bir lisans GPL'dir . Eklentiyle birlikte verilen tüm kod kütüphanelerinin aynı lisansla uyumlu olmasına dikkat edin.

(Bu hem geçmişte hem de günümüzde bir sorun ve ciddi bir tartışma konusu olmuştur .)


Şimdilik GPL uyumluluğu ile bırakalım: core.trac.wordpress.org/ticket/14685
hakre

8

Eklenti açıklamanız, eklentinizin işlevlerini doğru şekilde ayrıntılandırmalıdır. 10 tane özellikli eklenti var. Hepsinde özellikli yayınlar görüntüleniyor, ancak çoğunun farklı özellikleri var. Açıklamayı okuyarak eklentinizi benzer eklentilerle karşılaştırmak kolay olmalı.

Gerçekten çok basit olmadığı sürece eklentinizin ne kadar basit olduğu konusunda övünmekten kaçınmalısınız. Ayarlara bağlantı gibi açıklamaya faydalı bağlantılar eklemelisiniz.


7

Uzak Veri Kaynaklarının ve Web Hizmetlerinin Yan Etkilerini En Aza İndirin

Bir eklenti olmalıdır Önbellek / Shield Webservice ve / veya XMLRPC / a önbelleğe alma / veri-sağlayıcı katmanı üzerinden SOAP istekleri Eğer (yavaş) webservice yanıt bekliyor ön isteklerini yapmıyor kadar bunları kullanmak eğer.

Buna RSS beslemesi ve diğer sayfaların indirilmesi de dahildir. Eklentilerinizi arka planda veri talep edecek şekilde tasarlayın.

Olası bir ADIM: (Örnek olarak ping.fm'a gönderme yapın): Bir tampon tablo oluşturun, diyelim ki: ping_fm_buffer_post (tarih, saat, mesaj,, mesaj_adı, durum)

  1. Güncellemeyi her zaman ping.fm'e göndermek istediğinizde, bu tabloya ekleyin.
  2. Şimdi, bu verileri işlemek için bir eklenti oluşturmamız gerekiyor. Bu eklenti henüz gönderilmemiş her güncellemeyi kontrol etmek için crontab üzerinden çalışacaktır
  3. Bu tabloya sahip olduğumuz için, ping.fm'e gönderilen her iletiyi listeleyebilir ve her gönderinin durumunu kontrol edebiliriz. Pinginger'ın tarafında bir sorun olursa, onu tekrar gönderebiliriz.

Bunun tam olarak nereye gittiğini gerçekten anlamıyorum. Destekleyici materyallere link verebilir misiniz?
MikeSchinkel

Ayrıca, "Net Tepegöz" ne olduğundan tam olarak emin değilim . Daha iyi bir terim yok mu? Daha açıksa, daha iyi bir nesnel kural olacaktır. Ve Önlemek " imkansız; bunun yerine " Küçült " mü?
MikeSchinkel

Muhtemelen haklısın. Kötü ifade ve önlemek asla mümkün değildir, daha iyi uyumu en aza indirir.
hakre

7

Eklentinizi test edin

Eklenti geliştirme ortamımızda kesinlikle bazı test araçlarına sahip olmalıyız.

Dayanarak bu cevabı ile Ethan Seifert bir test sorusuna şu takip etmek iyi uygulamalar şunlardır:

  • Birim Testiniz bir sınıfın gerçekleştirebileceği en küçük davranış miktarını test etmelidir.
  • İşlevsel test seviyesine ulaştığınızda, kodunuzu Wordpress bağımlılıkları ile test edebileceğiniz yer burasıdır.
  • Eklentinizin ne yaptığına bağlı olarak - kimlikleri kullanarak DOM’daki verilerin varlığını test eden Selenyum tabanlı testleri kullanmayı düşünün

Sınama önemli olsa da, birim sınamalarının en iyisi yerine en küçük sınaması gerektiği söylenebilir. WordPress'e bağlı sorunları test etmekte zorlanıyorsanız, WordPress çekirdeğine dalın, öğelerin işe yarayıp yaramadığını görmek için kullanabileceğiniz bir sürü dahili küresel değişken bulacaksınız.
Backie

1
Ancak, en küçük olanı kapsayan temeldir, bu nedenle yanıtın dediği gibi WordPress ile işlevsel testlere erişebilirsiniz, doğru değil mi?
Fernando Briano

1
Bu bir uygulama değil, bir eklentidir, Java Runtime olmadan bir Java uygulamasını test edebilir misiniz? Evet, bir mockup olarak Java yazarak ve eklentinizi test edin. Muhtemelen böceklerin maketi içinde. *) yasal uyarıya veya feragatname.
edelwater
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.