Wordpress缓慢的元查询1000多个帖子

时间:2015-01-15 00:38:13

标签: mysql wordpress performance advanced-custom-fields wp-query

问题

就采摘日期而言,WordPress元查询不如常规查询灵活。 WP查询可以按月份编号,工作日名称和许多其他选项选择日期,这些选项非常适合我的需要。

ACF字段

活动日期,结束日期,死亡日期(某些分类标准),“重复(永远,直到)”

基本上我构建了一个元查询,它将获取今天登陆的日期,或者可能重复发生的日期(因此每日,每月和每周),然后我通过比较每周的工作日名称来过滤所有内容,并且每月的天数。我还会检查以确保任何重复发布的帖子在不应该出现时都不会显示。

以下是我一直使用的元查询数组,日期存储为Ymd

'relation' => 'OR', [ 'key' => 'event_date', 'value' => $date->format('md'), 'compare' => 'LIKE', 'type' => 'numeric' ], [ 'key' => 'death_date', 'value' => $date->format('md'), 'compare' => 'LIKE', 'type' => 'numeric' ], [ 'key' => 'how_often', 'value' => array('Daily', 'Monthly', 'Weekly'), 'compare' => 'IN' ]

从透视角度来看,此查询将检索约130个帖子,包括元和其他相关查询,并且在PHP运行后过滤帖子(需要2.5秒!)我留下了78个帖子。

我尝试过什么

我尝试通过针对定期发布的帖子进行更具体的限制来限制查询,例如指定event_date必须<=查询日期,end_date是{ {1}}查询日期或元>=设置为forever。然而,当涉及到每月或每周重复发生时,这无济于事,因为我无法可行地计算这些日期。我已经加载了超过10k的帖子并使用这个自定义元结构。它运行良好,最多约1200个帖子,然后该网站变得非常缓慢。对于要加载的第一个字节,当前有78个帖子的页面大约需要8-12秒。

我已经尝试过缓存这些数据,但有人可能会在日历中的任何一天点击它并且可能不会被缓存,这会导致用户在从网站看到任何内容之前被耽搁8-12秒。 / p>

问题

  1. 通过SQL检索每月和每周定期发布帖子的最佳方法是什么?
  2. 这实际上会加快我的页面加载速度还是会降低它的速度?很明显,随着更多的帖子提出更多的meta查询,但分页并不是这个应用程序的一个选项。

2 个答案:

答案 0 :(得分:0)

  1. 我没有加速查询的解决方案。在WordPress分配大量数据时,它会减慢加载/查询速度。无论你做什么,它仍然会超过2秒+。 (已经很多了。)

  2. 关于缓存选项,您可以构建一个将访问所有链接的机器人,因为日期范围已知,然后问题已解决。类似的东西:(这只是一个例子)

     for($startdate ; $startDate < $endDate ; $startDate=addDayToDate($startDate)){
          file_get_contents($url.$startDate);
     }
    
  3. wp-rocket缓存插件可以选择通过机器人预先缓存页面。所以不需要第一次实际访问该页面来缓存它。关于日历链接,我不知道它是否会访问它们以及是否有办法设置预缓存机器人来访问您的日历链接。如果你能提供一个链接,我可以问他们是否可能。

答案 1 :(得分:0)

对于这么少的帖子,它真的不应该花2.5秒。你需要看一下你的主机。需要注意的事项包括你在这个页面加载的内存使用情况 - 对于PHP迭代超过130个项目并过滤到75个帖子它应该花费几毫秒。

如果您正在使用Apache,请考虑切换到Nginx - 它在内存使用方面要轻得多,如果这是基于内存的减速,您会发现显着的速度提升。