Intereting Posts
Pagination Не работает на домашней странице с 2 запросами Echo Самая недавняя заметка в Loop? Страница настройки при первом входе в систему на нескольких сайтах Как поддержать, позволяя пользователям добавлять свой собственный логотип в пользовательскую тему? Удалить пользовательскую таксономию Metabox с экрана пользовательского типа сообщений Мета-окно WordPress и флажок-список Проектирование пользовательского архива.php, вдохновленного темой Autofocus WordPress кажется сломанным при входе в систему Git Deploying – Отключение установки / обновления плагина / темы на удаленном компьютере? Как использовать таксономический термин как значение get_template_part? Gravity Forms отправит только электронную почту от администратора Условное перенаправление с выходом Домашняя ссылка на главной странице моего wordpress не показывает мои сообщения в блоге Странное поведение тега привязки (ссылки на странице, на внешних страницах нет) Ограничить поиск WordPress в пользовательское поле

Сокращение использования глобальной $ post

При создании мета-полей в каждой функции мета-поля кажется ссылкой на 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 в качестве параметра для этих функций?

Solutions Collecting From Web of "Сокращение использования глобальной $ 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 мусор повсюду, из-за главным образом процедурного построения ядра и основной цели для поддержания обратной совместимости. Это грязно, но в основном безвредно, если вы просто получаете доступ к своей ценности в известном контексте .