@toscho向this answer 这让我再次思考。我们应该在全球范围内有多大的信任,特别是对于像$post
?
那又怎样?在检查运行之前,可以覆盖所有人的全局变量。这就是全局变量的要点:全局访问。
$post
例如,它肯定是大多数在主题本身内或通过插件修改的全局变量之一。然而,它也是在给定模板内的其他应用程序中最常用的全局应用程序,例如,用于设置相关帖子。
回答(和评论)几个有具体问题的帖子caused by the use of custom queries, 最突出的是,大多数问题都是由于未重置自定义查询(自定义查询更改主查询设置的全局值)而导致的。
由此看来,很明显$post
不可靠。任何使用自定义查询的写得不好的代码都会改变$post
这反过来又会破坏一些东西(比如相关的帖子)。
实际上,只有少数WordPress开发人员对core的内部工作有足够的了解,知道应该避免什么和不应该避免什么。更多的用户不知道WordPress核心是如何运行的。
他们只需下载一个主题并安装插件即可完成所需操作,甚至只需复制教程中的代码即可。如果他们安装了一个写得很差的插件,在一篇文章中打断了他们的相关文章,他们怎么知道是什么原因造成的?他们能自己解决这个问题吗?或者他们是第一百个就这个问题向主题作者发送电子邮件的人,还是在这个网站上发布问题的人?
My question: 当一个全局$post
这么不可靠?我们应该使用一个全局like$post
完全有哪些替代方案?
在结束之前,我想在这里分享一下我的想法:我已经想到(也在一些主题和插件中看到)使用wp_reset_postdata()
或wp_reset_query()
使用前$post
, 确保将全局查询重置为主查询的$post
. 但为什么我要在我的主题中夸大我的代码,因为其他人没有正确地编写他的插件?如果有人正确地重置了自定义查询,则此操作将不必要地再次运行,这是不好的。
我想到的第二种方法是利用$wp_query
然后使用它的方法,比如$wp_query->post
.
对此有任何想法都将不胜感激。
最合适的回答,由SO网友:gmazzap 整理而成
有一个可悲的事实:你永远无法确定某些代码不会破坏你的代码,而且nothing 你可以采取措施防止这种情况发生。尤其是在WordPress中everything 是全球性的。
也就是说,是的,全球$post
是最常用的全局var之一,因此对其使用特殊护理是一个好主意。
在我的代码中,我很少直接访问全局$post
.
在中时singular 竞赛,我使用get_queried_object()
通常检查一下$post
是有效的WP_Post
实例:
$post = get_queried_object();
if ( ! $post instanceof \\WP_Post ) {
die( \'What the f**k?!\' );
}
在我接触到的极少数情况下,我也会进行检查
$post
直接地
考虑一下get_queried_object()
如果某些代码使用query_posts
, 但是,如果有人使用的代码依赖于query_posts
, 如果他们的网站出现问题,他们就应该受到惩罚:)
此外,如果我期望某些条件,我会检查它们,例如特定的职位类型或特定的状态。
如果我需要在更多地方进行更多检查,我会创建一个函数来执行这些检查:
function get_global_post() {
global $post;
if (
! $post instanceof \\WP_Post
|| ! $post->post_type === \'mycpt\'
|| ! in_array( $post->post_status, array( \'publish\', \'private\' ), true )
) {
return false;
}
return $post;
}
$mypost = get_global_post();
if ( ! $mypost ) {
die( \'What the f**k?!\' );
}
在自定义查询中,循环时,调用
the_post()
重置post对象,因此应该可以。那我有责任打电话
wp_reset_postdata()
在自定义查询之后,我当然会这样做:)