这些元查询将非常昂贵,而找出答案并对其进行缓存是一个糟糕的解决方案,那么为什么不从根本上解决问题并调整数据结构呢?
您的核心数据类型是餐厅,您希望进行筛选/查询,以便使用分类法,那么为什么不使用位置/城市分类法呢?仅仅因为你有一个城市帖子类型并不意味着你不能同时添加一个城市或地区分类法。通过以下方式分层构建itcontinent -> country -> province -> city
.
现在,您的搜索是对具有tax_query
指定城市的。对一个省/国家的每个儿童学期都这样做,你就会得到你想要的。
顺便说一句,这仍然无法避免元查询,这是您将面临的最大性能问题。当前存储为post-meta的任何内容,如果要让用户根据其进行过滤或搜索,都需要有一个分类法,或者有一个等效的分类法。E、 g.对于价格,您可能会列出“每人10-20欧元”等范围,然后让用户按此进行搜索,而不是输入精确的值。
因此,最终结果将为您提供:
一个页面,当在位置分类法中给定一个术语时,该页面会获取最深的子术语,然后对每个子术语进行循环,它会查询该术语中与其他搜索参数匹配的餐厅,由于性能原因,最多有4到5家餐厅,如果找到任何餐厅,将显示术语/城市的标题,并显示搜索结果和指向完整结果页的链接,我还建议以下事项:
使用pre_get_posts
, 这将为您提供免费分页,只需将搜索UI放在模板的顶部,如果您可以将分类法存档用于城市/位置分类法,那就更好了分类法分类法分类法,不要使用后期元查询。如果这样做,此页面的可扩展性和性能将显著下降。一个单一的元查询可能会导致流量过大的网站瘫痪,如果你在这里为每个城市都做一个元查询,那么这个页面的加载将需要很长时间。最后,考虑一下,仅仅因为你可以查询这个,并不意味着你应该这样做。对于具有快速页面加载的高效数据结构,您需要确定哪些约束是可以接受的。数据越自由,查询的成本就越高,或者需要复制和近似的数据就越多。如果你想查询任何东西,有时你需要弹性搜索来获得平庸的性能。
做出用户体验决策,以帮助您改变用户可以搜索的内容,但不要拒绝用户的需求。E、 g.让用户选择一个或多个预定义的价格范围,而不是给他们一个接受任何数字的输入框(滑块可以捕捉到最接近的5欧元,将价格元查询转变为提及多个术语的更快的分类查询)