При создании мета-полей в каждой функции мета-поля кажется ссылкой на global $post
передается как параметр ($event)
. Я предпочитаю это, поскольку кажется последовательным и менее вероятно, чтобы вымыть $post
var, объявив его явно, как я читал в другом месте.
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 }
Я создал фильтр и другие функции, которые в настоящее время используют global $post
переменную global $post
.
add_action( 'admin_head-post-new.php', 'test' ); add_action( 'admin_head-post.php', 'test' ); function test() { global $post; // Declared explicitly }
Существует ли стандартный / рекомендуемый способ передачи global $post
переменной global $post
в качестве параметра для этих функций?
Когда мне нужно иметь дело с переменной $post
на admin, я обычно использую класс для раннего улова и обертывания глобальной переменной $post
, получая универсальный способ доступа к ней без повторного использования глобальной переменной.
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'));
На ранней стадии загрузки admin, то есть 'admin_init'
, класс 'MyAdminPost'
ищет переменную Post ID, отправленную с запросом и 'MyAdminPost'
связанный объект post.
Это работает на странице post.php
, но не на post-new.php
, потому что на этом идентификаторе страницы страницы не отправляется с запросом, потому что он еще не существует. В этом случае я добавляю обратный вызов к 'new_to_auto-draft'
который является "{old_status}_to_{new_status}"
чтобы сохранить сообщение сразу после его создания на странице post-new.php
.
Таким образом, на обеих страницах пост-объект хранится в свойстве класса очень рано.
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(); }
class ClassThatUsesPostObject { private $post_provider; function __construct(MyAdminPost $map) { $this->post_provider = $map; } function doSomethingWithPost() { $post = $this->post_provider->get(); } }
вы можете получить почтовый объект очень рано таким образом, который совместим как с страницами post-new.php
, так и с post-new.php
, поэтому во всех перехватах, запущенных на этих страницах, вы без каких-либо усилий получаете доступ к почтовому объекту
вы удаляете любую глобальную ссылку на переменную $post
в своем коде
ваш код будет тестироваться изолированно
Вы не можете легко изменить параметры, используемые с существующим фильтром / действием, поскольку они заданы «вызывающим» кодом, поэтому вы не можете вводить дополнительные параметры. Возможно, есть возможность сделать это, взломав основной код за do_action / apply_filter, но если вы добьетесь успеха, вы, скорее всего, сломаете весь другой код, который перехватывает эти действия / фильтры.
admin_head-{$hook_suffix}
запускается на каждой странице администратора, поэтому передача чего-либо в эту функцию, вероятно, не имеет смысла. Вы можете видеть в источнике, что аргументы не передаются:
do_action( "admin_head-$hook_suffix" );
Во многих случаях у вас нет альтернативы global $post
, и если вы посмотрите практически на любой основной исходный файл, вы увидите global
мусор повсюду, из-за главным образом процедурного построения ядра и основной цели для поддержания обратной совместимости. Это грязно, но в основном безвредно, если вы просто получаете доступ к своей ценности в известном контексте .