Tujuan Praktik Terbaik untuk Pengembangan Plugin? [Tutup]

135

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.

MikeSchinkel
sumber
Saya benar-benar tidak mengerti bagaimana komunitas wiki harus bekerja dengan ini (dan yang lainnya) dengan SE dengan benar, tapi mungkin itu pertanyaan tentang meta. Itu hanya akan menumpuk sebagian besar dupes dalam jawaban.
hakre
@akre: Poin bagus. Setelah melihat hal yang saya akan tambahkan ke deskripsi bahwa orang harus menambahkan hanya satu ide per "jawaban" dan saya akan mengubah jawaban saya yang ada menjadi beberapa jawaban.
MikeSchinkel

Jawaban:

72

Gunakan Tindakan dan Filter

Jika menurut Anda orang ingin menambah atau mengubah beberapa data: berikan apply_filters () sebelum kembali .

PS Satu hal yang saya temukan agak mengecewakan dan bahwa alamat pertanyaan Anda adalah persentase plugin yang dirancang hanya untuk pengguna akhir, yaitu yang tidak memiliki kaitannya sendiri. Bayangkan jika WordPress dirancang seperti kebanyakan plugin? Ini akan menjadi tidak fleksibel dan solusi yang sangat niche.

Mungkin hal akan berbeda jika WordPress memiliki kemampuan untuk menginstal plugin secara otomatis yang bergantung pada plugin lain? Karena saya biasanya harus menulis banyak fungsi yang saya butuhkan dari awal karena klien menginginkan sesuatu dengan cara tertentu dan plugin yang tersedia, sementara 90% di sana, jangan izinkan saya fleksibilitas untuk memperbarui 10% sisanya.

Saya benar-benar berharap mereka yang memimpin komunitas WordPress akan mengidentifikasi cara untuk memastikan bahwa plugin dihargai untuk mengikuti praktik terbaik (seperti menambahkan kait untuk pengembang lain) seperti halnya jawaban yang baik diberikan pada situs StackExchange.

Mari kita ambil contoh dari pertanyaan lain :

Contoh: Saya ingin melakukan sesuatu di plugin saya ketika seseorang me-retweet sebuah artikel. Jika ada pengait khusus pada apa pun plugin retweet yang populer yang dapat saya gunakan untuk terhubung dan dimatikan, itu akan bagus. Tidak ada, jadi saya bisa memodifikasi plugin mereka untuk memasukkannya, tetapi itu hanya berfungsi untuk salinan saya, dan saya tidak ingin mencoba mendistribusikannya kembali.

Terkait

Arlen Beiler
sumber
55

Muat Script / CSS dengan wp_enqueue_scriptdanwp_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_scriptdan wp_enqueue_styleketika menautkan file JS dan CSS dan tidak pernah secara langsung melalui <script>tag.

Terkait

hakre
sumber
1
Saran : Mungkin perlu menempel catatan kecil tentang menggunakan dependancies di sana (karena itu bagian dari sistem enqueue).
t31os
Benar, tetapi yang lebih baik adalah Anda mendaftarkan style dan skrip sebelum dan kemudian membuat skrip ini melalui ID. Ini sangat baik bagi pengembang lain untuk mengubah skrip atau menggunakannya dalam plugin khusus. Ini juga lebih mudah untuk mengubah urutan atau membuat file musim panas.
bueltge
2
plus, Muat skrip dan gaya pada halaman yang diperlukan. scribu.net/wordpress/optimal-script-loading.html
MR
49

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 inittindakan 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+)

