我们应该相信《环球邮报》吗?

时间:2014-11-07 作者:Pieter Goosen

@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.

对此有任何想法都将不胜感激。

1 个回复
最合适的回答,由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() 在自定义查询之后,我当然会这样做:)

结束

相关推荐

管理菜单中的jQuery POST方法

我正在尝试使用这个:jQuery(document).ready(function(){ jQuery(\"#button\").click(function(){ jQuery.post(\"post_file.php\") }); }); 我的地址。com/wp管理员/管理员。php?页面=pluginname/pluginfile。php\\u pluginfunction但它打开的是:myaddress。com/wp管理员/