pre_get_posts
允许您更改查询要检索的内容,但实际上您所做的是:
抓取A、B、C类型的帖子,然后移除所有带有这些ID的帖子,这些ID恰好是B类型的帖子,这时您的最终结果应该是:
A、C型抓杆,为什么不这样做呢?首先,让我们检索要获取的帖子类型列表:
$post_types = $query->get( \'post_type\' );
那就只需要移除
profilepost
从该数组,然后调用
set
:
$query->set( \'post_type\' $post_types );
因此,概括一下:
抓取新变量中的帖子类型列表,修改新列表,将新列表放回查询中,因为中间步骤是通用PHP,我将不介绍它,而是让您参考此Stack Overflow question.
关于的注释post__not_in
这是一个
stupendously 做事慢。避免任何与
NOT
或
__not_in
就像瘟疫一样。即使它在单个页面负载上运行很快,也会给您带来严重的扩展问题,并且随着您添加更多内容,速度会呈指数级降低/成本会更高
总是询问你在寻找什么,永远不要问你不想要什么。
关于使用SQL获取所有帖子和查询内容的说明始终使用WP_Query
为了获取帖子,您的SQL查询总是运行,没有缓存来加快速度。此外,查询是不可伸缩的。这是因为它返回的所有内容都没有分页。当表中有5到6篇帖子时,这可能会很好地工作,但当有100或200篇帖子时,您会遇到问题。
记住,posts表包含的不仅仅是posts和页面,菜单项还包括posts、修订、媒体附件,以及大量用于性能和内部原因的隐藏post类型,用户永远看不到这些类型。还要记住,您的数据库服务器和PHP只有这么多的时间和内存来保存内容。
您需要的是可缓存的小东西,您可以请求很多,而不是需要繁重处理的单个大型查询。这就是为什么设置最大限制总是一个好主意的原因,即使你从未期望达到它,它也会设置最坏的情况。
这也是为什么不在查询和随机顺序中很糟糕的原因,因为DB必须扫描整个表来构建一个新的临时表,其中包含所有您不想删除的内容,只有这样它才能运行实际的查询。然后是清理工作。