[...]
Akhirnya, saya ingin menunjukkan bahwa penting untuk memuat file bahasa pengguna khusus dari WP_LANG_DIR sebelum Anda memuat file bahasa yang dikirimkan bersama plugin . Ketika banyak file-file dimuat untuk domain yang sama, terjemahan yang ditemukan pertama kali akan digunakan. Dengan cara ini file bahasa yang disediakan oleh plugin akan berfungsi sebagai fallback untuk string yang tidak diterjemahkan oleh pengguna.

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/' 
    );
}
Stiofan O'Connor
sumber
Bagi saya yang paling penting. Tidak banyak pekerjaan tambahan untuk melakukannya, tetapi salah satu hal yang dapat Anda lakukan adalah membuat plugin Anda lebih bermanfaat bagi jutaan pengguna yang tidak berbicara bahasa Inggris sebagai bahasa pertama mereka. Anda bahkan tidak harus menerjemahkan sendiri kata apa pun, tetapi siapkan semuanya untuk diterjemahkan.
2ndkauboy
Ini adalah hal yang berharga, namun mudah untuk dilakukan, hanya ingin mengatakan saya setuju dan setiap pembuat plugin harus melakukan ini.
t31os
48

Pastikan Plugin Hasilkan Kesalahan Tidak dengan WP_DEBUG

Selalu uji plugin Anda dengan WP_DEBUGdihidupkan dan idealnya dihidupkan selama proses pengembangan Anda. Plugin tidak boleh melempar kesalahan APA SAJA WP_DEBUG. Ini termasuk pemberitahuan yang sudah usang dan indeks yang tidak dicentang.

Untuk mengaktifkan debugging, edit wp-config.phpfile Anda sehingga WP_DEBUGkonstanta diatur ke true. Lihat Codex di Debug untuk detail lebih lanjut.

John P Bloch
sumber
Silakan lihat UPDATE tentang hanya memiliki praktik terbaik per jawaban; dapatkah Anda membagi menjadi beberapa jawaban?
MikeSchinkel
Tentu tidak masalah. Maaf soal itu.
John P Bloch
Terima kasih, dan bukan pengawasan Anda, itu milik saya. Saya merevisi pertanyaan untuk meminta satu praktik terbaik per jawaban berdasarkan pertanyaan @ hakre tentang duplikat dan cara membuatnya.
MikeSchinkel
6
Jika saya bisa menaikkan jawaban ini dua kali, saya akan melakukannya. Sangat menyebalkan ketika saya sedang mengerjakan situs dev dan harus mematikan WP_DEBUG karena plugin yang perlu saya gunakan memuntahkan peringatan dan pemberitahuan di semua tempat.
Ian Dunn
42

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

hakre
sumber
Salah satu masalah terbesar di sini adalah belajar bahwa ada fungsi yang sesuai yang ada. Apa yang akan berguna akan menjadi tempat untuk memposting kode dan / atau fungsionalitas perlu memungkinkan komunitas untuk mengomentari fungsi mana yang paling baik digunakan. Mungkin StackExchange dapat digunakan untuk ini?
MikeSchinkel
Puh. Itu akan sangat sulit dan saya kira semacam tugas tanpa akhir. Saya pikir memperluas kodeks dengan cara ini akan menjadi yang terbaik, karena sudah ada.
kaiser
Saya kira memperluas codex dan mungkin menghubungkan dari sana ke thread stockexchange terkait akan cukup baik.
kaiser
4
Masalah dengan itu adalah bahwa banyak inti tidak benar-benar dirancang secara struktural untuk dapat digunakan kembali. Saya hanya perlu menyalin dan sedikit memodifikasi setengah fungsi manipulasi / metadata gambar untuk membuat post-type berperilaku seperti attachment saya sendiri, hanya karena fungsi seperti berhemat () memanggil beberapa fungsi yang menyertakan pemeriksaan hardcoded untuk post-type = 'attachment ' Ada banyak hal seperti wp_count_posts () yang tidak fleksibel menjadi contoh lain. Sebelum Anda benar-benar dapat menggunakan kembali WP inti perlu refactoring lengkap.
wyrfel
Sepenuhnya menyetujui hal ini. Saya semua waktu contoh favorit: wp-login.php. Jadi, "Jika Anda bisa" adalah pemula yang baik untuk jawabannya ...
kaiser
35

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

