Lakukan tindakan php dengan tepat. PHP dan formulir

“Jangan gunakan pernyataan goto”- inilah yang dikatakan para guru di akademi kepada kami, dan memang, operator ini mengubah kode menjadi berantakan. Pengembang PHP memecahkan masalah ini secara radikal - masalah ini tidak ada di PHP3 dan PHP4. Apa yang awalnya memotivasi mereka? Mungkin mereka ingin menanamkan gaya pemrograman yang benar kepada kita semua? Ya, kita dapat mengatakan bahwa mereka sepenuhnya berhasil - kita semua sudah terbiasa, yaitu, kita telah benar-benar kehilangan kebiasaan menggunakan operator ini, mungkin ini yang terbaik, karena pada suatu waktu saya harus membuat konstruksi logis yang sepenuhnya memberikan kompensasi atas hal yang sangat disayangkan ini pergi ke.
Saya tidak tahu bagaimana itu untuk siapa pun, tetapi bagi saya, saya sering memiliki keinginan untuk menggunakan goto saat membuat pengendali formulir html, ketika banyak data dikirim dari pengguna ke server, yang mana skrip php harus periksa langkah demi langkah. Proses ini biasanya berlangsung dalam beberapa tahap: mencetak formulir itu sendiri, memeriksa data yang diterima, tampilan awal, dan, misalnya, menyimpan. Selain itu, beberapa tahapan dapat diulang: jika verifikasi data tidak berjalan dengan baik, kami melanjutkan ke pencetakan formulir, atau jika tampilan awal tidak sesuai dengan pengguna, ia dapat kembali memasukkan data. Singkatnya, beberapa potongan kode dapat digunakan berkali-kali. Menggunakan fungsi dalam kondisi ini juga sangat tidak nyaman - ada banyak variabel input dan output, fungsi harus melakukan tindakan yang terlalu rumit, biasanya menjadi kikuk dan keterbacaan kode menurun tajam.
Dan saya datang dengan desain ini.

