@toscho对这个答案发表了评论,这让我再次思考。我们应该在全球范围内获得多少信任,尤其是对于像$post这样的全球后继者呢?


那么呢?可以在运行检查之前从所有人覆盖全局变量。这就是全局变量的意义:全局访问。例如,$post无疑是在主题本身或通过插件进行大部分修改的全局变量之一。但是,它还是给定模板内其他应用程序中最常用的全局设置,例如,用于设置相关帖子。

通过回答(和评论)由使用自定义查询引起的特定问题的几篇文章,确实突出了大多数问题是由于未重置自定义查询引起的(自定义查询改变了全局变量由主查询设置)。

由此看来,$post不可靠。使用自定义查询的任何编写不佳的代码段都可以更改$post全局变量,从而会破坏某些内容(如相关文章)。

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

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

我的问题:如何保护自己当像$post这样的全局变量如此不可靠时,应对其他导入代码引起的此类问题?我们是否应该完全使用像$post这样的全局变量?有哪些替代方案?

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

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

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

评论

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

#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(),我当然会这样做:)