hakre
sumber
4
Ini seharusnya merupakan perilaku default, tapi itu juga harus meminta pengguna untuk menyimpan beberapa data ... seperti ketika mencopot gim video bertanya apakah Anda ingin menghapus gim yang disimpan dan materi yang diunduh. Seorang pengguna mungkin hanya menonaktifkan plug-in untuk tujuan pengujian dan tidak ingin kembali melalui pengaturan opsi mereka ketika mereka mengaktifkannya kembali.
EAMann
1
Saya hanya berbicara tentang kapan sebuah plugin dihapus sepenuhnya, bukan ketika itu dinonaktifkan.
Travis Northcutt
2
Saya mengerti itu ... tapi kadang-kadang saya akan menghapus plug-in sehingga saya dapat menambahkannya kembali secara manual dari cadangan atau versi beta yang belum dihosting di repositori ...
EAMann
4
@ EAMann: Untuk itu dan untuk memigrasikan plugin ke server lain, sebuah plugin harus menyediakan mekanisme untuk mengekspor dan mengimpor pengaturan.
hakre
2
Saya telah melihat beberapa plugin menawarkan tombol "Uninstall" di pengaturan mereka dengan peringatan merah besar itu akan menghapus semua data. Ini terpisah dari de-aktivasi, dan saya pikir cara yang bagus untuk menanganinya. Tidak semua orang menggunakan tombol "Hapus" untuk menghapus plugin.
gabrielk
34

Cegah SQL Injection dengan Input Data

Plugin harus membersihkan semua input pengguna yang diambil secara langsung atau tidak langsung (misalnya melalui $_POSTatau$_GET ) sebelum menggunakan nilai input untuk query database MySQL.

Lihat: Memformat pernyataan SQL .

hakre
sumber
5
Anda juga harus membersihkan data yang keluar dari database. Pada dasarnya, jangan pernah mempercayai data apa pun yang tidak dikodekan. codex.wordpress.org/Data_Validation juga merupakan referensi yang bagus.
Ian Dunn
31

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 seperti jpb_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

hakre
sumber
31

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:

// 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
    }
}
Serak
sumber
jangan gunakan MyCoolPlugin baru (); saya pikir lebih baik Anda menghubungkan WP melalui Hook: plugins_loaded
bueltge
Tidak yakin tentang itu. Menurut codex plugins_loaded adalah salah satu hal pertama yang dimuat, jadi saya pikir tidak ada bedanya untuk melakukan konstruksi seperti ini, atau menambahkannya sebagai tindakan.
Husky
5
itu hanya salah satu praktik terbaik yang membuatnya lebih baik untuk semua orang.
Arlen Beiler
1
Sejauh yang saya lihat menambahkan kait ke plugins_loaded membuat nol peningkatan, dan tidak akan menjadi praktik terbaik karena tidak ada perbaikan, jika ada peningkatan penggunaan memori, penurunan kecepatan karena harus melalui tindakan alih-alih tindakan yang baru saja ditambahkan. Juga menggunakan OO tidak boleh dianggap sebagai praktik terbaik.
Backie
4
@IanDunn: jika Anda menginginkan dukungan PHP4, tetapi dukungan PHP4 telah dicabut sejak 2008, lebih dari 4 tahun yang lalu. Tidak ada alasan untuk tetap menggunakan pemeriksaan khusus PHP4.
Husky
23

Hanya sertakan file yang Anda butuhkan ...

Jika Anda berada di ujung depan, jangan sertakan kode yang terkait dengan area admin.

Denis de Bernardy
sumber
21

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

hakre
sumber
3
Wordpress sendiri menampilkan pesan peringatan di admin, bahwa ini terjadi (setidaknya di bagasi sekarang).
hakre
Selain dari pesan peringatan yang ditampilkan oleh WordPress, tidak mungkin plugin meminta pengguna, karena pada saat penghapusan instalan sudah dinonaktifkan. Tetapi lihat tiket # 20578 .
JD
19

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.
AndyBeard
sumber
Mengganti nama folder plugin akan menyebabkan pembaruan otomatis terputus, jadi saya tidak yakin itu yang terbaik untuk dilakukan.
mtekk
Anda harus mengaktifkan kembali plugin setelah melakukan perubahan (perubahan nama kemungkinan akan mengakibatkan penonaktifan plugin), di mana WP akan membuat kembali atau memperbarui entri DB yang sesuai terkait dengan plugin (sehingga tidak akan hentikan pembaruan sama sekali).
t31os
Alih-alih menggunakan konstanta, gunakan 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.
Raphael
19

