Как получить идентификатор сообщения в Wordpress Admin - PullRequest
16 голосов
/ 11 декабря 2011

Я разрабатываю плагин для 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) Это возвращает нулевой идентификатор

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

Ответы [ 7 ]

11 голосов
/ 31 января 2013

Убедитесь, что вы вызываете глобальный $ 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

8 голосов
/ 09 августа 2012

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

global $post

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

2 голосов
/ 03 апреля 2015

Действие '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
2 голосов
/ 11 октября 2012

Проблема в том, что вы используете ловушку admin_init. Если вы посмотрите в Action Reference - http://codex.wordpress.org/Plugin_API/Action_Reference - вы увидите, что этот хук на самом деле называется ПЕРЕД запросом сообщений, поэтому используемые вами переменные еще не заполнены.

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

0 голосов
/ 04 декабря 2018

Для тех, кто все еще задается вопросом, правильный перехват вызова или один из многих в жизненном цикле администратора Wordpress: admin_head

следующим образом:

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

add_action('admin_head', 'myplugin_setup' );
0 голосов
/ 03 декабря 2013

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

$id = get_the_ID();
0 голосов
/ 11 декабря 2011

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

...