Когда использовать global $post и другие глобальные переменные?

5 дек. 2014 г., 11:44:43
Просмотры: 64.3K
Голосов: 11

Я пытаюсь понять, когда и почему я должен использовать глобальную переменную $post. Я попробовал сделать следующее на странице записи, вне цикла, и, как и ожидалось, это работает.

    <?php 
        global $post;
        echo $post->ID;
    ?>

Если я делаю то же самое на странице архива (просто хотел посмотреть, что произойдет), по какой-то причине это тоже работает, получая ID предыдущей записи, даже если я удалил вышеуказанный код со страницы предыдущей записи. Это что-то вроде кэширования? Как именно это работает?

Я понимаю, что global $post может быть полезен, если я работаю с функцией в functions.php. Это единственный случай использования?

Большое спасибо

0
Все ответы на вопрос 2
2
22

Возможно, этот вопрос слишком широк для однозначного ответа. Глобальная переменная $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.

5 дек. 2014 г. 12:48:47
Комментарии

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

akmur akmur
5 дек. 2014 г. 14:32:51

Спасибо за четкий ответ, это было очень полезно и будет полезно в дальнейшем. Наиболее важной информацией для меня было: "Обращайтесь к глобальной переменной $post напрямую только если вы не можете получить нужную информацию через существующие функции."

Radmation Radmation
6 апр. 2021 г. 20:33:29
1

Я уже писал пару постов на эту тему, но, возможно, они содержали неполную информацию, так как данный вопрос затрагивает некоторые другие аспекты. Также я задавал вопрос, который вы можете посмотреть здесь, с отличным ответом от @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. в указанном вопросе.

5 дек. 2014 г. 14:47:09
Комментарии

Спасибо, хороший ответ. Не уверен, какой выбрать как правильный, они одинаково хороши

akmur akmur
5 дек. 2014 г. 16:15:00