Gunakan WordPress (bawaan) penanganan Kesalahan

Jangan hanya return;jika beberapa input pengguna salah. Memberi mereka beberapa informasi tentang dilakukan salah.

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...
}

Satu kesalahan (objek) untuk semua

Anda dapat mengatur objek kesalahan global untuk tema atau plugin Anda selama bootstrap:

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' );

Kemudian, Anda dapat menambahkan Kesalahan tidak terbatas sesuai permintaan:

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...
}

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

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' );

Anda dapat menemukan informasi lebih lanjut di Q ini . Tiket terkait untuk memperbaiki "kerja sama" dari WP_Errordan wp_die()terhubung dari sana dan tiket lain akan mengikuti. Komentar, kritik & semacamnya sangat dihargai.

kaiser
sumber
Mengapa Anda instantiate objek WP_Error jika Anda hanya mengakses properti itu dan tidak pernah melewatkan instance sebagai objek?
ProfK
@ProfK saya mengolahnya menjadi lebih pendek dan judul / kontennya 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 seperti get_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.
kaiser
@ProfK saya akan memposting pembaruan masa depan untuk Q ini . Saat ini saya sedang memeriksa perilaku kelas kesalahan wp dan ingin menulis tiket tentang API kesalahan tema publik (konsep sudah dilakukan). Anda akan menemukan tautan ke tiket lain yang menyatukan WP_Errordan wp_die()lebih dekat (sudah memiliki tambalan) di bagian bawah Q. Setiap komentar, saran, kritik dan yang lainnya sangat dihargai.
kaiser
18

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

hakre
sumber
Bisakah Anda memindahkan "seharusnya tidak memperkenalkan variabel global" ke jawabannya sendiri? Itu terkait dengan terpisah dari pertanyaan ini dan sebenarnya yang saya ingin debat (keduanya karena saya pikir saya mungkin tidak setuju adalah kasus khusus dan karena saya ingin belajar dari pendapat orang lain.)
MikeSchinkel
17

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.

kaiser
sumber
17

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.

kaiser
sumber
1
Dan selanjutnya, gunakan update_optiondan tidak pernah add_option, fungsi pembaruan akan membuat opsi ketika tidak ada .. :)
t31os
3
Saya tidak akan mengatakan tidak pernah menggunakan add_option. Ada kasus penggunaan yang baik untuk di add_optionmana jika opsi sudah diatur, itu tidak berubah, jadi saya menggunakannya dalam aktivasi untuk mempertahankan kemungkinan preferensi pengguna yang sudah ada.
ProfK
1
Kasus penggunaan lain add_optionadalah ketika Anda ingin secara otomatis menonaktifkan pemuatan otomatis. update_optionakan memaksa autoload ke true, jadi Anda ingin menonaktifkan autoload, gunakan add_optionsaat membuat opsi.
Dave Romsey
16

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.

EAMann
sumber
15

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.

MikeSchinkel
sumber
15

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.

eddiemoya
sumber
12

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

hakre
sumber
12

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.

kaiser
sumber
Saya khawatir ini terlalu banyak tentang gaya yang orang akan debat dan bukan praktik terbaik yang obyektif yang disetujui oleh semua orang yang dihormati. Sangat penting kami hanya membahas praktik terbaik yang obyektif sehingga orang akan bersedia untuk menyetujui "memberkati" daftar tersebut sebagai lawan dari memiliki barang kontroversial, tidak peduli seberapa baik artinya.
MikeSchinkel
11

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 dan wp_diedapat memberi pengguna pesan gaya bagus tentang apa yang dilakukan plugin (atau mereka) salah. Plus, jika pengguna telah menonaktifkan debug, plugin hanya akan rusak.

Menggunakan wp_die()juga membantu plugin / tema Anda kompatibel dengan Wordpress tesuite .

Terkait:
hakre
sumber
11

Berikan Layar Bantuan untuk pengguna

Lebih baik mengatakan RTFM (klik bantuan) sebagai jawaban daripada harus menjawab pertanyaan berulang kali.

