Самый ранний хук для надежного получения $post/$posts

Вопрос или проблема

Какое самое раннее действие, в которое можно подсоединиться, чтобы получить доступ к глобальным переменным $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);

Применение

  1. Фронтенд: Хук wp обеспечивает надежный доступ к глобальной переменной $post после обработки основного запроса WordPress. Это важно для настройки различных аспектов взаимодействия с пользователем на основе текущего контента.

  2. Бэкенд: Хук add_meta_boxes предоставляет возможность взаимодействовать с интерфейсом пользователя в администраторской части, особенно при редактировании контента. Это позволяет использовать глобальные переменные как часть обработки данных, представленных администратору.

Тем не менее, важно помнить, что выбор подходящего хука может зависеть от конкретной задачи и специфики проекта. Также при работе с хуками стоит учитывать производительность системы и стараться минимизировать возможные конфликты между различными частями кода.

Заключение

В результате, для получения стабильного доступа к переменным $post/$posts с минимальными накладными расходами, рекомендуется использовать хук wp для фронтенда и add_meta_boxes для бэкенда. Этот подход позволяет сбалансировать необходимость адаптации к контексту работы WordPress с требуемой функциональностью.

Изучение и использование доступных хуков важно для эффективной разработки в WordPress, обеспечивая интеграцию пользовательских функций с системными процессами без излишних сложностей и конфликтов.

Оцените материал
Добавить комментарий

Капча загружается...