Когда использовать global $post и другие глобальные переменные?
Я пытаюсь понять, когда и почему я должен использовать глобальную переменную $post. Я попробовал сделать следующее на странице записи, вне цикла, и, как и ожидалось, это работает.
<?php
global $post;
echo $post->ID;
?>
Если я делаю то же самое на странице архива (просто хотел посмотреть, что произойдет), по какой-то причине это тоже работает, получая ID предыдущей записи, даже если я удалил вышеуказанный код со страницы предыдущей записи. Это что-то вроде кэширования? Как именно это работает?
Я понимаю, что global $post может быть полезен, если я работаю с функцией в functions.php. Это единственный случай использования?
Большое спасибо

Возможно, этот вопрос слишком широк для однозначного ответа. Глобальная переменная $post
может использоваться различными способами. Вопрос о том, следует ли её использовать, зависит от конкретной ситуации.
Однако, насколько я понимаю, основное предназначение глобальной переменной $post
— её использование в файлах шаблонов темы.
Когда вы используете функции the_title()
, the_content()
, the_author()
или любые другие шаблонные функции, WordPress ищет эту информацию в глобальной переменной $post
. Как правило, при работе с файлами шаблонов следует использовать именно эти функции, например get_the_ID()
, вместо прямого обращения к $post->ID
.
Поэтому, если вы хотите лучше разобраться в глобальной переменной $post
, вам стоит изучить, как работает Цикл (The Loop) в WordPress, особенно в контексте файлов шаблонов. Когда Цикл выполняет функцию the_post()
, он устанавливает глобальную переменную для текущего элемента.
В файлах шаблонов вы обычно перебираете элементы автоматически выполненного запроса. Например, при обращении к отдельной странице WordPress автоматически выполняет запрос для этой страницы и загружает шаблон page.php
.
Если вам нужно получить дополнительные записи вне основного Цикла, например в файле functions.php
, вы можете выполнить собственный запрос с помощью WP_Query, инициировать Цикл и затем использовать шаблонные функции. Прямой доступ к глобальной переменной $post
следует использовать только в том случае, если нужная информация недоступна через существующие функции.
После завершения обработки вашего собственного запроса WP_Query
вы обнаружите, что глобальная переменная $post
осталась привязана к вашему пользовательскому запросу. Например, в шаблоне отдельной страницы после выполнения пользовательского Цикла текущая страница может больше не быть установлена в $post
. Вернуть глобальную переменную $post
в исходное состояние можно с помощью функции wp_reset_query. Это критически важно, иначе вы можете нарушить работу других плагинов или тем, которые ожидают исходное состояние глобальной переменной $post
.

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

Я уже писал пару постов на эту тему, но, возможно, они содержали неполную информацию, так как данный вопрос затрагивает некоторые другие аспекты. Также я задавал вопрос, который вы можете посмотреть здесь, с отличным ответом от @G.M.
По сути, глобальная переменная $post
устанавливается методом $wp_query->the_post()
и доступна во всем шаблоне, а не только внутри цикла. Именно поэтому они называются глобальными.
3681 public function the_post() {
3682 global $post;
3683 $this->in_the_loop = true;
3684
3685 if ( $this->current_post == -1 ) // цикл только начался
3686 /**
3687 * Срабатывает при старте цикла.
3688 *
3689 * @since 2.0.0
3690 *
3691 * @param WP_Query &$this Экземпляр WP_Query (передается по ссылке).
3692 */
3693 do_action_ref_array( 'loop_start', array( &$this ) );
3694
3695 $post = $this->next_post();
3696 setup_postdata($post);
3697 }
3698
Отсюда же вы получаете ответ на вопрос, почему на странице архива (и на любой другой странице) в переменной $post
оказывается последний пост. $post
всегда фактически устанавливается в последний пост из возвращаемого массива $posts
через метод $wp_query->next_post()
.
Нужно быть очень осторожным при использовании этой глобальной переменной вне цикла, так как пользовательские запросы и некоторые функции могут обращаться к ней и изменять её значение, как описано в связанном посте. Это одна из причин, почему всегда следует сбрасывать postdata после нового экземпляра WP_Query
. Функция query_posts
также ломает эту глобальную переменную, так как она нарушает основной запрос — вот почему query_posts
следует избегать любой ценой.
В принципе, вам просто нужно объявить глобальную переменную $post
внутри функции, так как она находится вне текущего шаблона, но вы можете объявить её и вне цикла, если хотите.
В заключение, поскольку глобальная переменная $post
является одной из самых ненадежных и может быть легко изменена функциями, я рекомендую следовать советам от @G.M. в указанном вопросе.
