get_results 返回仅包含帖子 ID 的对象

问题描述 投票:0回答:1

我在使用插件 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 中发生了什么,因为它返回了似乎是骨架对象的内容?

php wordpress
1个回答
0
投票

您遇到的问题似乎与 SportsPress 插件的

WP_Query
函数如何修改
display_scheduled_events()
对象有关。

让我们来分析一下发生了什么:

  1. display_scheduled_events()
    函数已挂接到
    the_posts
    过滤器中。此过滤器允许在将数据库查询返回的帖子对象数组传递给模板之前对其进行修改。

  2. 在此函数中,它检查当前页面是否是单个帖子 (

    is_single()
    ) 以及查询中的帖子计数是否为零 (
    $wp_query->post_count == 0
    )。此外,它还会检查查询是否针对名为
    sp_event
    (
    isset( $wp_query->query_vars['sp_event'] )
    ) 的自定义帖子类型。

  3. 如果满足所有这些条件,它会将 posts 数组替换为使用

    $wpdb->get_results( $wp_query->request )
    直接从数据库获取的结果。这意味着它绕过了一些用于检索帖子的默认 WordPress 机制。

问题似乎是在更换完成后发生的。在替换之前,

$posts
数组包含完全形成的
WP_Post
对象。但是,替换后,它包含仅具有 ID 属性的 stdClass 对象。

这表明

$wpdb->get_results()
调用或 SQL 查询本身中的某些内容可能会导致问题。在某些情况下,查询可能不会返回预期结果,从而导致 post 对象不完整。

要进一步排除故障,您可能需要:

  1. 检查正在执行的 SQL 查询 (
    $wp_query->request
    ) 并确保其正确。
  2. 验证数据库中的数据是否一致,没有任何异常。
  3. 考虑添加更多日志记录或调试语句来跟踪数据流并识别任何潜在问题。
  4. 在不同的环境中测试插件,看看问题是否一致或者是否特定于某些设置。

如果您无法在本地复制问题,则可能确实是环境问题,可能与服务器配置、数据库设置或其他因素的差异有关。在这种情况下,可能需要在不同的环境中进行测试或向插件开发人员寻求帮助。

© www.soinside.com 2019 - 2024. All rights reserved.