@toscho оставил комментарий к этому ответу, который заставил меня задуматься. Насколько мы должны доверять глобальному охвату, особенно в отношении почтовых глобалов, таких как $post
?
Ну и что? Глобальная переменная может быть перезаписана всеми перед выполнением проверки. В этом суть глобальных переменных: глобальный доступ.
$post
например, это, безусловно, один из глобалов, который в основном изменяется либо в самой теме, либо с помощью плагинов. Тем не менее, он также является глобальным, наиболее часто используемым в других приложениях в данном шаблоне, например, для настройки связанных постов.
Из ответов (и комментирования) нескольких сообщений с конкретными проблемами, вызванными использованием пользовательских запросов , действительно выделяется то, что большинство проблем вызвано тем, что пользовательские запросы не сбрасываются (пользовательские запросы изменяют глобальные переменные, установленные основным запросом).
Из этого видно, что $post
это не надежно. Любой плохо написанный фрагмент кода, который использует пользовательский запрос, может изменить $post
глобальный, что, в свою очередь, что-то сломает (например, связанные посты).
Лишь немногие разработчики WordPress достаточно хорошо разбираются во внутренней работе ядра и знают, чего следует избегать, а что нет. Большая часть пользователей понятия не имеет, как работает ядро WordPress.
Они просто загружают тему и устанавливают плагины, чтобы делать то, что нужно, или даже просто копируют код из учебника. Скажем, они устанавливают плохо написанный плагин, который ломает связанные с ними посты в одном посте, как они узнают, что вызвало это? Удастся ли им разобраться с этим самостоятельно, или это будет сотый человек, который напишет электронное письмо автору темы об этой проблеме или разместит вопрос на этом сайте?
Мой вопрос: как вы можете защитить себя от таких проблем, вызванных другим импортированным кодом, когда глобальное подобное $post
настолько ненадежно? Должны ли мы использовать глобальный, как $post
на всех? Какие есть альтернативы?
Просто чтобы поделиться своим мнением здесь, прежде чем я сделаю вывод: я подумал (и видел в некоторых темах и плагинах тоже) , что нужно использовать wp_reset_postdata()
или wp_reset_query()
перед использованием $post
, чтобы убедиться, что глобальный объект сбрасывается на главный запрос $post
. Но почему я должен раздувать свой код в моей теме, потому что кто-то еще не правильно кодировал его плагин? И если кто-то правильно сбросил свой пользовательский запрос, эта операция запускается ненужный второй раз, что не очень хорошо.
Второй метод, о котором я подумал, - это использовать, $wp_query
а затем использовать его методы, что-то вроде $wp_query->post
.
Любые мысли по этому поводу будут оценены.