Làm thế nào để biết ưu tiên sử dụng với add_action ()?


10

Tôi đã viết một plugin nhỏ để xóa một số mục menu cho người dùng không phải quản trị viên khỏi phần phụ trợ và phát hiện ra rằng plugin của tôi không làm gì cả trừ khi tôi chỉ định mức độ ưu tiên trong mã của mình:

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

Không có 999, mã không loại bỏ các mục trong remove_toolbar_itemschức năng của tôi và với nó, nó hoạt động rất tốt:

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

Các tài liệu cho trạng thái tham số ưu tiên:

Được sử dụng để chỉ định thứ tự các hàm liên quan đến một hành động cụ thể được thực thi. Các số thấp hơn tương ứng với thực thi trước đó và các hàm có cùng mức ưu tiên được thực hiện theo thứ tự chúng được thêm vào hành động. Giá trị mặc định: 10

Tuy nhiên tôi không tìm thấy bất cứ điều gì giải thích cách bạn cần xác định mức độ ưu tiên sử dụng. Làm thế nào để bạn xác định khi nào nên sử dụng ưu tiên, và ưu tiên sử dụng là gì? Tôi cảm thấy mình có thể gãi đầu hàng giờ liền nếu không đùa giỡn với thông số ưu tiên.

Ngoài ra, tôi thấy rằng mức ưu tiên mặc định là 10, nhưng có một phạm vi giá trị ưu tiên đã biết không?

Câu trả lời:


6

phạm vi của các giá trị ưu tiên? phạm vi của các giá trị ưu tiên?

Nói chung, bạn không thể biết một tiên nghiệm về thứ gì đó được ưu tiên. Mức độ ưu tiên cần thiết phụ thuộc vào cách gọi lại khác khi được nối. Thường đó là giá trị mặc định là 10 nhưng nó có thể ở bất kỳ đâu PHP_INT_MIN(số nguyên âm vẫn là số nguyên) và PHP_INT_MAXkhông có cách nào chắc chắn ngoại trừ bằng thử nghiệm và, nếu có thể ( như với Core và bất kỳ chủ đề hoặc plugin nào mà bạn đặc biệt quan tâm), bằng cách kiểm tra nguồn.


1
Cảm ơn. Có vẻ như lõi nên có một số tiện ích tích hợp nhỏ để cung cấp cho bạn thông tin này.
j08691

Đó không phải là thông tin chính xác và không thể trả lời. Mohammed Asif trả lời đúng. has_filter ('init', 'some_hook') cho phép biết hành động ưu tiên nào có.
Юра Косяя

4

WordPress đặt hành động của bạn vào một mảng với các ưu tiên được lập chỉ mục. Bạn có thể thấy điều này bằng cách in ra (trong bảng quản trị admin_init) $wp_filter:

* Lưu ý * như @s_ha_dum chỉ ra trong các bình luận bên dưới, admin_initcó thể không bắt tất cả các móc được thêm vào hành động, bản in đáng tin cậy hơn có thể được nối vào shutdownthay thế.

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

Điều này cung cấp cho chúng ta một mảng gọn gàng trông giống như thế này: (đơn giản hóa)

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, v.v. là các ưu tiên của các hành động, khi một hành động mới được thêm vào, nó được mặc định là 10, tương tự như chỉ số 0 trong ví dụ trên, chúng chỉ được xếp vào cùng một chỉ mục của mảng . Xem xét rằng nhiều hook được thêm vào hành động cụ thể này mà bạn muốn thực hiện vào cuối hoặc cuối cùng sau khi một hành động cụ thể được chạy (chẳng hạn như các menu). 1 trong hai ưu tiên cũng có thể hoạt động hiệu quả như: 81hoặc 201.

Đối với hầu hết các phần, mức ưu tiên mặc định là 10 là đủ. Những lần khác, bạn muốn thêm trực tiếp hook của mình sau một lần khác (để có thể vô hiệu hóa mục đích của nó hoặc xóa một mục cụ thể) trong trường hợp đó bạn có thể sử dụng global $wp_filter;để tìm ra nơi cần đến.


Tôi đã nghĩ về điều này, nhưng nó sẽ chỉ hiển thị những thứ được nối vào trước hoặc trên admin_init và chỉ những thứ được nối vào cài đặt hiện tại. Nó không nói gì về những gì một plugin hoặc chủ đề chưa được gỡ cài đặt có thể làm. +1 dù sao đi nữa.
s_ha_dum

@s_ha_dum Đó là một điểm tốt, tôi tưởng tượng bạn cũng có thể sử dụng một cái gì đó như thế admin_footerphải không? Hay đó sẽ là vấn đề tương tự?
Howdy_McGee

1
Các shutdownmóc sẽ là lựa chọn tốt nhất của bạn, nhưng chỉ đối với mã cài đặt và thậm chí sau đó, mọi thứ có thể có điều kiện nối vì vậy nó có thể bỏ lỡ một số anyway.
s_ha_dum


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.