Bagaimana cara mengetahui prioritas apa yang digunakan dengan add_action ()?

12

Saya sedang menulis sebuah plugin kecil untuk menghapus beberapa item menu untuk pengguna non-admin dari backend, dan menemukan bahwa plugin saya tidak melakukan apa-apa kecuali saya menentukan prioritas dalam kode saya:

add_action('admin_bar_menu', 'remove_toolbar_items', 999);

Tanpa 999, kode tidak menghapus item dalam remove_toolbar_itemsfungsi saya , dan dengan itu berfungsi dengan baik:

function remove_toolbar_items( $wp_admin_bar ) {
    if ( !current_user_can( 'manage_options' ) ) {
        $wp_admin_bar->remove_node('new-post');
        $wp_admin_bar->remove_node('comments');
    }
}

The docs untuk negara parameter prioritas:

Digunakan untuk menentukan urutan fungsi yang terkait dengan tindakan tertentu dijalankan. Angka yang lebih rendah sesuai dengan eksekusi sebelumnya, dan fungsi dengan prioritas yang sama dieksekusi dalam urutan di mana mereka ditambahkan ke tindakan. Nilai standar: 10

Namun saya tidak menemukan apa pun yang menjelaskan bagaimana Anda seharusnya menentukan prioritas untuk digunakan. Bagaimana Anda menentukan kapan harus menggunakan prioritas, dan apa prioritas untuk digunakan? Saya merasa seperti saya bisa menggaruk-garuk kepala selama berjam-jam jika saya tidak mempermainkan parameter prioritas.

Juga, saya melihat bahwa prioritas default adalah 10, tetapi apakah ada rentang nilai prioritas yang diketahui?

j08691
sumber

Jawaban:

6

rentang nilai prioritas? rentang nilai prioritas?

Secara umum, Anda tidak dapat mengetahui apriori tentang prioritas sesuatu. Prioritas yang diperlukan tergantung pada bagaimana panggilan balik lain di mana terhubung. Seringkali itu adalah nilai default 10 tetapi bisa di antara PHP_INT_MIN(bilangan negatif masih bilangan bulat) dan PHP_INT_MAXdan tidak ada cara untuk memastikan kecuali dengan eksperimen dan, jika mungkin ( seperti dengan Core dan setiap tema atau plugin yang Anda khawatirkan secara khusus), dengan memeriksa sumbernya.

s_ha_dum
sumber
1
Terima kasih. Sepertinya inti seharusnya memiliki sedikit utilitas bawaan untuk memberi Anda informasi ini.
j08691
Itu bukan informasi yang benar dan tidak bisa dijawab. Mohammed Asif menjawab dengan benar. has_filter ('init', 'some_hook') memungkinkan untuk mengetahui tindakan prioritas apa yang dimiliki.
Юра Косяк
5

WordPress menempatkan tindakan Anda ke dalam array dengan prioritas yang diindeks. Anda dapat melihat ini dengan mencetak (di panel admin admin_init) $wp_filter:

* Catatan * seperti yang ditunjukkan oleh @s_ha_dum dalam komentar di bawah ini, admin_initmungkin tidak dapat menangkap semua kait yang ditambahkan ke dalam tindakan, cetakan yang lebih andal mungkin shutdownmalah menjadi kait .

function filter_print() {
    global $wp_filter;
    print_r( $wp_filter['admin_bar_menu'] );
    die();
}
add_action( 'admin_init', 'filter_print' );

Ini memberi kita array yang rapi yang terlihat seperti ini: (disederhanakan)

Array(
    [admin_bar_menu] => Array (
        [0] => Array (
            [wp_admin_bar_my_account_menu] => Array (
                [function] => wp_admin_bar_my_account_menu
                [accepted_args] => 1
            )
            [wp_admin_bar_sidebar_toggle] => Array (
                [function] => wp_admin_bar_sidebar_toggle
                [accepted_args] => 1
            )
        )

        [4] => Array (
            [wp_admin_bar_search_menu] => Array (
                [function] => wp_admin_bar_search_menu
                [accepted_args] => 1
            )
        )

        [7] => Array (
            [wp_admin_bar_my_account_item] => Array (
                [function] => wp_admin_bar_my_account_item
                [accepted_args] => 1
            )
        )

        [10] => Array (
            [wp_admin_bar_wp_menu] => Array (
                [function] => wp_admin_bar_wp_menu
                [accepted_args] => 1
            )
        )

        [20] => ...
    )
)

0, 4, 7, 10, dan seterusnya adalah prioritas tindakan, ketika tindakan baru ditambahkan, defaultnya adalah 10, mirip dengan indeks 0 pada contoh di atas, mereka hanya ditumpuk ke dalam indeks array yang sama. . Mempertimbangkan bahwa banyak kait ditambahkan ke dalam tindakan khusus ini yang Anda inginkan di akhir atau akhirnya setelah tindakan tertentu dijalankan (seperti menu). 1 dari dua prioritas juga dapat bekerja sama efektifnya: 81atau 201.

Untuk sebagian besar, prioritas standar 10 sudah cukup. Di lain waktu Anda ingin menambahkan hook Anda secara langsung (untuk mungkin membatalkan tujuan itu atau menghapus item tertentu) di mana Anda dapat menggunakan global $wp_filter;untuk mencari tahu ke mana ia harus pergi.

Howdy_McGee
sumber
Saya memikirkan hal ini, tetapi hanya akan menunjukkan hal-hal yang terhubung sebelum atau pada admin_init dan hanya hal-hal yang terhubung pada instalasi saat ini. Ia tidak mengatakan apa-apa tentang apa yang mungkin dilakukan oleh plugin atau tema yang belum dihapus. Tetap memberi +1.
s_ha_dum
@ s_ha_dum Itu poin yang bagus, saya kira Anda juga bisa menggunakan sesuatu seperti admin_footerbenar? Atau apakah itu masalah yang sama?
Howdy_McGee
1
The shutdownkait akan menjadi taruhan terbaik Anda, tapi hanya untuk kode diinstal dan bahkan kemudian, hal dapat bersyarat ketagihan sehingga mungkin untuk kehilangan beberapa pula.
s_ha_dum