WP_Query中省略post_status参数的小坑

Posted onCategories技术文章

做WordPress主题和插件开发,WP_Query应该是个熟的不能再熟的东西了。然而今天碰到这样一个小坑。

从编辑那边反馈到,公司的某个站上页面上有404页面。费了一番周折发现登录下没问题,登出就是404. 原来之前的开发者在该自定义主题里,有用到WP_Query获取数据,但是呢,他没填post_status参数。

wp-query-without-post-status

Okay,运行了几年都没任何问题,post_status的缺省值就是publish, 乍一看填不填都不是很影响结果。

然而某一天,有另一个人(可能是编辑)在网站上装了一个牛逼的插件叫Oasis Workflow

Oasis Workflow

这就蛋疼了。

这个插件丰富了编辑工作的流程,扩展了WordPress默认的文章状态。也就是说,你可以用这个插件自己去定义符合你工作的状态,而不仅仅限制于WordPress默认的pending和published状态。

wordpress-custom-status

并且在查询了WP_Query文档后,发现有这样一行不起眼的提醒

Default value is 'publish', but if the user is logged in, 'private' is added. Public custom statuses are also included by default.

翻译过来就是,如果不传post_status参数给WP_Query, 该参数默认值就是publish,但是这个默认值是包含设置成public的自定义Post Status的

于是一切都说得通了。
Oasis Workflow注册的自定义post type都是通过register_post_status函数,并且其public参数设置成了true。如下面的例子:

register_post_status( 'unread', array(
  'label'                     => _x( 'Unread', 'post' ),
  'public'                    => true,
  'exclude_from_search'       => false,
  'show_in_admin_all_list'    => true,
  'show_in_admin_status_list' => true,
  'label_count'               => _n_noop( 'Unread <span class="count">(%s)</span>', 'Unread <span class="count">(%s)</span>' ),
));

因此那些被编辑标记成自定义状态的post,即便未发布也在页面上显示了。

这应该算个使用场景比较严苛的小bug。但给plugin和theme作者的启示是:

别瞎j8图省事,把参数都特么的填完整!否则就是坑别人。

1 thought on “WP_Query中省略post_status参数的小坑”

发表评论

电子邮件地址不会被公开。 必填项已用*标注