$post
这样的全球后继者呢?那么呢?可以在运行检查之前从所有人覆盖全局变量。这就是全局变量的意义:全局访问。例如,
$post
无疑是在主题本身或通过插件进行大部分修改的全局变量之一。但是,它还是给定模板内其他应用程序中最常用的全局设置,例如,用于设置相关帖子。 通过回答(和评论)由使用自定义查询引起的特定问题的几篇文章,确实突出了大多数问题是由于未重置自定义查询引起的(自定义查询改变了全局变量由主查询设置)。
由此看来,
$post
不可靠。使用自定义查询的任何编写不佳的代码段都可以更改$post
全局变量,从而会破坏某些内容(如相关文章)。只有少数WordPress开发人员实际上足够了解核心的内部运作方式,知道应该避免什么,不应该避免什么。越来越多的用户不知道WordPress核心如何运行。
他们只是下载主题并安装插件即可完成所需的工作,甚至只是从教程中复制代码。假设他们安装了一个写得不好的插件,该插件会在单个帖子上打断相关帖子,那么他们怎么知道是什么原因造成的呢?他们将能够自己解决问题,还是成为第一个人就此问题写信给主题作者或在此网站上发布问题?
我的问题:如何保护自己当像
$post
这样的全局变量如此不可靠时,应对其他导入代码引起的此类问题?我们是否应该完全使用像$post
这样的全局变量?有哪些替代方案?在总结之前,请先在这里分享我的想法:在使用
wp_reset_postdata()
之前,我已经考虑过使用wp_reset_query()
或$post
(并且在某些主题和插件中也看到过),以确保将全局设置重置为主查询的$post
。但是为什么我应该在主题中添加代码,因为其他人没有正确地为其插件编写代码?而且,如果有人确实重置了自定义查询,则该操作将不必要地第二次运行,这是不好的。 我想到的第二种方法是先使用
$wp_query
,然后再使用其方法,例如$wp_query->post
。对此的任何想法都将不胜感激。
#1 楼
有一个可悲的事实:您永远无法确定某些代码不会破坏您的代码,并且您无能为力。尤其是在所有内容都是全局的WordPress中。那是的,全局
$post
是使用最广泛的全局变量之一,因此对此特别注意可能是一个好主意。在我的代码中,我很少直接访问全局
$post
。在单个竞赛中,我使用
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()
,我当然会这样做:)
评论
重置帖子只是将一个var复制到另一个var中,您可以在代码中调用该变量一百万次,并且看不到性能受到影响,因此我不知道这有什么不好。