Как получить идентификатор сообщения в 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' );
Ответы
Ответ 1
Убедитесь, что вы вызываете глобальную $ 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
Ответ 2
Использование:
global $post
в начале вашей функции. Затем вы должны получить доступ к $post-> ID, чтобы получить идентификатор текущего сообщения. Это будет работать для новых и существующих должностей.
Ответ 3
Проблема в том, что вы используете hook_init hook. Если вы посмотрите на ссылку на действие - http://codex.wordpress.org/Plugin_API/Action_Reference - вы увидите, что этот крюк на самом деле называется BEFORE quering posts, поэтому используемые вами переменные еще не заполнены.
Вы можете использовать какое-то более позднее действие (с некоторой проверкой is_admin()), или вы можете использовать админ init hook для добавления действия к более позднему подключению, поэтому снова он будет использоваться только для администратора.
Ответ 4
Действие "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
Ответ 5
Если это новая запись/страница, я думаю, что идентификатор еще не существует, потому что сообщение не было опубликовано/добавлено в БД. Если вы пытаетесь отредактировать сообщение/страницу, я думаю, вы можете использовать $id = $_GET['post']
;
Ответ 6
Для тех, кто все еще задается вопросом о правильном подключении к вызову или к одному из многих в жизненном цикле администратора Wordpress: admin_head
следующее:
function myplugin_setup() {
global $post;
$id = $post->ID;
var_dump($id);
}
add_action('admin_head', 'myplugin_setup' );
Ответ 7
это может сработать:
$id = get_the_ID();