【问题标题】:Array of IDs returned by wp_querywp_query 返回的 ID 数组
【发布时间】:2015-12-01 19:55:12
【问题描述】:

我正在编写一个插件,插件添加了一个过滤器。过滤器需要根据帖子 ID(自定义表)从数据库中选择一些东西。现在的问题是,如果在有 20 个帖子的循环中,它会运行 20 个查询,这并不是很好。所以我想知道,是否可以做这样的事情:

  1. 在说类别页面上运行 wp_query 之后(但在循环之前),获取它返回的 ID 数组
  2. 使用第 1 步中的数组运行 1 个查询,以获取所有帖子所需的数据并将其存储在全局变量中。
  3. 在过滤器中从全局变量中检索数据,而不是在每次调用过滤器时运行查询。

我想知道是否可以在前端(例如类别存档等页面,基本上所有 in_the_loop() 为真的地方)和后端(帖子列表、页面列表、cpt 列表)都这样做。我用谷歌搜索了唉找不到任何东西。如果有人知道是否有可能实现,请告诉我。

【问题讨论】:

  • 不错的主意,但您会在页面刷新时丢失数据。对象缓存(wp具有内置保存功能,但您需要将其安装在服务器上并放入对象缓存文件,google this)将是一个更好的主意。虽然它有点 ram 密集型,所以另一个选择是设置一个包含所有帖子和所需数据的瞬态(wp 术语)并提供服务。或者使用缓存插件缓存整个 html 页面 = 资源密集度较低。
  • 在页面刷新时丢失数据对我来说很好。只要我可以将它从 N 个查询减少到一个查询,这对我来说已经足够了。你知道这是否可能吗?
  • 一旦数据运行一次,它也取决于您使用的功能,如果没有缓存,则获取 post meta 将保存该值(在变量中),因此任何相同的请求不要进行另一个数据库查询。

标签: wordpress


【解决方案1】:

好的,所以我浏览了核心代码,发现the_posts 似乎是我正在寻找的过滤器。它包含查询返回的所有帖子对象,并且可以在帖子循环之前访问。

可以这样访问:

add_filter('the_posts', 'testtest', '20', 1);

function testtest($posts)
{
    //do some magic here
    return $posts;
}

$posts 是一个 WP_Post_Objects 数组,具有以下键:

[ID]
[post_author]
[post_date]
[post_date_gmt]
[post_content]
[post_title]
[post_excerpt]
[post_status]
[comment_status]
[ping_status]
[post_password]
[post_name]
[to_ping]
[pinged]
[post_modified]
[post_modified_gmt]
[post_content_filtered]
[post_parent]
[guid]
[menu_order]
[post_type]
[post_mime_type]
[comment_count]
[filter]

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2014-06-14
    相关资源
    最近更新 更多