Meta Box: hook 'admin_init' hoặc 'add_meta_boxes'?


9

Khi thiết lập hộp meta trong loại bài đăng tùy chỉnh, tôi đã sử dụng add_meta_boxeshook, ví dụ:

add_action('add_meta_boxes', 'meta_box_setup');
function meta_box_setup()
{
    add_meta_box( 
        'mb_movie_review', 
        'Movie Review Details', 
        'display_movie_review_mb', 
        'movie-reviews', 
        'side', 
        'high' 
    );
}

Nhưng tôi vừa đọc hướng dẫn này bằng cách sử dụng admin_inithook, như vậy ...

add_action('admin_init', 'meta_box_setup');
function meta_box_setup()
{
    add_meta_box( 
        'mb_movie_review', 
        'Movie Review Details', 
        'display_movie_review_mb', 
        'movie-reviews', 
        'side', 
        'high' 
    );
}

Đây là lần đầu tiên tôi thấy nó được thực hiện bằng cách sử dụng admin_initmóc.

Câu hỏi

Phương thức thứ hai (sử dụng admin_init) không hoạt động nhưng ...

  • Đây có phải là phương pháp ưa thích ? (tức là tối ưu hơn?)
  • chỉ là một cách khác nhau để đạt được kết quả tương tự, hoặc
  • một cách xấu để thêm hộp meta? (nếu vậy, tại sao?)

4
Hãy xem danh sách này: codex.wordpress.org/Plugin_API/Action_Reference - không quan trọng bạn sử dụng cái nào miễn là không quá sớm và không quá muộn. Tốt nhất là sử dụng móc trực quan và có thể dự đoán được, vì vậy add_meta_boxesđược ưa thích.
Paul

@Paul Tuyệt vời. Bạn có thể đăng bài này như một câu trả lời (để tôi có thể ghi có cho bạn)?
ngủ

3
Đồng ý, tôi nghĩ rằng chỉ đơn giản là tác giả hướng dẫn đã không nhận thức được add_meta_boxes. Chúng tôi thậm chí có "add_meta_boxes_$post_type"quyền kiểm soát tốt hơn.
brasofilo

Câu trả lời:


4

Hãy xem danh sách này: http://codex.wordpress.org/Plugin_API/Action_Reference

  1. Không quan trọng bạn sử dụng cái nào miễn là không quá sớm và không quá muộn. Tốt nhất là sử dụng móc trực quan và có thể dự đoán được, vì vậy add_meta_boxesđược ưa thích. Một ngày nào đó trong tương lai WordPress có thể thay đổi điều gì đó và bằng cách sử dụng các hook phù hợp nhất, bạn sẽ tăng cơ hội rằng mã của bạn sẽ vẫn hoạt động trong tương lai.
  2. Có một ngoại lệ mà tôi có thể nghĩ đến đó. Đôi khi (trong trường hợp rất khó xảy ra), bạn có thể cần phải gọi ví dụ add_theme_support()thường được sử dụng với after_setup_themehook hành động chỉ dành cho người dùng đã đăng nhập là quản trị viên nhưng hook này chưa cho phép bạn truy cập thông tin này. Do đó, bạn có thể phải sử dụng set_current_userhoặc inithành động móc thay thế (sau khi thực hiện một số nghiên cứu nếu nó an toàn để làm điều đó).

3

Có một số móc khác:

do_action( 'add_meta_boxes', $post_type, $post );

và ngay lập tức sau đó chạy:

do_action( "add_meta_boxes_{$post_type}", $post );

Nếu bạn muốn thực hiện các kiểm tra hủy bỏ khác nhau từ bên trong hook / callback thực sự đăng ký các hộp meta, hãy sử dụng một trong các cách trên vì \WP_Screenđối tượng không được điền ngay khi admin_initchạy.

Nếu bạn đã sử dụng add_meta_boxeshook chung hơn , bạn có thể kiểm tra đối số đầu tiên của nó:

function register( $post_type, $post )
{
    if ( get_current_screen()->post_type !== $post_type )
        return;

    add_meta_box( /* etc. */ );
}

Nếu bạn không muốn thêm hộp meta của mình miễn là bài đăng chưa được lưu ít nhất một lần, bạn có thể kiểm tra

if ( 'add' !== get_current_screen()->action )
    return;

và như thế. Kết luận: Nếu bạn muốn thu hẹp mọi thứ, hãy sử dụng các móc hiển thị ở trên.

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.