Wenn ich mich mit $post
Variablen in admin befassen muss , verwende ich normalerweise eine Klasse, um globale $post
Variablen frühzeitig abzufangen und zu verpacken und eine universelle Möglichkeit zu erhalten, auf sie zuzugreifen, ohne sich wiederholt auf die globale Variable zu verlassen.
class MyAdminPost
{
private static $post;
public static function init()
{
$p_get = filter_input(INPUT_GET, 'post', FILTER_SANITIZE_NUMBER_INT);
$p_post = filter_input(INPUT_POST, 'post', FILTER_SANITIZE_NUMBER_INT);
if ($p_get > 0 || $p_post > 0) {
self::$post = $p_get > 0 ? get_post($p_get) : get_post($p_post);
} elseif ($GLOBALS['pagenow'] === 'post-new.php') {
add_action('new_to_auto-draft', function(\WP_Post $post) {
if (is_null(MyAdminPost::$post)) {
MyAdminPost::$post = $post;
}
}, 0);
}
}
public function get()
{
return self::$post;
}
}
add_action('admin_init', array('MyAdminPost', 'init'));
Am frühen Stadium des Admin - Ladens, das ist 'admin_init'
Haken, 'MyAdminPost'
Klasse sieht für die Zeit nach ID - Variable gesendet mit Anfrage und Shop an Post - Objekt.
Das funktioniert auf post.php
Seite, aber nicht auf post-new.php
, da auf dieser Seite die Post-ID nicht mit Anfrage gesendet wird, da sie noch nicht existiert. In diesem Fall füge ich einen Rückruf hinzu 'new_to_auto-draft'
, der den "{old_status}_to_{new_status}"
Haken zum Speichern des Beitrags unmittelbar nach dem Erstellen auf der post-new.php
Seite darstellt.
Auf diese Weise wird das Post-Objekt auf beiden Seiten sehr früh in einer Klasseneigenschaft gespeichert.
Anwendungsbeispiel (Verfahren)
function get_my_admin_post()
{
static $post = null;
if (is_null($post) && did_action('admin_init')) {
$map = new MyAdminPost();
$post = $map->get();
}
return $post;
}
add_action('admin_head-post.php', 'test');
function test()
{
$post = get_my_admin_post();
}
Anwendungsbeispiel (OOP)
class ClassThatUsesPostObject
{
private $post_provider;
function __construct(MyAdminPost $map)
{
$this->post_provider = $map;
}
function doSomethingWithPost()
{
$post = $this->post_provider->get();
}
}
Leistungen
Sie können Post-Objekte sehr früh auf eine Weise abrufen, die sowohl mit post.php
als auch mit post-new.php
Seiten kompatibel ist. In allen Hooks, die auf diesen Seiten ausgelöst werden, können Sie also mühelos auf Post-Objekte zugreifen
Sie entfernen alle globalen $post
Variablenreferenzen in Ihrem Code
Ihr Code wird isoliert getestet
get_queried_object()
das praktisch. Es ist auch in admin verfügbar, funktioniert jedoch nicht für neue Postseiten und ist erst nach der Abfrage verfügbar. Diese Klasse füllt die Lücke.$_REQUEST
funktioniert es. Versuchen Sie, 2 Werte für dieselbe Variable zu senden, aber einen an$_GET
und einen an$_POST
. Wenn Sie den Wert mit$_REQUEST
dem Wert auf$_GET
gewinnt . @kaiserSie können die mit einem vorhandenen Filter / einer Aktion verwendeten Parameter nicht einfach ändern, da sie durch den "aufrufenden" Code festgelegt werden. Daher können Sie keine zusätzlichen Parameter einfügen. Möglicherweise besteht die Möglichkeit, dies zu tun, indem Sie den Kerncode hinter do_action / apply_filter hacken. Wenn Sie jedoch erfolgreich sind, wird höchstwahrscheinlich der gesamte andere Code beschädigt, der diese Aktionen / Filter verknüpft.
quelle
admin_head-{$hook_suffix}
wird auf jeder Administrationsseite ausgelöst, daher wäre es wahrscheinlich nicht sinnvoll, etwas an diese Funktion zu übergeben. Sie können in der Quelle sehen, dass keine Argumente übergeben werden:In vielen Fällen haben Sie keine Alternative zu
global $post
und wenn Sie fast jede Kernquelldatei durchsehen, werden Sieglobal
überall Müll sehen , da der Kern größtenteils prozedural aufgebaut ist und das Hauptziel darin besteht, die Abwärtskompatibilität aufrechtzuerhalten. Es ist chaotisch, aber meistens harmlos, wenn Sie nur in einem bekannten Kontext auf seinen Wert zugreifen .quelle