如何在Wordpress Admin中获取帖子ID

时间:2011-12-11 09:54:35

标签: php wordpress wordpress-plugin

我正在开发一个Wordpress插件,我需要获取当前的帖子ID
 在写入/写入页面编辑屏幕(循环外)。

我还需要在“admin_print_scripts”挂钩之前执行此操作,因为我想将一些数据传递给javascript文件。

我无法使用:

$id = $_GET['post'];

因为当您添加新帖子或页面时,网址不包含此变量。

到目前为止,我已经尝试过这些选项,但没有一个可以使用:

A)返回ID <0

function myplugin_setup() {
    global $wp_query;
    $id = $wp_query->get_queried_object_id();
    var_dump($id);
}

add_action('admin_init', 'myplugin_setup' );  

B)返回空值

function myplugin_setup() {
    global $wp_query;
    $id = $wp_query->post->ID;
    var_dump($id);
}

add_action('admin_init', 'myplugin_setup' );

C)这也返回一个空值

function myplugin_setup() {
    global $post;
    $id = $post->ID;
    var_dump($id);
}

add_action('admin_init', 'myplugin_setup' );

8 个答案:

答案 0 :(得分:11)

确保在WordPress查询后调用全局$ post。如果你向init或admin_init添加一个动作,那么查询就没有准备就绪,所以你无法从全局$ post变量中得到任何结果。

我的建议是检查此页面中的操作引用:http://codex.wordpress.org/Plugin_API/Action_Reference并选择一个适合您的操作。

例如,我这样做了:

add_action( 'admin_head', 'check_page_template' );
function check_page_template() {
    global $post;
    if ( 'page-homepage.php' == get_post_meta( $post->ID, '_wp_page_template', true ) ) {
        // The current page has the foobar template assigned
        // do something

    }
}

我能够在WP admin中获取页面ID

答案 1 :(得分:8)

使用:

global $post

在你的功能开始。然后,您应该可以访问$ post-&gt; ID来获取当前帖子的ID。这适用于新帖和现有帖。

答案 2 :(得分:2)

问题是,您正在使用admin_init hook。如果你查看Action Reference - http://codex.wordpress.org/Plugin_API/Action_Reference - 你会看到,这个钩子实际上是在查询帖子之前调用的,这就是你使用的那些变量尚未填充的原因。

您可以使用稍后的某些操作(使用某些is_admin()检查),或者您可以使用admin init hook将操作添加到某些稍后的挂钩,因此它将仅用于管理员。

答案 3 :(得分:2)

当用户访问管理区域时,在任何其他挂钩之前触发'admin_init'操作。它会在新帖子获得ID之前触发。

要获取新的帖子ID,您可以使用'save_post',这是在创建或更新帖子或页面时触发的操作(http://codex.wordpress.org/Plugin_API/Action_Reference/save_post)。

首先,您可以使用'admin_enqueue_scripts'包含脚本,然后使用'save_post'获取新的帖子ID。 'admin_print_scripts'在'save_post'之后触发,您可以使用wp_localize_script(https://codex.wordpress.org/Function_Reference/wp_localize_script)或其他方法将新的帖子ID传递给您的javascript。

我需要类似的东西,但它在课堂上使用。

class Foo {
    // this will hold the id of the new post
    private $postId = null;

    public function __construct()
    {
        // the actions are triggered in this order
        add_action('admin_enqueue_scripts', array($this, 'EnqueueScripts'));
        add_action('save_post', array($this, 'SavePost'));
        add_action('admin_print_scripts', array($this, 'LocalizeScripts'));
    }

    // enqueue your scripts and set the last parameter($in_footer) to true
    public function EnqueueScripts()
    {
        wp_enqueue_script('myJs', 'js/my.js', array('jquery'), false, true); 
    }

    // use wp_localize_script to pass to your script the post id
    public function LocalizeScripts()
    {
        wp_localize_script('myJs', 'myJsObject', array('postId'=>$this->GetPostId()));
    }

    // if $post_id is different from global post id you are in the write/create post page, else you are saving an existing post
    public function SavePost($post_id)
    {
        if($post_id != $this->GetPostId())
        {
            $this->SetPostId($post_id);
        }
    }

    private function GetPostId()
    {
        if (!$this->postId) {
            global $post;
            if($post)
            {
                $this->SetPostId($post->ID);
            }
        }

        return $this->postId;
    }

    private function SetPostId($postId)
    {
        $this->postId = $postId;
    }
}

现在,您可以在javascript中使用:

myJsObject.postId

答案 4 :(得分:0)

如果是新帖子/页面,我猜这个ID还不存在,因为该帖子尚未发布/添加到DB。如果您要编辑帖子/页面,我认为您可以使用$id = $_GET['post'];

答案 5 :(得分:0)

对于仍然想知道正确的钩子或wordpress管理员生命周期中的众多钩子之一的人,是:admin_head

如下:

function myplugin_setup() {
    global $post;
    $id = $post->ID;
    var_dump($id);
}

add_action('admin_head', 'myplugin_setup' );

答案 6 :(得分:0)

$post_id = null;
if(isset($_REQUEST['post']) || isset($_REQUEST['psot_ID'])){
    $post_id = empty($_REQUEST['post_ID']) ? $_REQUEST['post'] : $_REQUEST['post_ID'];  
}

我认为它会帮助您在管理面板中获取 ID。

答案 7 :(得分:-4)

这可能有效:

$id = get_the_ID();