Menulis plugin Extensible dengan Action dan filter
() translation by (you can also view the original English article)
Salah satu dari banyak hal yang Anda akan menemukan ketika menyelidiki pengembang plugin bagus kode adalah custom hook dan filter yang pengembang telah ditempatkan di seluruh plugin. Munculnya action hook dan filter membuat plugin "extensible", berarti bahwa plugin dan tema lain dapat memanipulasi atau menambahkan ke perilaku plugin.
Menulis plugin extensible adalah sesuatu yang saya ingin menyarankan Anda untuk melakukannya. Ada banyak alasan bagus mengapa Anda harus melakukannya, tetapi sangat sedikit (jika ada) alasan mengapa Anda harus menghindari praktek ini.
Kita akan melihat beberapa elemen extensible plugin:
- Penjelasan dari apa itu extensible plugin
- Alasan mengapa Anda harus menulis plugin extensible
- Alat dasar yang Anda butuhkan
- Bagaimana Anda perlu untuk menulis plugin untuk membuat mereka extensible
- Contoh sederhana hook dan filter untuk menggambarkan bagaimana Anda mungkin menggunakannya
Satu catatan penting: tutorial ini akan menggunakan teknik pemrograman prosedural murni. Segala sesuatu yang saya bicarakan di sini masih berlaku apabila menggunakan Object Oriented Programming (OOP), tetapi itu lebih sederhana untuk pertama kali mempelajari teknik ini dalam suasana prosedural.
Apa itu Plugin Extensible?
Plugin extensible adalah salah satu yang dapat dimodifikasi dan ditambahkan di luar tujuan aslinya oleh plugin atau tema yang lain. Ketika sebuah plugin extensible, plugin lain (atau tema) dapat mengubah perilaku atau output plugin. Sebagai contoh, e-commerce plugin memungkinkan menambahkan add-on gateway pembayaran yang mengizinkan pembelian untuk diproses melalui sistem pembayaran tambahan. Gateway pembayaran ini adalah plugin terpisah yang hanya terhubung ke plugin core dan menambah fungsinya.
Setiap dan semua plugin dapat extensible, meskipun hanya minoritas kecil plugin yang dipublish. Untuk menjadi extensible, atau modular (istilah lain untuk hal yang sama), pengembang plugin yang harus membuat keputusan sadar untuk membuatnya seperti itu dengan menerapkan elemen penting yang membuatnya mungkin bagi plugin dan tema untuk mengikat ke core plugin perilaku lain .
Mengapa menulis plugin Extensible?
Ada banyak alasan yang baik untuk menulis plugin extensible, tetapi salah satu alasan utama adalah bahwa hanya tidak ada alasan yang baik untuk tidak menulis plugin Anda dengan cara ini, terutama ketika plugin yang dirilis ke komunitas WordPress, baik sebagai plugin gratis atau berbatar.
Ketika Anda menulis plugin extensible, Anda membuatnya mungkin bagi pengembang lain untuk menambah plugin Anda dan membuatnya bahkan lebih baik, tetapi tanpa pernah mengubah kode sumber inti. Anda juga membuatnya secara signifikan lebih mudah bagi pengembang dan pengguna untuk beradaptasi plugin untuk memenuhi kebutuhan mereka lebih baik. Mari saya beri contoh: di plugin Easy Digital Downloads ada sistem kode diskon. Kode diskon dibatasi untuk penggunaan single per pengguna, sehingga jika pengguna mencoba untuk menerapkan sama diskon pada pembelian berbeda dua, mereka akan menerima kesalahan. Salah satu pengguna asli saya menemukan bahwa ia tidak menginginkan untuk membatasi diskon untuk penggunaan single per pengguna, jadi saya memberikan fungsi sederhana yang dia masukan ke dalam sebuah plugin kustom baru dan pembatasan dihapus, tanpa menyentuh setiap kode plugin inti.
Extensible kode juga membuat pengembang lain sangat senang ketika mereka merasa karena pekerjaan mereka mengadaptasi kode Anda hanya menjadi jauh, jauh lebih mudah.
Dasar Tools / fungsi
Ada beberapa alat kunci yang Anda butuhkan untuk menulis plugin extensible. Jika Anda telah menulis plugin atau tema apapun sebelum membaca ini, Anda akan mungkin setidaknya agak akrab dengan fungsi-fungsi ini, bahkan jika itu hanya karena Anda telah melihat mereka digunakan.
Sebelum saya tunjukkan fungsi-fungsi yang akan Anda gunakan, mari kita bicara tentang dua konsep utama pertama: hook dan filter.
actin hook adalah tempat di plugin Anda yang dapat "terhubung" ke oleh fungsi (baik di plugin Anda dengan plugin lain) untuk memiliki kode mereka dieksekusi pada saat itu. Bila action hook berjalan, Semua fungsi yang terhubung atau "terpancing", untuk itu akan menjalankan juga.
filter hook ini juga merupakan tempat di plugin Anda untuk fungsi lainnya untuk mengikat ke dalam, tetapi mereka bekerja sedikit berbeda dibandingkan action. Filter memungkinkan data yang akan dimanipulasi atau dimodifikasi sebelum digunakan.
Perbedaan utama antara action dan filter adalah bahwa action biasanya digunakan untuk eksekusi fungsi dan filter biasanya digunakan untuk memanipulasi data.
Kecuali Anda sudah sangat akrab dengan tindakan dan filter, saya akan sangat menyarankan Anda untuk pergi membaca entri Codex pada mereka.
Untuk action ada 4 fungsi utama:
-
do_action()
- ini menentukan lokasi hookable untuk action -
add_action()
- ini melekat pada fungsi hook dibuat dengando_action()
-
has_action()
- ini akan memeriksa untuk melihat jika action telah terdaftar dengando_action()
-
remove_action()
- ini akan menghapus action yang denganadd_action()
Dari keempat, Anda akan menggunakan do_action()
dan add_action()
yang paling banyak dipakai.
Filter juga ada 4 fungsi utama:
-
apply_filters()
- ini menciptakan lokasi hookable untuk filter kustom untuk mengikat ke -
add_filter()
- ini melekat pada filter kustom hook dibuat denganapply_filters()
-
has_filter()
- ini akan memeriksa untuk melihat jika filter telah terdaftar denganapply_filters()
-
remove_filter()
- ini akan menghapus filter sebelumnya terhubung keapply_filters()
Seperti dengan tindakan, apply_filters()
dan add_filter()
adalah dua yang paling akan Anda gunakan.
Jika Anda bingung saat ini, jangan khawatir, kita akan melihat bagaimana untuk benar-benar menggunakan ini pada bagian berikutnya.
Implementasi di plugin Anda sendiri
Untuk membuat plugin Anda benar-benar extensible, Anda perlu menggunakan fungsi kunci yang disebutkan di atas seluruh seluruh plugin. Pada awalnya Anda mungkin merasa sulit, rumit, mengganggu, atau banyak lainnya berlaku kata sifat, untuk terus-menerus menempatkan fungsi tambahan seluruh kode Anda, terutama ketika Anda tidak melihat manfaat langsung atau menggunakan mereka.
Apa yang Anda akan menemukan, bagaimanapun, adalah bahwa setelah Anda dalam kebiasaan menulis plugin Anda dengan semua fungsi-fungsi ini dalam pikiran, ini akan menjadi sifat kedua untuk memasukkan mereka.
Ada beberapa skenario utama di mana Anda akan menggunakan filter di plugin:
- Ketika array di setup. Filter akan ditambahkan di sini sehingga plugin lain dapat memodifikasi data sebelum digunakan.
- Ketika objek data di setup. Seperti dengan array, Anda akan menggunakan filter pada objek sehingga pengembang lain dapat mengubah objek sebelum digunakan.
- Ketika string data di setup. Dengan filter tersedia pada tali, pengembang lain dapat mengubah seluruh string, mengubah bagian-bagian itu, atau menambahkan ke atasnya.
Skenario di atas, hal ini paling umum untuk menggunakan filter ketika data dikembalikan atau hanya sebelum digunakan. Misalnya, jika Anda memiliki sebuah plugin yang melakukan query post, lebih baik untuk memasukan array query argumen filter sebelum mereka dimasuken ke get_posts()
atau WP_Query
sehingga orang lain dapat memanipulasi query sebelum itu dibuat.
Ketika datang ke act90j, ada juga beberapa contoh utama yang mana Anda akan memakai mereka:
- Sebelum tugas dijalankan.
- Setelah tugas yang dijalankan.
- Dalam markup Anda untuk memungkinkan tambahan markup dimasukkan.
Mari kita mempertimbangkan beberapa contoh sekarang.
1. menampilkan HTML dengan Shortcode
Shortcode bahwa output HTML sangat umum (sebenarnya mereka adalah mungkin yang paling umum dari semua shortcode), dan salah satu cara bahwa kita dapat membuat plugin shortcode yang lebih ramah untuk pengembang lain adalah dengan memberikan cara bagi mereka untuk mengubah isi shortcode, tetapi tanpa memerlukan bahwa itu telah dan terdaftar lagi.
Semua shortcode dikembalikan daripada diecho isinya, yang berarti bahwa data ditampilkan ke layar akan berupa string sebelum itu dikembalikan. Karena seluruh HTML output berupa string, Anda dapat memasukan string filter sebelum dikembalikan. Melakukan hal itu akan membuat mungkin bagi pengembang lain untuk mengubah HTML shortcode Anda.
Seorang pengembang mungkin ingin menambahkan tambahan markup sebelum dan setelah default HTML: dengan filter di tempat, mereka bisa melakukan itu.
Shortcode Anda mungkin terlihat seperti ini:
1 |
|
2 |
function wptp_sample_shortcode( atts, $content = null ) { |
3 |
|
4 |
$html = '<div class="wptp_shortcode">'; |
5 |
$html .= '<p>Contents of the sample shortcode</p>'; |
6 |
$html .= '</div>'; |
7 |
|
8 |
return $html; |
9 |
|
10 |
}
|
Kita dapat meningkatkan ini dengan menambahkan filter ke ke kembalian, jadi:
1 |
|
2 |
function wptp_sample_shortcode( atts, $content = null ) { |
3 |
|
4 |
$html = '<div class="wptp_shortcode">'; |
5 |
$html .= '<p>Contents of the sample shortcode</p>'; |
6 |
$html .= '</div>'; |
7 |
|
8 |
return apply_filters( 'wptp_shortcode_html', $html ); |
9 |
|
10 |
}
|
HTML di shortcode kami sekarang akan diubah seperti ini:
1 |
|
2 |
function wptp_modify_html( $html ) { |
3 |
return '<div class="extra_div">' . $html . '</div>'; |
4 |
}
|
5 |
add_filter( 'wptp_shortcode_html', 'wptp_modify_html' ); |
Hal ini akan mengakibatkan HTML original dibuat di shortcode yang dibungkus dengan tag div
yang lain.
2. query Posts
Melakukan kustom queries dalam plugin adalah praktek yang umum. Mari kita bayangkan untuk sesaat bahwa Anda telah menulis sebuah plugin yang register custom post type dinamai "books", dan di plugin Anda adalah fungsi untuk menampilkan buku dibuat. Fungsi Anda untuk query buku mungkin terlihat seperti ini:
1 |
|
2 |
function wptp_show_books() { |
3 |
|
4 |
$query_args = array( |
5 |
'post_type' => 'books', |
6 |
'posts_per_page' => 5 |
7 |
);
|
8 |
|
9 |
$books = new WP_Query( $query_args ); |
10 |
if( $books->have_posts() ) : |
11 |
while( $books->have_posts() ) : $books->the_post() |
12 |
// show info about each book here
|
13 |
endwhile; |
14 |
endif; |
15 |
wp_reset_postdata(); |
16 |
|
17 |
}
|
Tapi bagaimana jika pengguna ingin mengubah jenis buku yang dikembalikan, mungkin memilih buku hanya dari kategori tertentu? Anda dapat membuat ini lebih mudah bagi mereka dengan melakukan hal ini:
1 |
|
2 |
function wptp_show_books() { |
3 |
|
4 |
$query_args = array( |
5 |
'post_type' => 'books', |
6 |
'posts_per_page' => 5, |
7 |
'author' => 3 |
8 |
);
|
9 |
|
10 |
$books = new WP_Query( apply_filters( 'wptp_books_query', $query_args ) ) ; |
11 |
if( $books->have_posts() ) : |
12 |
while( $books->have_posts() ) : $books->the_post() |
13 |
// show info about each book here
|
14 |
endwhile; |
15 |
endif; |
16 |
wp_reset_postdata(); |
17 |
|
18 |
}
|
Satu-satunya perubahan yang saya buat adalah untuk menambahkan filter di sekitar $query_args
, yang berarti pengembang lain (atau pengguna) dapat memodifikasi query argumen sebelum mereka benar-benar dimasukan untuk WP_Query
. Sebagai contoh, kita bisa mengatur permintaan untuk hanya menampilkan buku-buku dari 3 penulis seperti ini:
1 |
|
2 |
function wptp_alter_books_query( $args ) { |
3 |
$args['author'] = 3; |
4 |
return $args; |
5 |
}
|
6 |
add_filter( 'wptp_books_query', 'wptp_alter_books_query' ); |
3. Extending Markup
Mari kita memperluas pada contoh nomor 2 sekarang dan membuatnya lebih baik. Kami sudah menambahkan filter yang memungkinkan pengguna untuk memodifikasi query, sekarang mari kita menambahkan beberapa hook untuk memberitahu kami mengubah HTML yang dibuat.
Pertama kita akan memodifikasi HTML original kita sedikit:
1 |
|
2 |
function wptp_show_books() { |
3 |
|
4 |
$query_args = array( |
5 |
'post_type' => 'books', |
6 |
'posts_per_page' => 5, |
7 |
'author' => 3 |
8 |
);
|
9 |
|
10 |
$books = new WP_Query( apply_filters( 'wptp_books_query', $query_args ) ; |
11 |
if( $books->have_posts() ) : |
12 |
|
13 |
echo '<div class="wptp_books">'; |
14 |
|
15 |
while( $books->have_posts() ) : $books->the_post() |
16 |
|
17 |
echo '<div class="wptp_book">'; |
18 |
|
19 |
echo '<h3 class="wptp_book_title">' . get_the_title() . '</h3>'; |
20 |
|
21 |
echo '</div>'; |
22 |
|
23 |
endwhile; |
24 |
|
25 |
echo '</div>'; |
26 |
|
27 |
endif; |
28 |
wp_reset_postdata(); |
29 |
|
30 |
}
|
Sekarang kami ingin memungkinkan pengembang untuk menambahkan tambahan markup pada berbagai titik, seperti berikut:
- Sebelum apapun HTML ditampilkan
- Setelah HTML berakhir
- Sebelum title setiap buku
- Setelah title setiap buku
Anda dapat membayangkan skenario di mana pengguna ingin menambahkan thumbnail sebelum atau setelah judul. Untuk membuat ini mungkin, kita menggunakan do_action()
untuk membuat lokasi hookable, seperti ini:
1 |
|
2 |
function wptp_show_books() { |
3 |
|
4 |
$query_args = array( |
5 |
'post_type' => 'books', |
6 |
'posts_per_page' => 5, |
7 |
'author' => 3 |
8 |
);
|
9 |
|
10 |
$books = new WP_Query( apply_filters( 'wptp_books_query', $query_args ) ); |
11 |
if( $books->have_posts() ) : |
12 |
|
13 |
do_action( 'wptp_books_before' ); |
14 |
echo '<div class="wptp_books">'; |
15 |
|
16 |
while( $books->have_posts() ) : $books->the_post() |
17 |
|
18 |
echo '<div class="wptp_book">'; |
19 |
|
20 |
do_action( 'wptp_before_book_title', get_the_ID() ); |
21 |
|
22 |
echo '<h3 class="wptp_book_title">' . get_the_title() . '</h3>'; |
23 |
|
24 |
do_action( 'wptp_after_book_title', get_the_ID() ); |
25 |
|
26 |
echo '</div>'; |
27 |
|
28 |
endwhile; |
29 |
|
30 |
echo '</div>'; |
31 |
do_action( 'wptp_books_after' ); |
32 |
|
33 |
endif; |
34 |
wp_reset_postdata(); |
35 |
|
36 |
}
|
Perhatikan bahwa dua inner hok (sekitar judul) memiliki parameter kedua get_the_ID()
. Variabel ini, yang akan menjadi ID dari buku, akan tersedia sebagai parameter untuk setiap fungsi yang di hook. Untuk menambahkan buku thumbnail, misalnya, kita dapat melakukan ini:
1 |
|
2 |
function wptp_show_book_image( $book_id ) { |
3 |
echo get_the_post_thumbnail( $book_id, 'thumbnail' ); |
4 |
}
|
5 |
add_action( 'wptp_before_book_title', 'wptp_show_book_image' ); |
Contoh-contoh asli
Saya ingin sekarang menunjukkan beberapa contoh nyata dari plugin yang extensible, termasuk sampel dari beberapa fungsi mereka extensible.
1. Soliloquy
Soliloquy adalah powerful responsif gambar slider plugin WordPress yang membuat menciptakan dan memelihara responsif, efisien, aman dan SEO friendly gambar slider jadi mudah.
Hampir semuanya dalam plugin ini extensible. Berikut adalah salah satu contoh:
1 |
|
2 |
$labels = apply_filters( 'tgmsp_post_type_labels', array( |
3 |
'name' => __( 'Soliloquy', 'soliloquy' ), |
4 |
'singular_name' => __( 'Soliloquy', 'soliloquy' ), |
5 |
'add_new' => __( 'Add New', 'soliloquy' ), |
6 |
'add_new_item' => __( 'Add New Soliloquy Slider', 'soliloquy' ), |
7 |
'edit_item' => __( 'Edit Soliloquy Slider', 'soliloquy' ), |
8 |
'new_item' => __( 'New Soliloquy Slider', 'soliloquy' ), |
9 |
'view_item' => __( 'View Soliloquy Slider', 'soliloquy' ), |
10 |
'search_items' => __( 'Search Soliloquy Sliders', 'soliloquy' ), |
11 |
'not_found' => __( 'No Soliloquy Sliders found', 'soliloquy' ), |
12 |
'not_found_in_trash' => __( 'No Soliloquy Sliders found in trash', 'soliloquy' ), |
13 |
'parent_item_colon' => '', |
14 |
'menu_name' => __( 'Soliloquy', 'soliloquy' ) |
15 |
) ); |
16 |
|
17 |
$args = apply_filters( 'tgmsp_post_type_args', array( |
18 |
'labels' => $labels, |
19 |
'public' => true, |
20 |
'exclude_from_search' => true, |
21 |
'show_ui' => true, |
22 |
'show_in_admin_bar' => false, |
23 |
'rewrite' => false, |
24 |
'query_var' => false, |
25 |
'menu_position' => 100, |
26 |
'menu_icon' => plugins_url( 'css/images/menu-icon.png', dirname( __FILE__ ) ), |
27 |
'supports' => array( 'title' ) |
28 |
) ); |
Ini adalah bagaimana Thomas Griffin (plugin developer) set up argumen untuk custom post type label dan atribut. Kehadiran dua filter, tgmsp_post_type_labels
dan tgmsp_post_type_args
, membuatnya sangat mudah bagi pengembang lain untuk mengubah jenis post slider atau mengubah apa yang mendukung jenis post.
2. bbPress
Oleh salah satu plugin favorit saya pribadi sepanjang masa, bbPress adalah fitur lengkap forum plugin untuk WordPress. Seluruh plugin adalah contoh sempurna dari bagaimana membuat plugin extensible, karena benar-benar memiliki action dan filter di mana-mana. Ini memiliki satu filter khusus yang diterapkan bila mengambil isi dari sebuah forum:
1 |
|
2 |
function bbp_get_forum_content( $forum_id = 0 ) { |
3 |
$forum_id = bbp_get_forum_id( $forum_id ); |
4 |
|
5 |
// Check if password is required
|
6 |
if ( post_password_required( $forum_id ) ) |
7 |
return get_the_password_form(); |
8 |
|
9 |
$content = get_post_field( 'post_content', $forum_id ); |
10 |
|
11 |
return apply_filters( 'bbp_get_forum_content', $content, $forum_id ); |
12 |
}
|
Sebelum isi dari forum dikembalikan, ia melewati filter disebut bbp_get_forum_content
yang memungkinkan pengembang untuk mengubah konten sebelum pernah ditampilkan.
3. Easy Digital Download
Easy Digital Downloads, atau EDD, adalah salah satu plugin saya yang dibangun untuk membuatnya sangat mudah untuk menjual produk digital melalui WordPress. Seperti dengan kebanyakan ecommerce plugin, EDD memiliki proses checkout yang pembeli berjalan melalui sehingga mereka dapat memasukkan rincian pribadi dan pembayaran. Setelah semua info yang adalah dikumpulkan, semua pergi ke gateway pembayaran (sistem untuk memproses pembayaran), tetapi sebelum pergi ke gateway, filter diterapkan yang memungkinkan data yang akan dimanipulasi sebelum digunakan oleh sistem pembayaran :
1 |
|
2 |
$purchase_data = apply_filters( |
3 |
'edd_purchase_data_before_gateway', |
4 |
$purchase_data, |
5 |
$valid_data
|
6 |
);
|
Kehadiran filter ini memungkinkan untuk menyesuaikan jumlah pembelian (mungkin untuk diskon khusus), tambahkan perpajakan, mungkin menambah atau menghapus produk dari pembelian, dan banyak, banyak lagi.
Kesimpulan
Extensible plugin menguntungkan semua orang: pengembang asli, pengembang lain dan pengguna sendiri.
Ada begitu banyak alasan mengapa Anda harus menulis plugin Anda dengan kode dapat diperluat dalam pikiran, jadi mengapa anda tidak?
Tool yang disajikan di sini adalah semua yang Anda butuhkan untuk memulai. Memiliki pertanyaan? Tanya saja!