我正在开发一个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' );
答案 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();