Ketika saya ingin filter atau tindakan saya mengungguli semua yang lain, saya akan menetapkan prioritas 999
. Namun, belakangan ini saya telah melihat beberapa orang menggunakan nilai ekstrim untuk prioritas, seperti 20000
, dan bahkan99999
Selain fakta bahwa menggunakan prioritas setinggi ini konyol, apakah mereka benar-benar berfungsi? Apakah ada batasan untuk mengaitkan prioritas? Apa yang akan terjadi jika batas terlampaui? Apakah ada perbedaan kinerja saat menggunakan prioritas ekstrem?
Pembaruan: @harke menyarankan pada Stack Overflow bahwa jumlahnya dibatasi olehPHP_INT_MAX
Jawaban:
Tidak ada batasan dan tidak ada penalti kinerja. Untuk memahami alasannya, Anda perlu memahami bagaimana semua kait disimpan dalam ekosistem WP.
Pertama-tama Anda perlu memahami di mana semua kait disimpan dan bagaimana mereka melakukannya. Semua kait untuk filter dan tindakan disimpan dalam variabel global yang disebut
wp_filter
, ya ya kait tindakan disimpan dalam variabel ini juga. Variabel ini adalah array terkait, di mana kunci adalah nama tindakan atau filter dan nilai adalah array asosiatif lain. Sebagai contoh, mari kita lihat aksi 'init', pada tahap ini kita akan melihat struktur berikut:Sub array ini memiliki kunci dan nilai numerik sebagai array. Kunci numerik adalah prioritas kami. Array, terkait dengan kunci numerik, berisi daftar kait dengan prioritas yang sama. Jadi jika kita menelepon
add_action( 'init', 'wpse8170_my_first_init', 20 )
, lalu meneleponadd_action( 'init', 'wpse8170_my_second_init', 20 )
dan akhirnya meneleponadd_action( 'init', 'wpse8170_my_third_init', 10 )
, contoh kita akan terlihat seperti:Sekarang ketika
init
aksi dipicu, semua kait akan diurutkan dengan penggunaanksort
fungsi dan array kami terlihat sekarang:Dan semua kait akan dieksekusi dalam antrian ini: pertama
'wpse8170_my_third_init'
, lalu'wpse8170_my_first_init'
dan akhirnya'wpse8170_my_second_init'
.Jadi Anda dapat melihat bahwa tidak ada batasan dan penalti dan Anda dapat menggunakan nilai apa pun yang dapat diterima sebagai kunci untuk array terkait oleh lingkungan PHP Anda.
sumber
max( $priorities ) + 1
akan gagal jika angka terakhir sama denganPHP_INT_MAX
. Dalam hal ini, Anda harus mengubah nilai menjadi string dan menambahkan sesuatu ke dalamnya.$wp_filter
selamanya berubah. Ini tidak dimaksudkan untuk digunakan secara langsung oleh plugin. Kami telah melakukan modifikasi di masa lalu (terutama karena alasan kinerja, kebetulan).Ini adalah bilangan bulat, jadi pada sistem PHP 32-bit akan terbatas pada -2147483648 hingga 2147483647, dan pada 64-bit PHP akan terbatas pada -9223372036854775808 hingga 9223372036854775807.
Sunting: tidak ada penalti kinerja, ini bilangan bulat.
Tapi ... serius? :)
sumber
@shea - Tindakan WordPress bekerja persis seperti yang Anda perkirakan. Angka prioritas yang lebih tinggi TIDAK akan menggantikan yang lain, dan penggunaan PHP_INT_MAX BUKAN beberapa upaya "ekstrem" untuk memaksa tindakan / filter ini berjalan sebelum yang lain.
Untuk menempatkan tindakan / filter Anda di TOP dari urutan eksekusi, Anda harus menggunakan prioritas 0.
PHP_INT_MAX hanya di ujung yang berlawanan; itu digunakan ketika Anda ingin tindakan / filter Anda berjalan SETELAH semua kait (prioritas normal) lainnya telah selesai.
sumber
$priority
, jadi panggilan balik yang dikaitkan dengan prioritas0
tidak harus berada di urutan teratas dari urutan eksekusi.Tidak ada batasan dan tidak ada penalti kinerja. Dari memeriksa kode Anda bahkan dapat menggunakan string sebagai prioritas walaupun saya tidak akan merekomendasikan melakukan hal itu;)
Jika tindakan Anda harus menjadi yang terakhir maka Anda dapat memeriksa prioritas yang ditetapkan dengan melihat indeks global
$wp_actions[your hook]
ketika tindakan Anda dipanggil, dan menambahkannya lagi dengan prioritas yang lebih tinggi jika diperlukan, tetapi saya gagal melihat alasan untuk benar-benar melakukan hal semacam ini. hal.sumber
"Secara praktis" tidak ada batas karena kait sebenarnya disimpan sebagai array dan prioritasnya adalah indeks numerik.
Namun, pada kenyataannya, ukuran array akan dibatasi oleh jumlah memori yang dialokasikan untuk pelaksanaan skrip.
Jadi, saya kira menetapkan angka prioritas yang sangat besar - yang hanya diterjemahkan ke indeks numerik dalam array tempat fungsi yang dikaitkan disimpan - tidak boleh crash wordpress.
sumber