我们是否应该信任全球岗位?


21

@toscho对这个答案发表了评论,让我再次思考。我们应该在全球范围内获得多少信任,特别是对于像post globals这样的人$post

所以呢?全局变量可以在检查运行之前被所有人覆盖。这就是全局变量的意义:全局访问。

$post例如,可以肯定是全局变量之一,该全局变量通常在主题本身内或通过插件进行了修改。但是,它还是给定模板内其他应用程序中最常用的全局设置,例如,用于设置相关帖子。

通过回答(和评论)由使用自定义查询引起的特定问题的多个帖子,实际上可以看出,大多数问题是由于未重置自定义查询引起的(自定义查询会更改主查询设置的全局变量)。

由此可见,这$post是不可靠的。使用自定义查询的任何编写不当的代码段都可以更改$post全局,这反过来会破坏某些内容(如相关文章)。

实际上,只有少数WordPress开发人员对核心的内部运作足够了解,并且知道应该避免什么,不应该避免什么。越来越多的用户不知道WordPress核心如何运行。

他们只是下载主题并安装插件即可完成所需的工作,甚至只是从教程中复制代码即可。假设他们安装了一个写得不好的插件,该插件会在单个帖子上打断相关帖子,那么他们怎么知道是什么原因造成的?他们将能够自己解决问题,还是他们是第一百个人就此问题写信给主题作者或在该网站上发布问题?

我的问题:当全局变量$post如此不可靠时,如何防止其他导入的代码引起的此类问题?我们是否应该使用全局性的$post?有哪些选择?

在总结之前,请在这里分享我的想法:我已经考虑过(或者在某些主题和插件中也看到过)使用wp_reset_postdata()或使用wp_reset_query()之前的情况$post,以确保将全局设置重置为主查询的$post。但是为什么我应该在主题中添加代码,因为其他人没有正确地为其插件编写代码?而且,如果有人确实重置了自定义查询,则该操作将不必要地第二次运行,这是不好的。

我想到的第二种方法是先使用,$wp_query然后再使用其方法,例如$wp_query->post

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


重置帖子只是将一个var复制到另一个var中,您可以在代码中调用该变量一百万次,并且看不到性能受到影响,所以我不知道这有什么不好。
米洛2014年

Answers:


16

有一个可悲的事实:你可以永远确保一些代码,不会打破你的代码,并没有什么可以做,以防止这一点。尤其是在WordPress中,这一切都是全球性的。

这就是说,是的,全球性$post是最常用的全局变量之一,所以使用特殊照顾可能是一个好主意。

在我的代码中,我很少直接访问global $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()在自定义查询后调用,我当然会这样做:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.