我在使用插件 SportsPress 中的自定义页面类型时遇到问题。有时,这些帖子的页面会显示为“空白”帖子。好像是断断续续的。 在深入研究该插件时,他们使用以下函数连接到“the_posts”过滤器:
public function display_scheduled_events( $posts ) {
global $wp_query, $wpdb;
if ( is_single() && $wp_query->post_count == 0 && isset( $wp_query->query_vars['sp_event'] ) ) {
$posts = $wpdb->get_results( $wp_query->request );
}
return $posts;
}
如果我在行之前记录 $posts
$posts = $wpdb->get_results( $wp_query->request );
,我会得到一个完全形成的帖子对象:
Array
(
[0] => WP_Post Object
(
[ID] => 53851
[post_author] => 367
[post_date] => 2023-08-09 19:00:00
[post_date_gmt] => 2023-08-09 18:00:00
[post_content] =>
[post_title] => My post title
[post_excerpt] =>
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => 53851
[to_ping] =>
[pinged] =>
[post_modified] => 2023-08-15 21:08:18
[post_modified_gmt] => 2023-08-15 20:08:18
[post_content_filtered] =>
[post_parent] => 0
[guid] => https://my-website.co.uk/?post_type=sp_event&p=53851
[menu_order] => 0
[post_type] => sp_event
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
)
但是当我在该行之后记录 $posts 时,这就是它包含的内容:
Array
(
[0] => stdClass Object
(
[ID] => 53851
)
)
如您所见,该帖子不是预定/未来的帖子。我一直无法在本地复制,这表明它可能是环境问题。 WordPress 中发生了什么,因为它返回了似乎是骨架对象的内容?
您遇到的问题似乎与 SportsPress 插件的
WP_Query
函数如何修改 display_scheduled_events()
对象有关。
让我们来分析一下发生了什么:
display_scheduled_events()
函数已挂接到the_posts
过滤器中。此过滤器允许在将数据库查询返回的帖子对象数组传递给模板之前对其进行修改。
在此函数中,它检查当前页面是否是单个帖子 (
is_single()
) 以及查询中的帖子计数是否为零 ($wp_query->post_count == 0
)。此外,它还会检查查询是否针对名为 sp_event
(isset( $wp_query->query_vars['sp_event'] )
) 的自定义帖子类型。
如果满足所有这些条件,它会将 posts 数组替换为使用
$wpdb->get_results( $wp_query->request )
直接从数据库获取的结果。这意味着它绕过了一些用于检索帖子的默认 WordPress 机制。
问题似乎是在更换完成后发生的。在替换之前,
$posts
数组包含完全形成的WP_Post
对象。但是,替换后,它包含仅具有 ID 属性的 stdClass 对象。
这表明
$wpdb->get_results()
调用或 SQL 查询本身中的某些内容可能会导致问题。在某些情况下,查询可能不会返回预期结果,从而导致 post 对象不完整。
要进一步排除故障,您可能需要:
$wp_query->request
) 并确保其正确。如果您无法在本地复制问题,则可能确实是环境问题,可能与服务器配置、数据库设置或其他因素的差异有关。在这种情况下,可能需要在不同的环境中进行测试或向插件开发人员寻求帮助。