EP081. “按关联关系搜索(Professor 硬编码版)”
🔒 登录后可标记已读📌 并入 EP080 的提醒:下一讲会看到旧版 WordPress 编辑页面截图(当时录制用的是经典编辑器),但到 EP082 结尾会把 Program 文章类型的 supports 数组里的 editor 项移除——WordPress 发现文章类型不支持 editor 时,会自动退回经典编辑页面,所以画面对不上不是操作问题。
这一讲开始做「按关联关系搜索」:目前搜索 biology 只能匹配标题/正文含有 biology 字样的文章,但教授、活动是靠 ACF 关联字段(存的是文章 ID,不是文字)绑定到 Program 的,所以永远搜不到。作者示范了一种「从后往前推」的思路:先不管动态判断逻辑,直接写死查 ID 为 97(biology 项目的 ID)的教授关联查询,确认整个查询链路能跑通,再考虑动态化(下一讲)。这一讲还顺手解决了两次查询导致同一篇教授文章重复出现的问题。
涉及文件
wp-content/themes/fictional-university-theme/inc/search-route.php(修改)
代码实现
在 search-route.php 原本的主查询(关键词查询)结束、return 结果之前,新增第二个查询,按关联字段硬编码查询 biology(ID 97,实际 ID 因每个人网站数据不同而不同)的教授:
// wp-content/themes/fictional-university-theme/inc/search-route.php
// 新增:按关联关系查询教授(本讲先硬编码写死 ID,下一讲改成动态)
$programRelationshipQuery = new WP_Query(array(
'post_type' => 'professor',
'meta_query' => array(
array(
'key' => 'related_programs',
'compare' => 'LIKE',
'value' => '"97"'
)
)
));
while ($programRelationshipQuery->have_posts()) {
$programRelationshipQuery->the_post();
if (get_post_type() == 'professor') {
array_push($results['professors'], array(
'title' => get_the_title(),
'permalink' => get_the_permalink(),
'image' => get_the_post_thumbnail_url(0, 'professorLandscape')
));
}
}
// 新增:去重,避免同一篇教授文章因为同时命中两个查询而重复出现
$results['professors'] = array_values(array_unique($results['professors'], SORT_REGULAR));
关键改动点:
meta_query的key填 ACF 字段的变量名related_programs;compare用LIKE而不是=,因为关联字段实际存的是「数字包在字符串里、又放在数组里」的格式,不是精确匹配value要写成'"97"'(单引号里嵌一对双引号),这是为了匹配 ACF 关系字段在数据库里序列化后的存储格式,跟课程前面第一次写 meta query 时的处理方式一致- 教授关联查询的循环体直接复制了主查询里「if 是 professor 就 push 进
results['professors']」的那段 if 逻辑,没有重新写 - 用
array_unique($arr, SORT_REGULAR)去重,因为关联查询可能命中一篇同时也被关键词查询命中的教授文章;外面再包一层array_values()是为了把去重后出现空洞的数组键重新变成连续的0,1,2...,不然前端遍历/JSON 输出会带着不连续的键名,显得凌乱
[截图:前台搜索 overlay 输入 biology,查看通过 related_programs 关联关系搜出来、且没有跟关键词命中结果重复的教授卡片]
Hook / Function 速查
| 名称 | 类型 | 用途 |
|---|---|---|
WP_Query + meta_query | WP 内建类 | 按自定义字段的值筛选文章,这里用来查「related_programs 关联到某个 ID」的教授 |
array_unique($arr, SORT_REGULAR) | PHP 内建 function | 数组去重,SORT_REGULAR 表示按元素本身(含关联数组)比较,不是简单转字符串比较 |
array_values() | PHP 内建 function | 重新整理数组键名为连续数字,去重后常用来清理键名空洞 |
常见坑
meta_query的value直接写数字97而不是'"97"'(单引号包双引号)——ACF 的关联字段存储格式导致直接用数字匹配不上,具体格式课程前面讲 meta query 时详细解释过- 两个查询(关键词查询 + 关联查询)都可能命中同一篇文章,如果不做去重,前端会看到同一个教授出现两次
延伸 / 后续讲座会用到
这一讲的 ID 97 是写死的,只对搜索 "biology" 有效,下一讲(EP082)会把它改成动态读取当前搜索结果里 Program 的真实 ID。
Sources
Udemy:
- Become a WordPress Developer: Unlocking Power With Code — Section 16, EP081(含 EP080 提醒并入)