我读到这篇文章时,作者建议你这样做:
$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,缓存部分应该不会太难。