查询在过滤CPT B的“子”帖子时查找CPT A的“父”帖子

时间:2017-01-11 作者:Mark Kaplun

假设我们有两个CPT,一个是城市,另一个是餐厅。每家餐厅位于一个城市(duh),提供不同类型的食物、不同的时间、不同的价格等。每家餐厅在“城市”元字段中都有城市的post ID,其余的属性都在其他元字段中。

我的目标是能够做到像“获取所有周日开放意大利餐厅的城市”,并按城市分页。

这显然需要扩大规模,因为每个国家都有许多城市和餐馆。(是的,这个类比实际上是DB将要达到的规模)

我想到的一种方法是搜索餐厅,然后按城市对其进行分组,但这听起来像是一种很容易在琐碎的搜索中溢出内存的东西(所有周一开业的餐厅)。

基本上,我正在寻找一种连接两个查询的方法,但欢迎任何其他想法

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

这些元查询将非常昂贵,而找出答案并对其进行缓存是一个糟糕的解决方案,那么为什么不从根本上解决问题并调整数据结构呢?

您的核心数据类型是餐厅,您希望进行筛选/查询,以便使用分类法,那么为什么不使用位置/城市分类法呢?仅仅因为你有一个城市帖子类型并不意味着你不能同时添加一个城市或地区分类法。通过以下方式分层构建itcontinent -> country -> province -> city.

现在,您的搜索是对具有tax_query 指定城市的。对一个省/国家的每个儿童学期都这样做,你就会得到你想要的。

顺便说一句,这仍然无法避免元查询,这是您将面临的最大性能问题。当前存储为post-meta的任何内容,如果要让用户根据其进行过滤或搜索,都需要有一个分类法,或者有一个等效的分类法。E、 g.对于价格,您可能会列出“每人10-20欧元”等范围,然后让用户按此进行搜索,而不是输入精确的值。

因此,最终结果将为您提供:

一个页面,当在位置分类法中给定一个术语时,该页面会获取最深的子术语,然后对每个子术语进行循环,它会查询该术语中与其他搜索参数匹配的餐厅,由于性能原因,最多有4到5家餐厅,如果找到任何餐厅,将显示术语/城市的标题,并显示搜索结果和指向完整结果页的链接,我还建议以下事项:

使用pre_get_posts, 这将为您提供免费分页,只需将搜索UI放在模板的顶部,如果您可以将分类法存档用于城市/位置分类法,那就更好了

做出用户体验决策,以帮助您改变用户可以搜索的内容,但不要拒绝用户的需求。E、 g.让用户选择一个或多个预定义的价格范围,而不是给他们一个接受任何数字的输入框(滑块可以捕捉到最接近的5欧元,将价格元查询转变为提及多个术语的更快的分类查询)

SO网友:prosti

如果您需要城市:

中的注释meta_value 您可以添加任何内容。。。

meta_id bigint(20) unsigned Auto Increment   
post_id bigint(20) unsigned [0]  
meta_key    varchar(255) NULL    
meta_value  longtext NULL
您可以拥有元值it 对于意大利,您可以在另一个元上设置CityID。

分页基于$wp_query 全球的因此,为了进行分页,您只需要执行query_posts 在搜索模板末尾和分页功能之前,请确保分页链接正确。

这方面的论据query_posts 必须包括您在搜索餐厅时获取的所有城市ID。

如果您需要餐厅,并且城市和餐厅都是CPT,您可以创建两个查询,或一个嵌套查询来获取所有意大利城市ID,通过查询\'fields\' => \'ids\' 参数

然后让所有餐厅都有城市IN 这些ID的列表。

这听起来很简单。

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post