Làm thế nào để tôi biết loại bài đăng hiện tại khi trên post.php trong quản trị viên?


11

Tôi đang cố gắng làm một cái gì đó với một hook admin_init nếu - và chỉ khi - người dùng đang chỉnh sửa một bài đăng (post.php) với loại "sự kiện" bài đăng. Vấn đề của tôi là, mặc dù wordpress trỏ đến một biến toàn cục gọi $ post_type. nếu tôi làm:

global $post_type;
var_dump($post_type);

Nó trả về NULL.

nhưng nếu tôi làm điều này:

global $pagenow;
var_dump($pagenow);

nó trả về trang hiện tại của tôi tức là "post.php".

Tôi đã xem xét chức năng này $screen = get_current_screen();nhưng điều đó không được khai báo cho đến khi các hook admin_init chạy, và sau đó là đến cuối.

Vì vậy, câu hỏi của tôi là, làm thế nào để tôi, trong thời gian admin_init được chạy, hãy tìm hiểu loại bài đăng hiện tại đang được chỉnh sửa. Nếu url là vậy post.php?post=81&action=edit, làm thế nào để tôi biết loại bài postid = 81 là gì?

Cảm ơn Malthe


những gì về global $post?
Sisir

bài đăng toàn cầu chưa khả dụng trong hook
admin_init

Câu trả lời:


21
add_action( 'admin_init', 'do_something_152677' );
function do_something_152677 () {
    // Global object containing current admin page
    global $pagenow;

    // If current page is post.php and post isset than query for its post type 
    // if the post type is 'event' do something
    if ( 'post.php' === $pagenow && isset($_GET['post']) && 'post' === get_post_type( $_GET['post'] ) )
        // Do something
    }
}

Khi chỉnh sửa một bài đăng hiện có, url là '/wp-admin/post.php?post=81&action=edit'
Malibur

Bây giờ đã ổn định ... mặc dù bạn phải truy vấn db để làm như vậy ...
MiCc83

1
Vui lòng thêm một lời giải thích cho những gì mã của bạn làm
Pieter Goosen

Một câu trả lời rất hữu ích ngay cả trong năm 2018!
LoicTheAztec

Mã chỉ trả lời không hữu ích lắm. Xem @PieterGoosen cam kết ở trên, từ ~ 5 năm trước ....
Random_user_name

0

Tôi sẽ mở rộng câu trả lời của MiCc83. Có một vài điều không tuân theo các câu hỏi ban đầu của OP nhưng nhìn chung đó là một giải pháp tuyệt vời. Ví dụ: nó sẽ không hoạt động với một sự kiện post_type vì bạn đang kiểm tra post_type là 'post' trong câu trả lời.

add_action( 'admin_init', 'do_something_152677' );
function do_something_152677 () {
    // Global object containing current admin page
    global $pagenow;

    // If current page is post.php and post isset than query for its post type 
    if ( 'post.php' === $pagenow && isset($_GET['post']) ){
        $post_id = $_GET['post'];

        // Do something with $post_id. For example, you can get the full post object:
        $post = get_post($post_id);

    }
}

Điều kiện 'post' === get_post_type( $_GET['post'] )trong câu trả lời trước sẽ ngăn điều này hoạt động trên một loại bài 'sự kiện'. Bạn sẽ cần kiểm tra loại bài 'sự kiện' thay vì 'bài'.

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.