web-dev-qa-db-ger.com

So erhalten Sie die Post-ID in Wordpress Admin

Ich entwickle ein Wordpress Plugin und benötige die aktuelle Post ID
im Bearbeitungsbildschirm Post schreiben/Seite schreiben (außerhalb der Schleife).

Ich muss es auch vor dem "admin_print_scripts" -Hook tun, da ich einige Daten an eine Javascript-Datei übergeben möchte.

Ich kann nicht verwenden:

$id = $_GET['post'];

weil die URL diese Variable nicht enthält, wenn Sie einen neuen Beitrag oder eine neue Seite hinzufügen.

Bisher habe ich diese Optionen ausprobiert, aber keine davon hat funktioniert:

A) Dies gibt eine ID von 0 zurück

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

add_action('admin_init', 'myplugin_setup' );  

B) Dies gibt eine ID von null zurück

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

add_action('admin_init', 'myplugin_setup' );

C) Dies gibt auch eine ID von null zurück

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

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

Stellen Sie sicher, dass Sie das globale $ post nach der WordPress-Abfrage aufrufen. Wenn Sie init oder admin_init eine Aktion hinzufügen, ist die Abfrage noch nicht fertig, sodass Sie nichts aus der globalen Variablen $ post herausholen können.

Mein Rat wäre, die Aktionsreferenz auf dieser Seite zu überprüfen: http://codex.wordpress.org/Plugin_API/Action_Reference und eine zu wählen, die für Sie funktioniert.

Zum Beispiel habe ich das gemacht:

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

    }
}

Und ich konnte die Seiten-ID in WP admin abrufen

11
Ciprian Tepes

Benutzen:

global $post

zu Beginn Ihrer Funktion. Sie sollten dann Zugriff auf $ post-> ID haben, um die ID des aktuellen Posts abzurufen. Dies funktioniert für neue und vorhandene Posts.

9
Caleb

Das Problem ist, dass Sie den Hook admin_init verwenden. Wenn Sie sich Action Reference - http://codex.wordpress.org/Plugin_API/Action_Reference - ansehen, werden Sie feststellen, dass dieser Hook tatsächlich BEFORE quering posts heißt. Aus diesem Grund sind die von Ihnen verwendeten Variablen noch nicht gefüllt.

Sie können eine spätere Aktion verwenden (mit einem Check von is_admin ()), oder Sie können einen Admin-Init-Hook verwenden, um eine Aktion zu einem späteren Hook hinzuzufügen, sodass diese Aktion wieder nur für den Admin verwendet wird.

2
Tomáš Kapler

Die Aktion 'admin_init' wird vor jedem anderen Hook ausgelöst, wenn ein Benutzer auf den Administrationsbereich zugreift. Es wird ausgelöst bevor der neue Beitrag eine ID bekommt.

Um die neue Beitrags-ID zu erhalten, können Sie 'save_post' verwenden. Diese Aktion wird ausgelöst, wenn ein Beitrag oder eine Seite erstellt oder aktualisiert wird ( http://codex.wordpress.org/Plugin_API/Action_Reference/save_post ).

Zuerst können Sie Ihre Skripte mit 'admin_enqueue_scripts' einbinden und dann 'save_post' verwenden, um die neue Beitrags-ID zu erhalten. Das 'admin_print_scripts' wird nach 'save_post' ausgelöst und Sie können wp_localize_script ( https://codex.wordpress.org/Function_Reference/wp_localize_script ) oder eine andere Methode verwenden, um die neue Beitrags-ID an Ihr Javascript zu übergeben.

Ich brauchte etwas Ähnliches, aber es wurde in einer Klasse verwendet.

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

Jetzt können Sie in Ihrem Javascript Folgendes verwenden:

myJsObject.postId
2
Dan Fluture

Für alle, die sich immer noch fragen, welchen Hook sie anrufen sollen, oder für einen der vielen im Lebenszyklus von WordPress-Administratoren: admin_head

wie folgt:

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

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

Wenn es sich um einen neuen Beitrag/eine neue Seite handelt, existiert die ID vermutlich noch nicht, da der Beitrag nicht in der Datenbank veröffentlicht/hinzugefügt wurde. Wenn Sie versuchen, einen Beitrag/eine Seite zu bearbeiten, können Sie $id = $_GET['post'] verwenden.

0
bingjie2680