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