/**
  * 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);

update / note: (lihat komentar dari kaiser): contoh di atas akan digunakan di kelas

edelwater
sumber
Harus ada di kotak alat everyones (selama Anda harus menjelaskan layar admin ui tertentu). +1
kaiser
Btw: Anda harus menyebutkan, bahwa ini dimaksudkan untuk berada di Kelas dan bagaimana berinteraksi dengan $ this -> _ page_id & bagaimana jadinya jika Anda akan menambahkan kait tindakan dari functions.php atau file plugin tanpa Kelas .
kaiser
9

termasuk fungsi selalu melalui Hook, bukan secara langsung.

Contoh:

  • Jangan gunakan untuk memasukkan kelas plugin melalui baru tanpa kail

  • Gunakan plugins_loaded Hook

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

Pembaruan: contoh langsung kecil: Plugin-svn-trunk-page dan contoh semu

//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

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 ();

bueltge
sumber
@bueltige --- bisakah Anda menjelaskan yang satu ini lebih sedikit
NetConstructor.com
3
contoh langsung kecil: [Plugin-svn-trunk-page] svn.wp-plugins.org/filter-rewrite-rules/trunk/… dan contoh pseudo //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
bueltge
2
@ Netconstructor.co - saya telah memperbarui utas, komentar buruk untuk kode
bueltge
8

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 .)

EAMann
sumber
Mari kita selesaikan
hakre
8

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.

Greg
sumber
7

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)

  1. Untuk setiap kali Anda ingin mengirim pembaruan ke ping.fm, tambahkan ke tabel ini.
  2. Sekarang, kita perlu membuat plugin untuk menangani data ini. Plugin ini akan dijalankan melalui crontab untuk memeriksa setiap pembaruan yang belum dikirim
  3. Karena kami memiliki tabel ini, kami juga dapat mencantumkan setiap pesan yang dikirimkan ke ping.fm dan memeriksa status setiap posting. Kalau-kalau ada masalah di sisi ping.fm, kita bisa mengirimkannya kembali.
hakre
sumber
Saya tidak benar-benar mengerti ke mana Anda akan pergi dengan ini. Bisakah Anda memberikan beberapa tautan ke materi pendukung?
MikeSchinkel
Juga, saya tidak yakin apa itu "Overhead Bersih" . Apakah tidak ada istilah yang lebih baik? Jika lebih jelas itu akan menjadi aturan objektif yang lebih baik. Dan Mencegah " tidak mungkin; " Minimalkan " ?
MikeSchinkel
Kamu mungkin benar. Perkataan buruk dan mencegah tidak pernah mungkin, meminimalkan kecocokan yang lebih baik.
hakre
7

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:

  • Unit Testing Anda harus menguji jumlah perilaku terkecil yang dapat dilakukan oleh suatu kelas.
  • Ketika Anda naik ke tingkat pengujian fungsional ini adalah tempat Anda dapat menguji kode Anda dengan dependensi Wordpress.
  • Bergantung pada apa yang dilakukan plugin Anda - pertimbangkan untuk menggunakan tes berbasis Selenium yang menguji keberadaan data di DOM dengan menggunakan ID
Fernando Briano
sumber
Sementara pengujian itu penting, mengatakan unit test harus menguji yang terkecil dan bukan yang terbesar tampaknya tidak bijaksana. Jika Anda mengalami kesulitan dalam menguji masalah-masalah yang bergantung pada WordPress kemudian langsung masuk ke inti WordPress, Anda akan menemukan sejumlah variabel global internal yang dapat Anda gunakan untuk melihat apakah item-item telah berfungsi.
Backie
1
Tetapi mencakup yang terkecil terlebih dahulu adalah dasar, sehingga Anda dapat mencapai pengujian fungsional dengan WordPress seperti jawabannya, bukan begitu?
Fernando Briano
1
Ini adalah plugin bukan aplikasi, dapatkah Anda menguji aplikasi Java tanpa Java Runtime? Ya, dengan menulis Java sebagai mockup dan kemudian menguji plugin Anda. Kemungkinan bug ada di mockup Anda. *) penafian atau kompilasi ke kode asli.
edelwater