UPDATE_POST_(META/TERM)_CACHE说明

时间:2016-01-27 作者:Howdy_McGee

我在读一些best practices from 10up 他们提到在WP\\U查询中将这两个标志设置为false(取决于您查询的内容):

  • \'update_post_meta_cache\' => false: 不使用post meta时很有用
  • \'update_post_term_cache\' => false: 在不使用分类术语时有用update_post_caches() 但我甚至不能百分之百确定这意味着什么。谁能解释一下这两个标志在WP_Query 它们有多有用?信息越多越好,因为我不太了解WordPress是如何缓存东西的,但关于这两个标志的经过深思熟虑的答案也是可以接受的。

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

WordPress尝试尽可能减少数据库查询的数量。

例如,在查询数据库之前,每当您获得一个元字段或分类字段时,WordPress都会查看该字段是否已被查询并存储在缓存中,然后从那里返回它,而不是查询数据库。

“缓存作业”通过WP_Object_Cache class and wp_cache_* functions (它们是该类方法的包装器。)

默认情况下,“cache”只不过是一个PHP全局变量。这意味着它在内存中,但也意味着它在每次请求时都会消失。

但是,通过dropins(advanced-cache.php 和/或object-cache.php), 可以设置一种自定义方式来处理此缓存。

通常,这个dropins用于设置某种缓存机制,以“生存”单个请求。

因此,在WP的人中,这些被称为“持久缓存”插件(即使在气泡之外,“缓存”和“持久”这两个词在一起也没有多大意义)。

现在流行的选择是MemcachedRedis.

因此,使用“持久缓存”插件可以大大减少数据库查询的数量,因为缓存不会在每次请求时更新。

一些示例

$foo = get_post_meta(\'foo\', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta(\'bar\', $post_id, true);
上面的2行代码将最多触发1个数据库查询。

事实上,当您查询一个自定义字段时,该帖子的所有字段都是从数据库中检索出来的,通过对象缓存进行缓存,随后的请求从缓存而不是从数据库中提取数据。

分类法术语也会发生同样的情况,WordPress一次提取一个分类法的所有术语,然后从缓存中返回它们。

对象缓存在WordPress中使用非常广泛。不仅适用于帖子、元值和分类法,还适用于用户、评论、主题数据。。。

什么WP_Query 这一切都有关系吗

当您通过WP_Query, 默认情况下,WordPress不仅从数据库(或从缓存中提取,如果缓存了),而且updates the cache for all custom fields and all taxonomies 与所拉岗位相关。

例如,当你打电话时,get_the_terms()get_post_meta() 在循环帖子时通过WP_Query, 实际上,您不会触发任何数据库查询,而是从缓存中提取信息。

很好,不是吗

WordPress在通过WP_Query 发生在update_meta_cache 对于meta和inupdate_object_term_cache 用于分类。

如果你看一下这些函数的源代码,你会发现WordPress在每个函数中只执行一个db查询,但也进行了大量处理。例如,在update_object_term_cache7 nested foreach... 如果您有很多分类法,并且每页的帖子数量很高,那么这并不是很好。

关于那些WP_Query 参数,最后是什么\'update_post_meta_cache\'\'update_post_term_cache\' 设置为时执行false 是为了防止WordPress分别为自定义字段和分类更新缓存。

在这种情况下,第一次查询自定义字段或分类时,会触发数据库查询,并缓存数据。

值得这么麻烦吗

像往常一样,答案是it depends. 大多数情况下,将这些值设置为false, 是一个不错的选择,因为它可以防止不必要的处理和数据库查询(如果不需要的话),而且缓存在第一次需要自定义字段/分类术语时都会更新。

然而,如果你要打电话,哪怕是一次,get_post_meta() 在循环过程中,您将调用get_the_terms() 对于POST支持的所有(或大多数)分类法,无论如何都会触发缓存更新,将这些查询参数设置为false.

SO网友:Mark Kaplun

这里的主要兴趣点是update_post_caches 作用它是在WP\\u Query从DB获得所有帖子后调用的。通常,您希望帖子放在首位的原因是显示它们,这通常意味着显示术语和基于元数据的内容,因此WP\\u Query默认情况下也会查询数据库中与返回帖子相关的元数据和术语数据,并将其存储在缓存中*。此信息在WP\\U查询返回的数据中不明确可用,但当您调用相关API以获取特定帖子的术语和元信息时,它将已在内存中可用,无需向DB发送新查询。

这使得wordpress能够通过只发送一个请求来获取所有帖子的信息,而不是每个帖子发送一个请求,从而减少向DB发送请求的相关开销。

现在,我找不到任何关于何时不想更新缓存的非平凡示例,但如果您只想获得所有帖子标题的列表,则可能是一个平凡的示例。为此,您不需要术语或元数据。

*缓存-这里最重要的是基于内存的缓存,WP在其中存储几乎所有它从DB获得的内容,即使没有任何对象缓存插件处于活动状态。显然,当您有对象缓存时,信息也会存储在那里。

相关推荐

GET_THE_TERMS与wp_GET_POST_TERMS中的奇怪结果

我正在尝试制作一个面包屑函数,但有一个小问题。。。使用时:$categories = get_the_terms( $post->ID, \'product_cat\' ); 我得到了一个循环中使用的类别数组,等等。唯一的问题是它是按字母顺序排列的。(我希望它按层次顺序排列。)经过一番挖掘,我发现了一种替代方法,即使用wp\\u get\\u post\\u terms(),但我肯定遗漏了一些东西,因为当我使用此方法时:$categories = wp_get_post_terms( $p