用于检索帖子ID、缓存结果并改进wp_Query的函数

时间:2015-05-05 作者:Josh

我希望通过创建一个函数来优化db性能,该函数可以检索特定类别中帖子的ID并缓存结果。因此,不需要像这样的查询:

SELECT … WHERE 1=1  AND wp_posts.ID NOT IN ( 
SELECT tr.object_id FROM wp_term_relationships AS tr INNER JOIN wp_term_taxonomy               
AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = \'category\' AND tt.term_id IN (\'167\') ) …
它变成:

SELECT … WHERE 1=1  AND wp_posts.ID NOT IN ( \'1\',\'2\',\'3\',\'4\',\'5\' ) … 
我已经读到get\\u objects\\u in\\u term()可以用于此。我将如何为wp\\U查询循环构造此循环?

1 个回复
SO网友:s_ha_dum

我读到这篇文章时,作者建议你这样做:

$cats = array(1,2,3,4);
$q = new WP_Query(
  array(
    \'category__not_in\' => $cats
  )
);
var_dump($q->request);
您应该在该转储中看到复杂的默认查询。

$ids = array_unique(get_objects_in_term($cats,\'category\'));
var_dump($ids);
现在,您有了一个用于列出类别的帖子ID数组。

$q2 = new WP_Query(
  array(
    \'post__not_in\' => $ids
  )
);
var_dump($q2->request);
现在您应该看到作者建议的更简单的查询。

如果你查看来源get_objects_in_term() 您将使用与第一个复杂查询的子查询中相同的SQL:

$object_ids = $wpdb->get_col("SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tt.term_id IN ($term_ids) ORDER BY tr.object_id $order");

https://core.trac.wordpress.org/browser/tags/4.2.1/src//wp-includes/taxonomy.php#L608

要从中获得任何收益,您必须缓存$ids. 有两种方法可以做到这一点:1)使用Transient API, 这将为您提供基于时间的缓存,2)另一个是set/update options 例如,发布保存以便更新$ids 在后端和前端,您的代码永远不必担心缓存的新鲜度。

我没有时间写更多的代码,但考虑到可用的核心代码和Codex,缓存部分应该不会太难。

结束

相关推荐

Share WordPress Database

WordPress安装是否必须使用专用数据库?我正在构建一个带有自定义页面的网站,可以访问MySQL数据库。但该网站还将安装WordPress。我可以为WordPress和自定义页面使用相同的唯一数据库吗?