Как получить идентификатор сообщения в WordPress Admin

Я разрабатываю плагин WordPress, и мне нужно получить текущий идентификатор сообщения
на экране « Создать запись / запись страницы» (вне цикла).

Мне также нужно сделать это до «admin_print_scripts», потому что я хотел бы передать некоторые данные в файл javascript.

Я не могу использовать:

$id = $_GET['post']; 

потому что URL-адрес не включает эту переменную при добавлении нового сообщения или страницы.

Пока я пробовал эти варианты, но никто из них не работал:

A) Это возвращает идентификатор 0

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

B) Это возвращает идентификатор null

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

C) Это также возвращает идентификатор null

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

Убедитесь, что вы вызываете глобальную $ post после запроса WordPress. Если вы добавите действие в 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

Использование:

 global $post 

в начале вашей функции. Затем вы должны получить доступ к $ post-> ID, чтобы получить идентификатор текущего сообщения. Это будет работать для новых и существующих должностей.

Проблема в том, что вы используете hook_init hook. Если вы посмотрите на ссылку на действие – http://codex.wordpress.org/Plugin_API/Action_Reference – вы увидите, что этот крючок фактически называется ПЕРЕД ЗАПОЛНЕНИЕМ сообщений, поэтому используемые вами переменные еще не заполнены.

Вы можете использовать какое-то более позднее действие (с некоторой проверкой is_admin ()), или вы можете использовать админ init hook для добавления действия к более позднему подключению, поэтому снова он будет использоваться только для администратора.

Действие «admin_init» запускается перед любым другим захватом, когда пользователь обращается к области администрирования. Он запускается до того, как новое сообщение получит идентификатор.

Чтобы получить новый идентификатор сообщения, вы можете использовать «save_post», действие которого инициируется всякий раз, когда сообщение или страница создаются или обновляются ( http://codex.wordpress.org/Plugin_API/Action_Reference/save_post ).

Сначала вы можете включить свои скрипты, используя «admin_enqueue_scripts», а затем используйте «save_post», чтобы получить новый идентификатор сообщения. «Admin_print_scripts» запускается после «save_post», и вы можете использовать wp_localize_script ( https://codex.wordpress.org/Function_Reference/wp_localize_script ) или другой способ передать новый идентификатор сообщения на ваш 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 

Если это новая запись / страница, я думаю, что идентификатор еще не существует, потому что сообщение не было опубликовано / добавлено в БД. Если вы пытаетесь отредактировать сообщение / страницу, я думаю, вы можете использовать $id = $_GET['post'] ;

это может сработать:

 $id = get_the_ID();