web-dev-qa-db-fra.com

Comment obtenir un identifiant de publication dans Wordpress Admin

Je développe un plugin Wordpress et je dois obtenir la version actuelle Post ID
dans Écran d'édition Ecriture de page d'écriture/page (en dehors de la boucle).

Je dois également le faire avant le hook "admin_print_scripts", car je souhaite transmettre des données à un fichier javascript.

Je ne peux pas utiliser:

$id = $_GET['post'];

car l'URL n'inclut pas cette variable lorsque vous ajoutez un nouvel article ou une nouvelle page.

Jusqu'à présent, j'ai essayé ces options, mais aucune d'entre elles n'a fonctionné:

A) Ceci retourne un ID de 0

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

add_action('admin_init', 'myplugin_setup' );  

B) Ceci retourne un identifiant de null

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

add_action('admin_init', 'myplugin_setup' );

C) Ceci retourne également un identifiant de null

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

add_action('admin_init', 'myplugin_setup' );
16
Victor

Assurez-vous d'appeler le message global $ post après la requête WordPress. Si vous ajoutez une action à init ou admin_init, la requête n'est pas prête et vous ne pouvez donc rien sortir de la variable globale $ post.

Mon conseil serait de vérifier la référence d'action de cette page: http://codex.wordpress.org/Plugin_API/Action_Reference et de choisir celle qui vous convient.

Par exemple, j'ai fait ceci:

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

    }
}

Et j'ai pu obtenir l'ID de la page dans WP admin

11
Ciprian Tepes

Utilisation:

global $post

au début de votre fonction. Vous devriez alors avoir accès à $ post-> ID pour obtenir l'id de la publication actuelle. Cela fonctionnera pour les postes nouveaux et existants.

9
Caleb

Le problème, c'est que vous utilisez le hook admin_init. Si vous examinez Action Reference - http://codex.wordpress.org/Plugin_API/Action_Reference -, vous verrez que ce hook s'appelle en réalité AVANT de lancer des requêtes, c'est pourquoi les variables que vous utilisez ne sont pas encore renseignées.

Vous pouvez utiliser une action ultérieure (avec une vérification is_admin ()) ou utiliser le crochet admin init pour ajouter une action à un autre crochet ultérieur. Elle ne sera donc utilisée que sur admin.

2
Tomáš Kapler

L'action 'admin_init' est déclenchée avant tout autre raccordement lorsqu'un utilisateur accède à la zone d'administration. Il est déclenché avant que le nouveau message obtienne un identifiant.

Pour obtenir le nouvel identifiant de publication, vous pouvez utiliser 'save_post', qui est une action déclenchée chaque fois qu'une publication ou une page est créée ou mise à jour ( http://codex.wordpress.org/Plugin_API/Action_Reference/save_post ).

Tout d'abord, vous pouvez inclure vos scripts à l'aide de 'admin_enqueue_scripts', puis utiliser 'save_post' pour obtenir le nouvel identifiant de publication. 'Admin_print_scripts' est déclenché après 'save_post' et vous pouvez utiliser wp_localize_script ( https://codex.wordpress.org/Function_Reference/wp_localize_script ), ou une autre méthode pour transmettre le nouvel identifiant de publication à votre javascript.

J'avais besoin de quelque chose de similaire, mais c'était utilisé en classe.

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;
    }
}

Maintenant, dans votre javascript, vous pouvez utiliser:

myJsObject.postId
2
Dan Fluture

Pour ceux qui se demandent toujours le bon numéro à appeler ou l'un des nombreux cycles de cycle de vie d'admin wordpress, c'est: admin_head

comme suit:

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

add_action('admin_head', 'myplugin_setup' );
0
Mel Macaluso

S'il s'agit d'un nouvel article/d'une nouvelle page, je suppose que l'identifiant n'existe pas encore car l'article n'a pas été publié/ajouté à la base de données. Si vous essayez de modifier un article/une page, je pense que vous pouvez utiliser $id = $_GET['post'];

0
bingjie2680