Вопрос или проблема
Какое самое раннее действие, в которое можно подсоединиться, чтобы получить доступ к глобальным переменным $post/$posts
как на фронтенде, так и на бэкенде? Я пытался просматривать справочник Codex, справочник Адама Брауна и несколько раз бегло пролистывал исходный код, но не очень успешно нашел подходящее решение.
pre_get_posts
слишком рано; Использование posts_selection
не работает, если вы хотите сделать второй вызов get_posts() во время обратного вызова; а template_redirect
не запускается на админской стороне. the_post
может быть раньше, чем template_redirect
для фронтенда, но он также не запускается на бэкенде. В идеале я бы хотел что-то, что запускается прямо перед возвратом get_post()/get_posts()
, но я не вижу ничего такого.
Ранее я использовал фильтр the_posts
, но предпочел бы действие, так как это более технически правильно.
Сейчас я подключаюсь дважды; один раз с использованием template_redirect
для фронтенда и снова с использованием admin_xml_ns
для бэкенда. Мне это не очень нравится, так как моя логика семантически не связана ни с одним из этих хуков, и кажется, что это очень распространенная потребность, и должен быть хук типа “post_get_posts” (аналогично pre_get_posts
), который работает на обеих сторонах.
Для всех админских страниц и страниц фронтенда, кроме экранов редактирования отдельных постов (wp-admin/post.php
), 'wp'
является самым надежным хуком для получения глобальных значений.
http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-includes/class-wp.php.source.html#l486
Вы можете видеть, что он срабатывает сразу после WP::main()
, когда срабатывает WP::register_globals()
. Проблема с использованием таких вещей, как post_results
и get_posts
, заключается в том, что они запускаются каждый раз, когда вы делаете запрос на получение постов. 'wp'
срабатывает только в функции WP::main()
, что является тем, что ядро WP использует для выполнения основного запроса страницы.
Для экранов редактирования постов похоже, что первым хуком, который можно использовать надежно, будет 'add_meta_boxes'
. Вам просто нужно убедиться, что вы находитесь на основной странице при подключении, хотя он передает глобальный объект $post
в качестве второго аргумента (первым является $post_type
текущего поста).
posts_results
— это фильтр на необработанный результат запроса. смотрите строку 2627 в wp-includes/query.php
.
Я использовал хук admin_head
для страницы редактирования поста и хук wp
для фронтенда. Это не элегантное решение. Но оно мне помогло.
Вы можете проверить список хуков WP по порядку срабатывания.
https://wp-kama.com/hooks/actions-order
Ответ или решение
Вопрос о том, какая акция является самой ранней в WordPress, позволяет получить доступ к глобальным переменным $post/$posts
как на фронтенде, так и на бэкенде, действительно сложен. Рассмотрим эту тему подробно, учитывая специфику работы системы WordPress.
Теория
WordPress предоставляет множество хуков, которые позволяют разработчикам интегрироваться в различные стадии процесса загрузки страницы. Для работы с глобальными переменными $post/$posts
необходимо выбрать соответствующий хук, который будет стабильно предоставлять доступ к этим данным как на фронтенде, так и на бэкенде.
В рамках WordPress переменная $post
становится доступной после обработки основного запроса, когда CMS завершает выборку данных из базы и наполняет глобальные переменные. Наиболее типичные хуки для работы с этими данными включают в себя:
-
wp
: Этот хук срабатывает сразу после выполнения основного запроса на сайте (функцияWP::main()
), что дает доступ к глобальным переменным$post/$posts
на фронтенде. Он является частью стандартного потока обработки запроса WordPress и запускается непосредственно после того, как WP регистрирует глобальные переменные. -
add_meta_boxes
: Данный хук полезен для админской части, особенно при редактировании постов. Он позволяет работать с данными поста на странице редактирования, предоставляя доступ к объекту поста как части аргументов хука.
Пример
Рассмотрим примеры использования вышеупомянутых хуков для работы с переменными $post/$posts
.
Пример для фронтенда
Использование хука wp
для доступа к переменной $post
на фронтенде может выглядеть следующим образом:
add_action('wp', function() {
global $post;
if (is_singular()) {
// Ваш код здесь, который использует $post
echo 'Текущий заголовок поста: ' . $post->post_title;
}
});
Пример для бэкенда
Для администраторской части при редактировании постов может подойти следующий подход:
add_action('add_meta_boxes', function($post_type, $post) {
if ($post_type === 'post') {
// Ваш код здесь, который использует $post
echo 'Редактируемый заголовок поста: ' . $post->post_title;
}
}, 10, 2);
Применение
-
Фронтенд: Хук
wp
обеспечивает надежный доступ к глобальной переменной$post
после обработки основного запроса WordPress. Это важно для настройки различных аспектов взаимодействия с пользователем на основе текущего контента. -
Бэкенд: Хук
add_meta_boxes
предоставляет возможность взаимодействовать с интерфейсом пользователя в администраторской части, особенно при редактировании контента. Это позволяет использовать глобальные переменные как часть обработки данных, представленных администратору.
Тем не менее, важно помнить, что выбор подходящего хука может зависеть от конкретной задачи и специфики проекта. Также при работе с хуками стоит учитывать производительность системы и стараться минимизировать возможные конфликты между различными частями кода.
Заключение
В результате, для получения стабильного доступа к переменным $post/$posts
с минимальными накладными расходами, рекомендуется использовать хук wp
для фронтенда и add_meta_boxes
для бэкенда. Этот подход позволяет сбалансировать необходимость адаптации к контексту работы WordPress с требуемой функциональностью.
Изучение и использование доступных хуков важно для эффективной разработки в WordPress, обеспечивая интеграцию пользовательских функций с системными процессами без излишних сложностей и конфликтов.