Memulai wiki komunitas untuk mengumpulkan praktik terbaik objektif untuk pengembangan plugin. Pertanyaan ini terinspirasi oleh komentar @ EAMann tentang wp-hacker .
Idenya adalah untuk berkolaborasi tentang apa praktik terbaik yang mungkin terjadi sehingga kita pada akhirnya berpotensi menggunakannya dalam beberapa proses peninjauan kolaborasi masyarakat.
UPDATE: Setelah melihat beberapa tanggapan pertama menjadi jelas bahwa kita hanya perlu memiliki satu ide / saran / praktik terbaik per jawaban dan orang-orang harus meninjau daftar untuk memastikan tidak ada duplikat sebelum memposting.
plugin-development
customization
wiki
MikeSchinkel
sumber
sumber
Jawaban:
Gunakan Tindakan dan Filter
Jika menurut Anda orang ingin menambah atau mengubah beberapa data: berikan apply_filters () sebelum kembali .
Mari kita ambil contoh dari pertanyaan lain :
Terkait
sumber
Muat Script / CSS dengan
wp_enqueue_script
danwp_enqueue_style
Plugin tidak boleh memuat / mencoba memuat versi duplikat file JS / CSS, khususnya jQuery dan file JS lainnya yang termasuk dalam WP Core.
Plugin harus selalu menggunakan
wp_enqueue_script
danwp_enqueue_style
ketika menautkan file JS dan CSS dan tidak pernah secara langsung melalui<script>
tag.Terkait
sumber
Dukungan I18n
Semua string keluaran harus ditautkan ke domain teks yang sesuai untuk memungkinkan internasionalisasi oleh pihak-pihak yang berkepentingan, bahkan jika pengembang tidak berminat menerjemahkan plug-in mereka sendiri.
Perhatikan bahwa sangat penting untuk memuat file bahasa selama
init
tindakan sehingga pengguna dapat terhubung ke tindakan.Lihat Codex: I18n untuk Pengembang WordPress
Dan juga artikel ini: Memuat file bahasa WP dengan benar .
Sejak WordPress 4.6+
WP 4.6 mengubah urutan pemuatan dan lokasi diperiksa, itu membuatnya lebih mudah bagi pengembang dan pengguna.
Mempertimbangkan plugin dengan domain teks 'my-plugin', WordPress sekarang akan PERTAMA mencari file terjemahan di:
/wp-content/languages/plugins/my-plugin-en_US.mo
Jika gagal menemukan satu di sana kemudian akan mencari di mana plugin memberitahu itu untuk melihat (biasanya dalam folder 'bahasa' pluigns jika mengikuti kodeks):
/ wp-content / plugins / my-plugin / languages / my- plugin-en_US.mo
Terakhir jika tidak ada file bahasa yang ditemukan, ia akan memeriksa lokasi default:
/wp-content/languages/my-plugin-en_US.mo
Pemeriksaan pertama ditambahkan pada 4.6 dan memberikan pengguna tempat yang pasti untuk menambahkan file bahasa, karena sebelum mereka perlu tahu di mana pengembang menambahkan file bahasa, sekarang pengguna hanya perlu tahu textdomain plugin: / wp-content / bahasa / plugin / TEXTDOMAIN-LOCAL.mo
Di bawah ini adalah cara lama (Tidak relevan sejak WP 4.6+)
sumber
Pastikan Plugin Hasilkan Kesalahan Tidak dengan WP_DEBUG
Selalu uji plugin Anda dengan
WP_DEBUG
dihidupkan dan idealnya dihidupkan selama proses pengembangan Anda. Plugin tidak boleh melempar kesalahan APA SAJAWP_DEBUG
. Ini termasuk pemberitahuan yang sudah usang dan indeks yang tidak dicentang.Untuk mengaktifkan debugging, edit
wp-config.php
file Anda sehinggaWP_DEBUG
konstanta diatur ketrue
. Lihat Codex di Debug untuk detail lebih lanjut.sumber
Pertama Gunakan Fungsi yang Ada di WordPress Core
Jika Anda dapat: menggunakan fungsi yang ada yang termasuk dalam inti WordPress alih-alih menulis sendiri. Hanya mengembangkan fungsi PHP khusus ketika tidak ada fungsi yang sesuai yang sudah ada sebelumnya di inti WordPress.
Salah satu manfaatnya adalah Anda dapat menggunakan "pemberitahuan log usang" untuk dengan mudah memonitor fungsi yang harus diganti. Manfaat lain adalah pengguna dapat melihat dokumentasi fungsi dalam Codex dan lebih memahami apa yang dilakukan plugin meskipun mereka bukan pengembang PHP yang berpengalaman.
Terkait
sumber
wp-login.php
. Jadi, "Jika Anda bisa" adalah pemula yang baik untuk jawabannya ...Menghapus instalasi harus menghapus semua data plugin
Setelah dihapus dari instalasi WordPress, sebuah plugin harus menghapus semua file, folder, entri basis data, dan tabel yang dibuatnya serta nilai opsi yang dibuatnya.
Plugin dapat menawarkan opsi untuk mengekspor / mengimpor pengaturan, sehingga pengaturan dapat disimpan di luar WordPress sebelum dihapus.
Terkait
sumber
Cegah SQL Injection dengan Input Data
Plugin harus membersihkan semua input pengguna yang diambil secara langsung atau tidak langsung (misalnya melalui
$_POST
atau$_GET
) sebelum menggunakan nilai input untuk query database MySQL.Lihat: Memformat pernyataan SQL .
sumber
Awali Semua Item Namespace Global
Sebuah plugin harus benar-benar awalan SEMUA item namespace global (konstanta, fungsi, kelas, variabel, bahkan hal-hal seperti taksonomi kustom, tipe posting, widget, dll.). Misalnya, jangan membuat fungsi yang disebut
init()
; sebagai gantinya, beri nama sesuatu sepertijpb_init()
.Umumnya harus menggunakan awalan tiga atau empat huruf di depan nama atau untuk menggunakan Fitur PHP Namespace . Bandingkan: Awalan satu huruf untuk konstanta kelas PHP?
Terkait
sumber
Gunakan kode PHP5 berorientasi kelas dan objek
Tidak ada alasan untuk tidak menulis kode PHP5 yang bersih dan berorientasi objek. Dukungan PHP4 akan dihapus setelah rilis berikutnya (WP 3.1). Tentu saja, Anda dapat awalan semua nama fungsi Anda untuk berakhir dengan endless_long_function_names_with_lots_of_underscores, tetapi jauh lebih mudah untuk hanya menulis kelas sederhana dan menggabungkan semua yang ada di dalamnya. Juga, letakkan kelas Anda dalam file yang terpisah dan beri nama sesuai sehingga Anda dapat dengan mudah memperluas dan memeliharanya:
sumber
Deaktivasi seharusnya tidak memicu Data-Rugi
Plugin tidak boleh menghapus data apa pun saat dinonaktifkan .
Terkait
sumber
Hanya sertakan file yang Anda butuhkan ...
Jika Anda berada di ujung depan, jangan sertakan kode yang terkait dengan area admin.
sumber
Umumkan Kehilangan Data saat Penghapusan Instalasi Plugin
Setelah menghapus penginstalan, plugin akan meminta pengguna untuk menghapus data dan menerima konfirmasi bahwa pengguna tidak masalah dengan menghapus data sebelum melakukannya dan sebuah pengaya juga harus memungkinkan pengguna opsi untuk menyimpan data pada saat penghapusan instalasi. (Ide ini dari @EAMann.)
Terkait
sumber
Biarkan nama folder plugin diubah
/ plugins / pluginname / {berbagai}
"Pluginname" yang digunakan untuk folder harus selalu dapat diubah.
Ini biasanya ditangani dengan mendefinisikan konstanta dan secara konsisten menggunakannya di seluruh plugin.
Tak perlu dikatakan banyak plugin populer adalah pendosa.
Terkait:
plugins_url()
untuk menghubungkan dengan mudah ke sumber daya, termasuk dengan plugin.sumber
plugin_basename(__FILE__)
untuk mencari tahu nama lokal plugin. Itu berguna untuk memiliki salinan dari plugin yang sama (pengujian, beberapa akun di tempat lain tetapi hanya satu per plugin, ...) juga.Gunakan WordPress (bawaan) penanganan Kesalahan
Jangan hanya
return;
jika beberapa input pengguna salah. Memberi mereka beberapa informasi tentang dilakukan salah.Satu kesalahan (objek) untuk semua
Anda dapat mengatur objek kesalahan global untuk tema atau plugin Anda selama bootstrap:
Kemudian, Anda dapat menambahkan Kesalahan tidak terbatas sesuai permintaan:
Kemudian Anda dapat mengambil semuanya di akhir tema Anda. Dengan cara ini Anda tidak mengganggu rendering halaman dan masih bisa menampilkan semua kesalahan Anda untuk dikembangkan
Anda dapat menemukan informasi lebih lanjut di Q ini . Tiket terkait untuk memperbaiki "kerja sama" dari
WP_Error
danwp_die()
terhubung dari sana dan tiket lain akan mengikuti. Komentar, kritik & semacamnya sangat dihargai.sumber
wp_die();
salah (terbalik). Tentang Q Anda) Saya tidak sepenuhnya mengerti. Ketika Anda membuat sebuah instance dari kelas WP_Error Anda memiliki akses penuh ke data melalui fungsi sepertiget_error_code();
,get_error_message();
,get_error_data();
dan versi jamak. Anda juga bisa hanya instantiate sekali pada bootstrap tema atau plugin Anda dan cukup gunakan$error->add();
untuk mengisi kesalahan lain dan akhirnya output di footer dengan$error->get_error_messages();
untuk menangkap semuanya.WP_Error
danwp_die()
lebih dekat (sudah memiliki tambalan) di bagian bawah Q. Setiap komentar, saran, kritik dan yang lainnya sangat dihargai.Minimalkan Nama yang Ditambahkan ke Global Namespace
Plugin harus mengurangi dampaknya sebanyak mungkin dengan meminimalkan jumlah nama yang ditambahkannya ke namespace global .
Ini dapat dilakukan dengan mengenkapsulasi fungsi plugin ke dalam kelas atau dengan menggunakan fitur ruang nama PHP . Awalan semuanya juga bisa membantu tetapi tidak fleksibel.
Di sebelah fungsi dan kelas, sebuah plugin tidak boleh memperkenalkan variabel global. Menggunakan kelas biasanya menghapusnya dan itu menyederhanakan pemeliharaan plugin.
Terkait
sumber
Komentar menggunakan PhpDoc
Praktik terbaik dekat dengan gaya PhpDoc. Jika Anda tidak menggunakan IDE seperti "Eclipse", Anda bisa melihat Manual PhpDoc .
Anda tidak harus tahu persis bagaimana cara kerjanya. Pengembang Profesional dapat membaca kode itu dan hanya memerlukan ini sebagai ringkasan. Coders dan pengguna hobi mungkin menghargai cara Anda menjelaskannya pada tingkat pengetahuan yang sama.
sumber
Gunakan API Pengaturan sebelum add_option
Alih-alih menambahkan opsi ke DB melalui fungsi add_option, Anda harus menyimpannya sebagai array dengan menggunakan Pengaturan API yang mengatur semuanya untuk Anda.
Gunakan API Modifikasi Tema sebelum add_option
The Modifikasi API adalah membangun cukup sederhana dan cara yang aman yang memungkinkan penambahan dan mengambil pilihan. Semuanya disimpan sebagai nilai serial di basis data Anda. Mudah, aman & sederhana.
sumber
update_option
dan tidak pernahadd_option
, fungsi pembaruan akan membuat opsi ketika tidak ada .. :)add_option
. Ada kasus penggunaan yang baik untuk diadd_option
mana jika opsi sudah diatur, itu tidak berubah, jadi saya menggunakannya dalam aktivasi untuk mempertahankan kemungkinan preferensi pengguna yang sudah ada.add_option
adalah ketika Anda ingin secara otomatis menonaktifkan pemuatan otomatis.update_option
akan memaksa autoload ke true, jadi Anda ingin menonaktifkan autoload, gunakanadd_option
saat membuat opsi.Lindungi Privasi Pengguna Plugin
(Sebelumnya: Komunikasi API Anonim)
Jika plug-in berkomunikasi dengan sistem eksternal atau API (mis. Beberapa layanan Web), itu harus dilakukan secara anonim atau memberikan pengguna dengan opsi anonim yang memastikan bahwa tidak ada data yang terkait dengan pengguna plugin bocor ke pihak kedua yang tidak terkendali.
sumber
Host Plugin di WordPress.org
Gunakan repositori SVN yang disediakan di WordPress.org untuk hosting plugin. Itu membuat untuk pengalaman pengguna yang lebih mudah diperbarui dan jika Anda belum pernah menggunakan SVN sebelumnya, itu membuat Anda benar-benar mengerti dengan menggunakannya dalam konteks yang membenarkannya.
sumber
Berikan Kontrol Akses dengan Menggunakan Izin
Dalam banyak kasus, pengguna mungkin tidak ingin semua orang memiliki akses ke area yang dibuat oleh plugin Anda terutama dengan plugin yang melakukan beberapa operasi kompleks, satu pemeriksaan kemampuan hardcoded mungkin tidak cukup.
Paling tidak, miliki pemeriksaan kemampuan yang sesuai untuk semua jenis prosedur plugin Anda yang dapat digunakan.
sumber
Impor / Ekspor Pengaturan Plugin
Ini tidak umum di seluruh plugin, tetapi jika plugin Anda memiliki (beberapa) pengaturan, itu harus menyediakan Impor / Ekspor data seperti konfigurasi dan input pengguna .
Impor / Ekspor meningkatkan kegunaan plugin.
Plugin contoh yang memiliki fungsi impor dan ekspor (dan juga mekanisme undo) seperti itu adalah Breadcrumb NavXT (Wordpress Plugin) (pengungkapan penuh: beberapa kode kecil oleh saya di sana, sebagian besar telah dilakukan oleh mtekk).
Terkait
sumber
Atur kode Anda
Selalu sulit untuk membaca kode yang tidak ditulis sesuai urutan yang dieksekusi. Pertama-tama termasuk / butuhkan, tentukan, wp_enqueue_style & _script, dll., Lalu fungsi-fungsi yang dibutuhkan plugin / tema dan akhirnya pembangun (mis. Layar admin, hal-hal yang terintegrasi dalam tema, dll.).
Cobalah untuk memisahkan hal-hal seperti css dan js di folder mereka sendiri. Coba juga dengan fungsi-fungsi yang hanya membantu, seperti susunan merata dan sejenisnya. Menjaga file "utama" tetap bersih dan mudah dibaca adalah cara yang membantu pengguna, pengembang, dan Anda, ketika Anda mencoba memperbarui dalam setahun dan belum melihat kode untuk waktu yang lebih lama.
Baik juga memiliki struktur yang sering Anda ulangi, sehingga Anda selalu menemukan jalan keluar. Berkembang dalam struktur yang dikenal pada proyek yang berbeda akan memberi Anda waktu untuk membuatnya lebih baik dan bahkan jika klien Anda beralih ke pengembang lain, Anda tidak akan pernah mendengar "dia meninggalkan kekacauan". Ini membangun reputasi Anda dan harus menjadi tujuan jangka panjang.
sumber
Mati dengan gaya
mati dengan cara yang layak Semua fungsi plugin (dan bahkan tema) harus digunakan
wp_die()
di tempat-tempat penting untuk menawarkan sedikit informasi kepada pengguna tentang apa yang telah terjadi. Kesalahan php menjengkelkan danwp_die
dapat memberi pengguna pesan gaya bagus tentang apa yang dilakukan plugin (atau mereka) salah. Plus, jika pengguna telah menonaktifkan debug, plugin hanya akan rusak.Menggunakan
Terkait:wp_die()
juga membantu plugin / tema Anda kompatibel dengan Wordpress tesuite .sumber
Berikan Layar Bantuan untuk pengguna
Lebih baik mengatakan RTFM (klik bantuan) sebagai jawaban daripada harus menjawab pertanyaan berulang kali.
update / note: (lihat komentar dari kaiser): contoh di atas akan digunakan di kelas
sumber
Tawarkan Formulir yang Dapat Diperpanjang
Ketika sebuah plugin menawarkan kemungkinan untuk memasukkan data, itu harus selalu memiliki kaitan di bagian akhir, tepat sebelum tombol "kirim" dan / atau "setel ulang", sehingga pengembang dapat dengan mudah memperpanjang formulir dengan tidak hanya bidang, tetapi juga tombol.
Lihat: Pengaturan API
Terkait
sumber
termasuk fungsi selalu melalui Hook, bukan secara langsung.
Contoh:
Jangan gunakan untuk memasukkan kelas plugin melalui baru tanpa kail
Gunakan plugins_loaded Hook
Pembaruan: contoh langsung kecil: Plugin-svn-trunk-page dan contoh semu
Anda juga dapat memuat melalui mu_plugins_loaded pada multisite-install, lihat kodeks untuk referensi tindakan: http://codex.wordpress.org/Plugin_API/Action_Reference Juga di sini Anda lihat, bagaimana inPlusing wP dengan kait ini: http: // adambrown. info / p / wp_hooks / hook / plugins_loaded? version = 2.1 & file = wp-settings.php Saya sering menggunakan ini dan ini tidak terlalu sulit dan awal, lebih baik sebagai kelas baru yang sulit ();
sumber
//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
Plugin Lisensi di bawah Lisensi yang Kompatibel GPL
Plug-in dan tema harus dilisensikan di bawah lisensi yang kompatibel dengan WordPress. Ini memungkinkan mereka untuk didistribusikan kembali dengan WordPress sebagai "program." Lisensi yang direkomendasikan adalah GPL . Berhati-hatilah karena semua pustaka kode yang disertakan dengan plug-in kompatibel dengan lisensi yang sama.
(Ini telah menjadi masalah dan titik perdebatan serius baik di masa lalu dan sekarang .)
sumber
Deskripsi plugin Anda harus secara akurat merinci fungsi-fungsi plugin Anda. Ada 10 plugin pos unggulan. Semuanya menampilkan posting yang ditampilkan, namun banyak yang memiliki fitur yang berbeda. Seharusnya mudah membandingkan plugin Anda dengan plugin serupa dengan membaca deskripsi.
Anda harus menghindari membual tentang betapa sederhananya plugin Anda kecuali itu sangat mendasar. Anda harus memasukkan tautan yang bermanfaat dalam deskripsi seperti tautan ke pengaturan.
sumber
Minimalkan efek samping dari Remote Datasources dan layanan Web
Plugin harus Cache / Shield Webservice dan / atau XMLRPC / SOAP permintaan melalui lapisan caching / penyedia data jika Anda menggunakannya agar tidak membuat permintaan depan menunggu (lambat) respons layanan web.
Itu termasuk pengunduhan RSS feed dan halaman lainnya. Rancang plugin Anda bahwa mereka meminta data di latar belakang.
Satu LANGKAH yang memungkinkan adalah (Ambil contoh ke ping.fm sebagai contoh): Buat tabel buffer, katakanlah: ping_fm_buffer_post (tanggal, waktu, pesan, dikirimkan_waktu, status)
sumber
Uji plugin Anda
Kita harus memiliki beberapa alat pengujian pada lingkungan pengembangan plugin kita.
Berdasarkan jawaban oleh Ethan Seifert untuk pertanyaan pengujian, ini adalah praktik yang baik untuk diikuti:
sumber