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

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

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

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

Я понимаю, что глобальная почта может быть полезна, если я работаю над fuction в functions.php. Это единственный случай использования?

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

Solutions Collecting From Web of "Когда использовать глобальные $ post и другие глобальные переменные?"

Это, возможно, слишком широкий вопрос, чтобы хорошо ответить. $post global можно использовать разными способами. Независимо от того, следует ли его использовать, зависит от каждого обстоятельства.

Однако, насколько я понимаю, основной целью $post global является его использование в файлах шаблонов тем.

Когда вы используете функции the_title() или the_content() или the_author() или любую из очень многих функций шаблона, WordPress ищет эту информацию в $post global. Как правило, при работе в файлах шаблонов вы всегда будете хотеть использовать эти функции шаблона, такие как get_the_ID() , вместо прямого доступа к $post->ID .

Поэтому, если вы хотите лучше понять глобальную статью $post , вам следует прочитать, как работает Loop в WordPress, особенно в файлах шаблонов. Когда Loop запускает the_post() , он устанавливает глобальное значение с текущим элементом.

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

Если вы хотите получить дополнительные сообщения за пределами основного цикла, например, в вашем файле functions.php , вы должны запустить свой собственный WP_Query , инициировать цикл и затем использовать функции шаблона. Получайте доступ только к $post global напрямую, если вы не можете получить доступ к необходимой вам информации с помощью существующей функции.

Когда вы закончите цикл своего собственного WP_Query , вы обнаружите, что глобальный WP_Query $post теперь застревает в вашем пользовательском запросе. Так, например, на нашем шаблоне с одной страницей, после нашего настраиваемого цикла, у нас больше не может быть установлена ​​текущая страница в $post . Вы можете восстановить $post global в прежнее состояние с помощью wp_reset_query . Это абсолютно важно, иначе вы можете сломать другие плагины или темы, которые ожидают первоначальный $post global.

Я сделал пост или два на этом, что, возможно, не было никакой информации, поскольку этот вопрос решает некоторые другие проблемы. Я также задал вопрос, который вы можете проверить здесь с отличным ответом от @GM

В принципе, $post global устанавливается $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 ) // loop has just started 3686            /** 3687             * Fires once the loop is started. 3688             * 3689             * @since 2.0.0 3690             * 3691             * @param WP_Query &$this The WP_Query instance (passed by reference). 3692             */ 3693            do_action_ref_array( 'loop_start', array( &$this ) ); 3694 3695        $post = $this->next_post(); 3696        setup_postdata($post); 3697    } 3698 

Из этого вы также получите ответ на свой вопрос о том, почему вы получаете последнее сообщение как $post на странице архива (и, если на то пошло, на любой странице). $post всегда эффективно устанавливается на последнее сообщение в возвращаемом массиве $wp_query->next_post() через $wp_query->next_post()

Вы должны быть очень осторожны с использованием этого глобального вне цикла, поскольку пользовательские запросы и некоторые функции могут получить к нему доступ и изменить его значение, как описано в связанной записи. Это одна из причин, по которой вы всегда должны перезапускать postdata из нового экземпляра WP_Query . query_posts также нарушает этот глобальный, поскольку он разбивает основной запрос, по одной причине, почему query_posts следует избегать любой ценой

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

В заключение, поскольку $post global является одним из самых ненадежных глобальных переменных, которые могут быть очень легко модифицированы функциями, я бы предложил использовать рекомендации @GM. В связанном вопросе