Mengerjakan (

beralih ($tindakan) (

bawaan:

merusak ;

kasus "PRINT_FORM" :

Mencetak formulir utama

merusak ;

kasus "CHECK_FORM" :

Memeriksa kebenaran data

merusak ;

kasus "PREVIEW_FORM" :

Pratinjau

merusak ;

kasus "SAVE_FORM" :

Menyimpan data

merusak ;

) sementara (benar);

Inilah operator pilihan ganda dasar mengalihkan terjebak dalam lingkaran tanpa akhir lakukan sementara– dengan cara ini kami mengelompokkan tindakan yang diperlukan menjadi beberapa bagian kasus: istirahat; dan kita dapat berpindah tanpa batas dari satu bagian ke bagian lainnya. Di bagian bawaan: Akan lebih mudah untuk melakukan analisis awal terhadap data, misalnya, jika tidak ada data masukan $tindakan = 'PRINT_FORM' cetak formulir jika tersedia, misalnya $_POST ['kirim'] kemudian kami mengirimkan data yang diterima untuk diproses $aksi = 'PERIKSA_FORM'. Perpindahan kendali antar blok saklar terjadi dengan mengubah suatu variabel $aksi, baiklah, keluar dari loop menggunakan istirahat 2; atau keluar;
Misalnya, di blok cetak formulir utama, Anda dapat memasukkannya dengan aman istirahat 2; karena keluaran formulir mengasumsikan akhir skrip.
Desainnya sangat fleksibel dan mudah dibaca. Namun ada satu kelemahan - jika data diproses secara tidak benar, Anda bisa berakhir dalam perulangan tanpa akhir dan skrip macet - tidak menyenangkan harus menunggu selama 30 detik.
Mari kita tetapkan batasan jumlah siklus operator lakukan sementara, 20 sudah cukup. Sekarang jika kita meningkatkan sesuatu, skrip akan memutar 20 putaran, berhenti dan mengeluarkan peringatan berhenti darurat.
Sangat mudah untuk men-debug konstruksi seperti itu - tepat setelah operator berenang cetak variabel $action dan kita akan mendapatkan urutan eksekusi blok yang lengkap.

DO ( // di awal setiap loop kita mencetak nama // dari bagian yang dieksekusi, sangat berguna untuk debugging echo $action." "; SWITCH ($action) ( default: break; case "PRINT_FORM": /* cetak form utama */ break; case "CHECK_FORM": /* periksa kebenaran data */ break; case "PREVIEW_FORM": /* preview * / break ; case "SAVE_FORM": /* simpan data */ break )// saklar akhir ) SAAT ((($i++)< 20) or die("Принудительный останов цикла"));

MELAKUKAN (

// di awal setiap loop kita mencetak namanya

// bagian yang dieksekusi sangat nyaman untuk debugging

gema $aksi . " " ;< / strong >

BERALIH ($tindakan) (

bawaan:

merusak ;

kasus "PRINT_FORM" :

mencetak formulir utama

merusak ;

RxGroovy memiliki beberapa varian Do.

  • Javadoc:
  • Javadoc:

  • Javadoc:

Operator doOnRequest (baru di RxGroovy 1.1) mendaftarkan Aksi yang akan dipanggil setiap kali pengamat meminta item tambahan dari Observable yang dihasilkan. Tindakan tersebut menerima jumlah item yang diminta pengamat sebagai parameternya.

  • Javadoc:

  • Javadoc:

  • Javadoc:

  • Javadoc:

  • Javadoc:

sebelum

  • Javadoc:

setelah Observable yang dihasilkan berakhir, baik secara normal atau dengan kesalahan.

Kode sampel

angka def = Dapat Diamati.dari(); angka.finallyDo(( println("Akhirnya"); )).subscribe(( println(itu); ), // onNext ( println("Error: " + it.getMessage()); ), // onError ( println ("Urutan selesai" ) // onCompleted);

1 2 3 4 5 Urutan selesai Akhirnya

  • Javadoc:

RxJava memiliki beberapa varian Do.

Operator doOnEach memungkinkan Anda membuat panggilan balik yang akan dipanggil oleh Observable yang dihasilkan setiap kali ia mengeluarkan item. Anda dapat meneruskan panggilan balik ini dalam bentuk Tindakan yang menggunakan jenis Notifikasi onNext sebagai satu-satunya parameternya, atau Anda dapat meneruskan Pengamat yang metode onNext-nya akan dipanggil seolah-olah ia telah berlangganan Observable.

  • Javadoc:
  • Javadoc:

Operator doOnNext mirip dengan doOnEach(Action1) hanya saja Action yang Anda teruskan sebagai parameter tidak menerima Notifikasi melainkan hanya menerima item yang dipancarkan.

Kode sampel

Dapat diamati.hanya(1, 2, 3).doOnNext(Aksi baru1 () ( @Override public void call(Item bilangan bulat) ( if(item > 1) ( throw new RuntimeException("Item melebihi nilai maksimum"); ) ) )).subscribe(Pelanggan baru () ( @Override public void onNext(Item bilangan bulat) ( System.out.println("Berikutnya: " + item); ) @Override public void onError(Kesalahan yang dapat dilempar) ( System.err.println("Kesalahan: " + kesalahan .getMessage()); ) @Override public void onCompleted() ( System.out.println("Urutan selesai."); ) ));

Berikutnya: 1 Kesalahan: Item melebihi nilai maksimum

  • Javadoc:

Operator doOnRequest (baru di RxJava 1.1) mendaftarkan Aksi yang akan dipanggil setiap kali pengamat meminta item tambahan dari Observable yang dihasilkan. Tindakan tersebut menerima sebagai parameternya sejumlah item yang diminta oleh pengamat.

  • Javadoc:

Operator doOnSubscribe mendaftarkan Tindakan yang akan dipanggil setiap kali pengamat berlangganan Observable yang dihasilkan.

  • Javadoc:

Operator doOnUnsubscribe mendaftarkan Tindakan yang akan dipanggil setiap kali pengamat berhenti berlangganan dari Observable yang dihasilkan.

  • Javadoc:

Operator doOnCompleted mendaftarkan Action yang akan dipanggil jika Observable yang dihasilkan berakhir secara normal, memanggil onCompleted .

  • Javadoc:

Operator doOnError mendaftarkan Action yang akan dipanggil jika hasil Observable berakhir secara tidak normal, dengan memanggil onError . Tindakan ini akan diteruskan ke Throwable yang mewakili kesalahan.

  • Javadoc:

Operator doOnTerminate mendaftarkan suatu Tindakan yang akan dipanggil saja sebelum Observable yang dihasilkan berakhir, baik secara normal atau dengan kesalahan.

  • Javadoc:

akhirnyaDo tidak digunakan lagi sejak RxJava 1.1.1, digantikan doAfterTerminate dengan perilaku yang sama.

Operator akhirnyaDo mendaftarkan suatu Tindakan yang akan dipanggil saja setelah Observable yang dihasilkan berakhir, baik secara normal atau dengan kesalahan.

  • Javadoc:

Operator doAfterTerminate mendaftarkan Aksi yang akan dipanggil saja setelah Observable yang dihasilkan berakhir, baik secara normal atau dengan kesalahan.

  • Javadoc:


RxJS mengimplementasikan operator Do dasar sebagai do atau tap (dua nama untuk operator yang sama). Anda memiliki dua pilihan cara menggunakan operator ini:

  1. Anda dapat memberikannya kepada Pengamat, dalam hal ini do / tap akan memanggil metode Pengamat tersebut seolah-olah Pengamat tersebut telah berlangganan Observable yang dihasilkan.
  2. Anda dapat meneruskan satu set 1-3 fungsi individual (onNext , onError , dan onCompleted) yang do / tap akan dipanggil bersama dengan fungsi bernama serupa dari setiap pengamatnya.

Kode sampel

/* Menggunakan pengamat */ var pengamat = Rx.Observer.create(function (x) ( console.log("Lakukan Berikutnya: %s", x); ), function (err) ( console.log("Lakukan Kesalahan : %s", err); ), function () ( console.log("Lakukan Selesai"); )); var sumber = Rx.Observable.range(0, 3) .do(pengamat); var berlangganan = source.subscribe(function (x) ( console.log("Berikutnya: %s", x); ), fungsi (err) ( console.log("Error: %s", err); ), fungsi () ( console.log("Selesai"); ));

/* Menggunakan fungsi */ var source = Rx.Observable.range(0, 3) .do(function (x) ( console.log("Do Next:", x); ), function (err) ( console.log("Do Next:", x); ), function (err) ( console. log("Lakukan Kesalahan:", err); function() ( console.log("Lakukan Selesai"); )); var berlangganan = source.subscribe(function (x) ( console.log("Berikutnya: %s", x); ), fungsi (err) ( console.log("Error: %s", err); ), fungsi () ( console.log("Selesai"); ));

Lakukan Berikutnya: 0 Berikutnya: 0 Lakukan Berikutnya: 1 Berikutnya: 1 Lakukan Berikutnya: 2 Berikutnya: 2 Lakukan Selesai Selesai


RxJS juga mengimplementasikan doOnNext atau tapOnNext (dua nama untuk operator yang sama). Ini adalah bentuk khusus Do yang hanya merespons kasus onNext, dengan memanggil fungsi panggilan balik yang Anda berikan sebagai parameter. Anda juga dapat meneruskan parameter kedua yang akan menjadi objek “ ini ” dari sudut pandang fungsi panggilan balik Anda saat dijalankan.

Kode sampel

var source = Rx.Observable.range(0, 3) .doOnNext(function () ( this.log("Lakukan Berikutnya: %s", x); ), console); var berlangganan = source.subscribe(function (x) ( console.log("Berikutnya: %s", x); ), fungsi (err) ( console.log("Error: %s", err); ), fungsi () ( console.log("Selesai"); ));

Lakukan Berikutnya: 0 Berikutnya: 0 Lakukan Berikutnya: 1 Berikutnya: 1 Lakukan Berikutnya: 2 Berikutnya: 2 Selesai


RxJS juga mengimplementasikan doOnError atau tapOnError (dua nama untuk operator yang sama). Ini adalah bentuk khusus Do yang hanya merespons kasus onError, dengan memanggil fungsi panggilan balik yang Anda berikan sebagai parameter. Anda juga dapat meneruskan parameter kedua yang akan menjadi objek “ ini ” dari sudut pandang fungsi panggilan balik Anda saat dijalankan.

Kode sampel

var source = Rx.Observable.throw(Kesalahan baru()); .doOnError(fungsi (err) ( this.log("Lakukan Kesalahan: %s", err); ), konsol); var berlangganan = source.subscribe(function (x) ( console.log("Berikutnya: %s", x); ), fungsi (err) ( console.log("Error: %s", err); ), fungsi () ( console.log("Selesai"); ));

Lakukan Kesalahan: Kesalahan Kesalahan: Kesalahan


RxJS juga mengimplementasikan doOnCompleted atau tapOnCompleted (dua nama untuk operator yang sama). Ini adalah bentuk khusus Do yang hanya merespons kasus onCompleted, dengan memanggil fungsi panggilan balik yang Anda berikan sebagai parameter. Anda juga dapat meneruskan parameter kedua yang akan menjadi objek “ ini ” dari sudut pandang fungsi panggilan balik Anda saat dijalankan.

Kode sampel

var source = Rx.Observable.range(0, 3) .doOnCompleted(function () ( this.log("Do Completed"); ), console); var berlangganan = source.subscribe(function (x) ( console.log("Berikutnya: %s", x); ), fungsi (err) ( console.log("Error: %s", err); ), fungsi () ( console.log("Selesai"); ));

Berikutnya: 0 Berikutnya: 1 Berikutnya: 2 Lakukan Selesai Selesai


RxJS juga mengimplementasikan operator akhirnya. Dibutuhkan fungsi yang akan dipanggil setelah Observable yang dihasilkan berakhir, baik secara normal (onCompleted) atau tidak normal (onError).

Kode sampel

var source = Rx.Observable.throw(new Error()) .finally(function () ( console.log("Akhirnya"); )); var berlangganan = sumber.berlangganan(fungsi (x) ( console.log("Berikutnya: " + x); ), fungsi (err) ( console.log("Kesalahan: " + err);), fungsi () ( konsol .log("Selesai");

Kesalahan: Kesalahan Akhirnya

do / tap , doOnNext / tapOnNext , doOnError / tapOnError , doOnCompleted / tapOnCompleted , dan akhirnya ditemukan di masing-masing distribusi berikut:

  • rx.js
  • rx.all.js
  • rx.all.compat.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js

RxPHP mengimplementasikan operator ini seperti halnya .

Memanggil tindakan untuk setiap elemen dalam urutan yang dapat diamati dan memanggil suatu tindakan setelah penghentian urutan yang dapat diamati dengan baik atau luar biasa. Metode ini dapat digunakan untuk debugging, logging, dll. perilaku kueri dengan mencegat aliran pesan untuk menjalankan tindakan sewenang-wenang untuk pesan di saluran. Saat menggunakan do, penting untuk dicatat bahwa Pengamat mungkin menerima kejadian tambahan setelah streaming selesai atau terjadi kesalahan (seperti saat menggunakan pengulangan atau berlangganan kembali). Jika Anda menggunakan Observable yang memperluas abstractObservable, Anda tidak akan menerima kejadian ini. Untuk kasus khusus ini, gunakan DoObserver. doOnNext, doOnError, dan doOnCompleted menggunakan DoObserver secara internal dan akan menerima kejadian tambahan ini.

Kode sampel

//dari https://github.com/ReactiveX/RxPHP/blob/master/demo/do/do.php $source = \Rx\Observable::range(0, 3) ->do(function ($x) ( echo "Lakukan Berikutnya:", $x, PHP_EOL; ), fungsi (Dapat dilempar $err) ( echo "Lakukan Kesalahan:", $err->getMessage(), PHP_EOL; ), function () ( echo "Lakukan Selesai" , PHP_EOL; )); $langganan = $sumber->langganan($stdoutObserver);

Lakukan Berikutnya:0 Nilai Berikutnya: 0 Lakukan Berikutnya:1 Nilai Berikutnya: 1 Lakukan Berikutnya:2 Nilai Berikutnya: 2 Lakukan Selesai Selesai!

RxPHP juga memiliki operator doOnError .

Kode sampel

//dari https://github.com/ReactiveX/RxPHP/blob/master/demo/do/doOnError.php $source = \Rx\Observable::error(pengecualian baru("Ups")) ->doOnError(fungsi (Dapat dilempar $err) ( echo "Lakukan Kesalahan:", $err->getMessage(), PHP_EOL; )); $langganan = $sumber->langganan($stdoutObserver);

Lakukan Kesalahan:Ups Pengecualian:Ups

RxPHP juga memiliki operator doOnCompleted .

Kode sampel

//dari https://github.com/ReactiveX/RxPHP/blob/master/demo/do/doOnCompleted.php $source = \Rx\Observable::empty() ->doOnCompleted(function () ( echo "Lakukan Selesai ", PHP_EOL; )); $langganan = $sumber->langganan($stdoutObserver);

Selesaikan Selesai!

RxPHP juga akhirnya memiliki operator.

Akan memanggil fungsi tertentu ketika sumber berakhir saat selesai atau terjadi kesalahan.

Kode sampel

//dari https://github.com/ReactiveX/RxPHP/blob/master/demo/finally/finally.php Rx\Observable::range(1, 3) ->finally(function() ( echo "Akhirnya\n "; )) ->berlangganan($stdoutObserver);

Nilai berikutnya: 1 Nilai berikutnya: 2 Nilai berikutnya: 3 Selesai! Akhirnya

//dari https://github.com/ReactiveX/RxPHP/blob/master/demo/finally/finally-error.php Rx\Observable::range(1, 3) ->map(function($value) ( ​​​​if ($value == 2) ( throw new \Exception("error"); ) return $value )) ->finally(function() ( echo "Akhirnya\n"; )) ->subscribe($stdoutObserver) ;

Nilai berikutnya: 1 Pengecualian: kesalahan Akhirnya

Melampirkan fungsi PHP yang ditentukan ke hook yang ditentukan. Fungsi yang ditentukan akan diaktifkan pada saat kejadian, yang selanjutnya dipicu menggunakan do_action() .

Kait tempat kaitan fungsi dibuat (diinisialisasi) menggunakan fungsi do_action().

Tindakan, tidak seperti filter (add_filter()), diperlukan untuk melakukan beberapa tindakan pada saat yang tepat, sementara filter mengirimkan dan menerima kembali data, yang kemudian digunakan.

Secara tidak resmi: filter adalah peristiwa yang sama, cara kerjanya sama persis, dan dapat digunakan sebagai peristiwa (alih-alih add_filter() Anda dapat menggunakan fungsi add_action() dan sebaliknya). Misalnya, Anda dapat mengembalikan data yang diterima tanpa mengubahnya, tetapi juga melakukan beberapa operasi (misalnya, menulis ke database). Benar, ini sangat jarang diperlukan. Semua tempat yang memerlukan intervensi dalam kode mesin, pengembang mencoba meramalkan dan memasukkan suatu peristiwa ke tempat ini.

✈ 1 kali = 0,000018 detik = sangat cepat| 50000 kali = 0,07 detik = kecepatan cahaya| PHP 7.0.8, WP 4.7

Tidak ada kait.

Kembali

Selalu benar.

Penggunaan

add_action($tag, $function_to_add, $prioritas, $accepted_args); $tag (string) (wajib) Nama tindakan yang akan kita lampirkan fungsinya. $fungsi_ke_tambahan (string/penutupan) (wajib) Nama fungsi yang harus dipanggil saat aksi diaktifkan, mis. sebuah fungsi yang kita lampirkan pada hook. Format penerusan fungsi biasanya berupa string, . $prioritas (nomor) Prioritas eksekusi fungsi. Jika lebih banyak fungsi “dipasang” pada hook yang sama, maka prioritasnya akan ditentukan oleh urutan pelaksanaannya. Angka yang lebih kecil berarti dieksekusi lebih awal, mis. 10 akan dieksekusi sebelum 20.
Bawaan: 10$diterima_args (nomor) Jumlah argumen yang dibutuhkan suatu fungsi. Tentu saja tindakan tersebut harus melewati sejumlah argumen tersebut.
Bawaan: 1

Contoh

#1 Kait biasa

Kami akan mengirimkan surat kepada teman-teman ketika postingan baru diterbitkan:

Add_action("publish_post", "email_teman"); fungsi email_teman($post_ID)( $teman = " [dilindungi email], [dilindungi email]"; wp_mail($friends, "blog sally diperbarui", "Saya baru saja menaruh sesuatu di blog saya: http://blog.example.com"); kembalikan $post_ID; )

Demikian pula, Anda dapat mendaftarkan kait ini melalui add_filter():

Add_filter("publish_post", "email_teman");

# 2 Berargumen

do_action() meneruskan argumen ke fungsi dan dapat digunakan. Pada contoh sebelumnya itu adalah ID postingan, tetapi kami tidak menggunakannya sehingga tidak memerlukannya. Sekarang, contoh cara menggunakan argumen yang diteruskan:

Add_action("comment_id_not_found", "echo_comment_id", 10, 1); function echo_comment_id($comment_ID)( echo "Saya baru saja menerima". $comment_ID; )

#3 Fungsi anonim

Anda dapat meneruskan fungsi anonim sebagai fungsi panggilan balik, misalnya:

Add_action("wp_head", function())( echo "sesuatu"; ));

Fungsi anonim tersebut tidak berfungsi dengan akselerator PHP.

#4 Menambahkan acara dari kelas PHP

Jika Anda perlu menggunakan metode kelas PHP untuk suatu peristiwa, maka di argumen kedua, alih-alih nama fungsi, Anda perlu menentukan array, di mana argumen pertama adalah nama kelas (untuk metode statis) atau instance kelas (untuk metode publik), dan yang kedua adalah nama metode kelas ini.

Contoh kelas ada dalam variabel $this:

// Menghubungkan metode kelas di luar kelas add_action("wp_head", array("My_Class", "my_static_method")); class My_Class ( public function __construct() ( // Menghubungkan metode kelas di dalam kelas add_action("save_post", array($this, "my_public_method")); add_action("save_post", array(__CLASS__, "my_static_method")) ; ) fungsi publik my_public_method($post_id) ( // kode fungsi ) fungsi statis my_static_method($post_id) ( // kode fungsi ) )

Catatan

Untuk mengetahui berapa banyak argumen yang lolos dari suatu tindakan, temukan argumen tersebut di kode dan lihat. Misalnya, di sini 2 argumen diberikan:

Do_action("simpan_post", $post_ID, $post);

dan untuk hook seperti itu, kode hooknya akan terlihat seperti ini:

Tambah_tindakan("simpan_posting", "simpan_postingan saya", 10, 2);

dan fungsinya akan memiliki 2 argumen:

Fungsi my_save_post($post_ID, $post)( // kode fungsi di sini)

Membuat acara (pengait untuk fungsi arbitrer). Agar suatu fungsi dapat bekerja pada saat suatu peristiwa terjadi, fungsi tersebut harus terhubung ke peristiwa tersebut menggunakan fungsi add_action().

Selain event, WP juga punya filter, prinsip pengoperasiannya sama. Satu-satunya perbedaan adalah filter harus mengembalikan variabel yang dihasilkan, mis. itu memfilter (mengubah) data, dan acara memungkinkan Anda menjalankan fungsi khusus saat acara diaktifkan. Filter diluncurkan menggunakan fungsi apply_filters()

✈ 1 kali = 0,00007 detik = sangat cepat| 50000 kali = 0,03 detik = kecepatan cahaya

Tidak ada kait.

Kembali

Tidak mengembalikan apa pun.

Penggunaan

do_action($tag, $arg_a, $arg_b, ...); $tag (string) (wajib) Nama pengait yang akan dibuat. $arg_a Nilai argumen yang akan disampaikan.
$arg_b (string/array/angka/objek/boolean) Arti dari satu argumen lagi...
Default: argumen tidak ada$arg_с (string/array/angka/objek/boolean) Anda dapat meneruskan argumen dalam jumlah tak terbatas ke suatu fungsi...

Contoh

#1. Contoh penggunaan

Fungsi ini dapat digunakan dalam plugin, tema, dll. ketika Anda perlu memasukkan diri Anda ke dalam proses eksekusi kode dari tempat lain. Misalnya, kita memasang "hook" (do_action) di plugin, dan kita akan "menangkapnya" dari file fungsi.php saat "hook" kita dipicu.

Katakanlah kita menggunakan kode ini di plugin:

Sekarang kita dapat melakukan beberapa tindakan pada saat fungsi do_action dipicu, dan pada saat yang sama kita dapat menjelaskan tindakan kita, misalnya, dari file fungsi.php, dengan menempatkan kode berikut di dalamnya:

Fungsi do_my_hook($a, $b)( // jika variabel yang diteruskan $a benar, // maka, misalnya, hapus postingan 10 if($a===true) wp_delete_post(10); // lalu cukup menampilkan variabel ke layar gema "
".$b; // akan menampilkan nilai variabel kedua ) // Daftarkan hook melalui // add_action($tag, $function_to_add, $priority, $accepted_args); add_action("my_hook", "do_my_hook", 10 , 2);

Tindakan berbeda dari filter karena data yang diteruskan oleh tindakan tidak dikembalikan ke fungsi dan tidak digunakan di sana di masa mendatang, namun hanya diteruskan untuk digunakan dalam fungsi kait.

Kode melakukan tindakan: wp-include/plugin.php WP 5.2.2

do_action($args); array_pop($wp_current_filter); )

Kami telah menciptakan landasan untuk plugin masa depan yang akan dikenali oleh sistem WordPress. Hari ini kami akan langsung mengubah fungsionalitas dasar sistem.

Sistem “kait”, “peristiwa” (tindakan) dan filter (filter) akan membantu kita dalam hal ini. Ketiga konsep ini adalah dasar dari setiap plugin WordPress.

Kait

Ada dua jenis hook di WordPress:

  • Kait tindakan: menandai tempat dalam kode yang melakukan tindakan tertentu, misalnya perlu memasukkan beberapa data dan menyimpannya ke database.
  • Kait penyaring: menandai filter yang akan mengubah beberapa nilai (variabel), sehingga kedepannya kode akan menggunakan nilai yang dimodifikasi.

Tindakan

Bekerja dengan peristiwa (tindakan)

Logika umum untuk mengelola acara di WordPress sederhana saja:

  1. Tandai tempat di mana tindakan harus dilakukan menggunakan kait tindakan dengan parameter yang diperlukan.
  2. Buat fungsi yang akan melakukan tindakan yang diinginkan menggunakan parameter yang diteruskan oleh hook.
  3. Daftarkan peristiwa yang akan dieksekusi ketika hook ditembakkan, dengan prioritas tertentu.
  4. Saat WordPress memuat halaman dan menemukan hook, sistem akan menjalankan semua fungsi yang terdaftar pada hook tersebut.

Untuk mencapai poin pertama, sistem menyediakan fungsi 'do_action':

Lakukan_tindakan($tag, $arg_1, $arg_2, ... , $arg_n);

Dibutuhkan argumen berikut: $tag – nama “hook”, $arg_1, $arg_2, ..., $arg_n – parameter yang akan digunakan untuk memanggil fungsi. Argumennya bisa berapa saja, atau 0.

Sistem itu sendiri memiliki banyak kait yang sudah ditentukan:

Lakukan_tindakan("init");

Ini adalah contoh yang sangat sederhana tanpa argumen tambahan. Pengait ini dipicu ketika sebagian besar sistem sudah dikonfigurasi dan saatnya membuat objek, kategori, postingan, dll.

Do_action("simpan_post", $post_id, $post);

Dalam contoh ini, hook dipicu ketika sebuah postingan disimpan dengan dua argumen post_id - pengidentifikasi postingan dan post - postingan itu sendiri.

Membuat kait tersedia bagi pengembang mana pun untuk membuat plugin (atau tema) mereka sendiri. Berkat ini, kami memiliki alat yang ampuh untuk mengendalikan perilaku sistem.

Do_action("kait_kustom_saya_yang_saya");

Setelah kita membuat hook dan menulis fungsinya, kita perlu mendaftarkan fungsinya menggunakan “add_action”

Add_action($tag, $function_to_add, $prioritas, $accepted_args_number);

Fungsi 'add_action' memerlukan dua parameter yang diperlukan: $tag: nama hook yang sesuai dan $function_to_add: nama fungsi yang akan dipanggil. Dua parameter lainnya bersifat opsional: $priority: variabel integer yang menentukan urutan eksekusi fungsi (defaultnya adalah 10), $accepted_args_number: jumlah argumen yang diterima fungsi (defaultnya adalah 1).

Mari kita lihat contoh untuk memahami keseluruhan proses. Katakanlah kita ingin menambahkan pemberitahuan kecil di bagian bawah website kita. Kita dapat menggunakan hook 'wp_footer' untuk ini karena ini adalah bagian kode wajib yang digunakan setiap tema.

Fungsi msp_helloworld_footer_notice())( gema "

Halo, saya adalah pemberitahuan khusus Anda
"; ) add_action("wp_footer", "msp_helloworld_footer_notice");

Dalam contoh ini, kami membuat fungsi yang hanya menampilkan markup peringatan dan mendaftarkannya dengan 'wp_footer'. Setelah kita menambahkan kode ini ke file plugin kita (lihat sebelumnya) kita akan melihat hasilnya di halaman:

Peringatan Plugin WordPress

Bekerja dengan filter

Filter bekerja dengan cara yang sama seperti acara. Namun filter tidak hanya mengeksekusi bagian kode tertentu, tetapi juga mengubah nilai yang diberikan kepadanya. Ini berarti bahwa setiap filter memiliki nilai terkait (variabel) yang digunakannya.

Fungsi filter akan mengambil nilai ini dan mengubahnya untuk digunakan lebih lanjut. Kait filter sedikit berbeda dari kait aksi.

Apply_filters($tag, $value_to_filter, $arg_1, $arg_2, ... , $arg_n);

Fungsi 'apply_filter' membuat kait filter yang disebut $tag dan parameter yang diperlukan $value_to_filter (ini boleh kosong, tetapi harus dideklarasikan). Argumen opsional lainnya berfungsi sama seperti untuk kejadian.

Filter_function($value_to_filter, $arg_1, $arg_2, ... , $arg_n)( //filter mengembalikan $value_to_filter; //nilai harus dikembalikan)

Ini adalah "kerangka" filter, yang menunjukkan bahwa filter harus:

  1. menerima setidaknya 1 argumen;
  2. mengembalikan nilai yang dimodifikasi.
add_filter($tag, $function_to_add, $prioritas, $accepted_args);

Fungsi 'add_filter' mendaftarkan fungsi dengan nama yang terkandung dalam $function_to_add untuk $tag hook. Argumen yang tersisa - $priority dan $accepted_args - berfungsi sama seperti untuk event hooks.

Mari kita lihat contohnya: tugas umum plugin adalah menambahkan sesuatu di akhir postingan. Jika kita perhatikan lebih dekat fungsi 'the_content' yang digunakan untuk menampilkan isi sebuah postingan, kita akan menemukan hook berikut:

$konten = apply_filters("konten_", $konten);

Dengan menggunakannya kita dapat dengan mudah menambahkan sesuatu ke akhir postingan.

Fungsi msp_helloworld_post_footer($konten) ( $konten .= "

"; kembalikan $konten; ) add_filter("konten_", "msp_helloworld_post_footer", 100);

Perhatikan bahwa kami menggunakan sejumlah besar prioritas untuk memastikan bahwa semua filter standar dijalankan sebelum mengeksekusi 'msp_helloworld_post_footer'. Setelah memasukkan kode ke dalam plugin kita, kita akan melihat hasilnya:


Bagaimana menemukan kail

Sekarang kita memahami bahwa untuk melakukan tindakan tertentu, kita perlu mengetahui tentang hook yang ada.

Codex WordPress menyediakan daftar kait untuk filter dan acara Referensi Tindakan dan Referensi Filter.

Tindakan tambahan dengan kait

Sama seperti menambahkan, sebuah hook dapat dihapus menggunakan sintaksis yang serupa.

Anda dapat menghapus acara seperti ini:

Hapus_aksi($tag, $fungsi_untuk_hapus, $prioritas, $diterima_args); hapus_semua_tindakan($tag, $prioritas);

Seperti yang mungkin sudah Anda duga, 'remove_action' menghapus peristiwa tertentu yang didaftarkan untuk hook tertentu (prioritas dan jumlah argumen harus ditentukan dengan benar, seperti yang ditentukan saat pendaftaran), dan 'remove_all_actions' membantu menghapus semua peristiwa yang didaftarkan untuk sebuah hook ( jika prioritas dihilangkan, fungsi akan menghapus semua acara).

Filter dapat dihapus dengan cara yang sama:

Hapus_filter($tag, $fungsi_untuk_hapus, $prioritas, $diterima_args); hapus_all_filters($tag, $prioritas);

API plugin WordPress juga menyediakan fungsi untuk memeriksa apakah suatu fungsi terdaftar untuk hook tertentu:

Has_action($tag, $function_to_check); has_filter($tag, $function_to_check);

Kedua fungsi memeriksa apakah fungsi yang diberikan terdaftar untuk hook dan mengembalikan nilai true jika berhasil, jika tidak, flash. Di dalam fungsi tersebut kita mempunyai kemampuan untuk memeriksa apakah hook memanggilnya:

If("hook_to_check_name" === filter_saat ini())()

Meskipun namanya 'current_filter' tidak hanya berfungsi dengan filter tetapi juga dengan acara.

Contoh yang tidak sepele

Mari kita hidupkan kembali “kerangka” plugin kita, yang telah kita siapkan di pelajaran terakhir.

Mari kita isi file 'core.php' (bagian utama plugin kita, yang berisi sebagian besar fungsi) dengan kode yang memecahkan masalah yang mungkin timbul selama bekerja. Untuk mengatasi ini kita akan menggunakan tindakan dan filter.

Biarkan situs WordPress Anda menerima postingan dari penulis berbeda dari tamu, tetapi tidak mengizinkan Anda membuat akun. Artinya, pengguna yang memublikasikan postingan dan penulis sebenarnya adalah orang yang berbeda dan kami perlu memastikan bahwa penulisnya tercantum dalam postingan. Kita bisa melakukan ini dengan menggunakan taksonomi.

Mari kita buat taksonomi kita sendiri untuk mengolah nama penulis dan biografi singkatnya. Kita akan dapat menggunakan nama penulis sebagai istilah taksonomi lainnya (tag, misalnya) dalam postingan. Kode:

/** daftarkan filter dan acara **/ function msp_helloworld_init())( add_action("init", "msp_helloworld_taxonomies"); add_filter("the_content", "msp_helloworld_author_block_filter"); add_filter("post_class", "msp_helloworld_post_class"); ) add_action("plugins_loaded", "msp_helloworld_init"); /** taksonomi **/ function msp_helloworld_taxonomies())( $args = array("labels" => array("name" => "Penulis tamu", "singular_name" => "Penulis tamu"), "show_in_nav_menus" = > false); register_taxonomy("gauthor", array("post"), $args ) /** markup blok penulis **/ fungsi msp_helloworld_author_block())( global $post; $author_terms = wp_get_object_terms($post->ID, "gauthor"); if(kosong($author_terms)) kembali; $nama = striplash($author_terms->nama); $url = esc_url(get_term_link($author_terms)); ; $keluar = "

"; $keluar.= "
Ini adalah kiriman tamu oleh ($nama)
"; $keluar.= "
($desk)
"; return $out; ) /** tambahkan markup di akhir postingan **/ function msp_helloworld_author_block_filter($content)( if(is_single()) $content .= msp_helloworld_author_block(); return $content; ) /** tambahkan kelas CSS ke posting **/ function msp_helloworld_post_class($post_class)( global $post; $author_terms = wp_get_object_terms($post->ID, "gauthor"); if(!empty($author_terms))( $post_class = "gauthor "; ) kembalikan $post_class)

Seperti yang Anda lihat, kami telah membuat fungsi untuk mendaftarkan taksonomi kami sendiri dan mengikatnya ke hook 'init'. Selanjutnya, kami membuat template yang bertanggung jawab untuk menampilkan blok penulis menggunakan fungsi WordPress 'wp_get_object_terms'. Kemudian kami menyisipkan blok berisi informasi tentang penulis di akhir postingan menggunakan filter 'the_content'. Dan terakhir, kami menambahkan kelas CSS kami sendiri. Hasil: