Reduzieren der Verwendung von globalen $ Post

Bei der Erstellung von Metaboxen scheint in jeder Metabox-function ein Verweis auf den global $post als Parameter übergeben zu werden ($event) . Ich bevorzuge dies, da es konsistent erscheint und weniger wahrscheinlich ist, das $post var zu verfälschen, indem es explizit deklariert wird, wie ich es an anderer Stelle gelesen habe.

 add_action('admin_init', 'events_admin'); function events_admin() { add_meta_box('display_events_date_meta_box', 'Dates', 'display_events_date_meta_box', 'events', 'normal', 'high' ); } function display_events_date_meta_box($event) // Referenced { //$event in this case is the $post global } 

Ich habe einen Filter und verschiedene andere functionen erstellt, die momentan nur die global $post Variable global $post .

 add_action( 'admin_head-post-new.php', 'test' ); add_action( 'admin_head-post.php', 'test' ); function test() { global $post; // Declared explicitly } 

Gibt es eine empfohlene Standardmethode, um die global $post Variable als Parameter an diese functionen zu übergeben?

Solutions Collecting From Web of "Reduzieren der Verwendung von globalen $ Post"

Wenn ich mit $post Variable auf admin umgehen muss, verwende ich normalerweise eine class, um die globale Variable $post frühzeitig zu fangen und zu umbrechen, um eine universelle Möglichkeit zu erhalten, darauf 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')); 

In der frühen Phase des Admin-Ladens, das ist der 'admin_init' Hook, sucht die 'MyAdminPost' class nach der Post-ID-Variablen, die mit der Anfrage gesendet wurde und das zugehörige Post-Objekt speichert.

Das funktioniert auf der post.php Seite, aber nicht auf post-new.php , da auf dieser Seite die Post ID nicht mit der Anfrage gesendet wird, weil sie noch nicht existiert. In diesem Fall füge ich einen Callback zu 'new_to_auto-draft' , der eine der "{old_status}_to_{new_status}" Hooks ist, um den Post sofort nach dem post-new.php auf der post-new.php Seite zu speichern.

Auf diese Weise wird das Post-Objekt in beiden Seiten sehr früh in einer classneigenschaft gespeichert.

Verwendungsbeispiel (Prozedur)

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

Verwendungsbeispiel (OOP)

 class ClassThatUsesPostObject { private $post_provider; function __construct(MyAdminPost $map) { $this->post_provider = $map; } function doSomethingWithPost() { $post = $this->post_provider->get(); } } 

performanceen

  • Sie können das Post-Objekt sehr früh auf eine Art und Weise erhalten, die sowohl mit den Seiten post.php als auch post-new.php kompatibel ist, so dass Sie in allen auf diesen Seiten abgefeuerten Hooks ohne großen Aufwand Zugriff auf das Post-Objekt haben

  • Sie entfernen einen globalen $post Variablenverweis in Ihrem Code

  • Ihr Code wird isoliert testbar

Sie können die Parameter, die mit einem vorhandenen Filter / einer Aktion verwendet werden, nicht so einfach ändern, wie sie durch den Code “calling” festgelegt werden. Daher können Sie keine zusätzlichen Parameter hinzufügen. Es könnte eine Möglichkeit geben, dies zu tun, indem Sie den corecode hinter do_action / apply_filter hacken, aber wenn Sie erfolgreich sind, werden Sie wahrscheinlich den anderen Code, der an diesen Aktionen / Filtern hängt, durchbrechen.

admin_head-{$hook_suffix} wird auf jeder Admin-Seite ausgetriggers, daher ist es wahrscheinlich nicht sinnvoll, etwas an diese function admin_head-{$hook_suffix} . Sie können in der Quelle sehen, dass keine Argumente übergeben werden:

 do_action( "admin_head-$hook_suffix" ); 

In vielen Fällen haben Sie keine Alternative zu global $post , und wenn Sie sich nur irgendeine Quelldatei ansehen, werden Sie aufgrund der meist prozeduralen Konstruktion des cores und des primären Ziels, Abwärtskompatibilität zu gewährleisten, überall global Müll sehen. Es ist chaotisch, aber meistens harmlos, wenn man nur in einem bekannten Kontext auf seinen Wert zugreift .