我如何在admin上的post.php上知道当前的帖子类型?


11

我试图用admin_init钩子来做某事,当且仅当用户正在编辑帖子类型为“事件”的帖子(post.php)。我的问题是,即使wordpress指向一个全局变量调用$ post_type。如果我做:

global $post_type;
var_dump($post_type);

它返回NULL。

但是如果我这样做:

global $pagenow;
var_dump($pagenow);

它返回我的当前页面。即“ post.php”。

我调查了这个函数,$screen = get_current_screen();但是直到admin_init钩子运行之后才声明,然后到了后期。

所以我的问题是,如何在运行admin_init时找出当前正在编辑的帖子的类型。如果网址是post.php?post=81&action=edit,那么我怎么知道postid = 81是什么类型?

谢谢马尔特


那又如何global $post呢?
西西尔2014年

Answers:


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
    }
}

当编辑现有文章的网址是“/wp-admin/post.php?post=81&action=edit”
Malibur

好吧,现在已修复...即使您必须查询数据库才能这样做...
MiCc83 2014年

1
请说明添加到您的代码做什么
彼得·古森

即使在2018年,这也是一个非常有帮助的答案!
LoicTheAztec

仅代码答案不是很有用。参见上述@PieterGoosen的评论,从〜5年前开始……
random_user_name

0

我将扩展MiCc83的答案。有些事情没有遵循OP的原始问题,但总的来说,这是一个很好的解决方案。例如,它不适用于post_type事件,因为您正在将答案中的post_type检查为“ post”。

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

    }
}

'post' === get_post_type( $_GET['post'] )先前答案中的条件将阻止此操作处理帖子类型“事件”。您将需要检查帖子类型“事件”而不是“帖子”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.