如何获取所有文章的ACF repeater字段值并按year子字段排序
修改后的实现代码
function get_search_results(): array { global $wpdb; $sql = "SELECT pm.meta_value title, pm.post_id post, pm_year.meta_value year FROM {$wpdb->posts} p -- 关联查询title子字段 JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id -- 关联查询同一repeater行对应的year子字段 JOIN {$wpdb->postmeta} pm_year ON p.ID = pm_year.post_id -- 匹配同一行索引:提取publication_{x}_title中的x,和publication_{x}_year的x对应,避免匹配错位 AND SUBSTRING_INDEX(SUBSTRING_INDEX(pm.meta_key, '_', 2), '_', -1) = SUBSTRING_INDEX(SUBSTRING_INDEX(pm_year.meta_key, '_', 2), '_', -1) WHERE p.post_status = 'publish' AND pm.meta_key LIKE 'publication_%_title' AND pm.meta_value LIKE '%search-term%' AND pm_year.meta_key LIKE 'publication_%_year' -- 按year排序,转为数值类型避免字符串排序异常,如需倒序把ASC改为DESC即可 ORDER BY CAST(pm_year.meta_value AS UNSIGNED) ASC;"; return $wpdb->get_results($sql, ARRAY_A); }
核心改动说明
- 新增一次
postmeta表的关联查询,用来获取和匹配到的title属于同一repeater行的year值 - 通过
SUBSTRING_INDEX提取repeater的行索引数字,确保title和year的配对关系正确,不会出现跨行匹配的问题 - 排序时用
CAST将year的存储值转为数值类型,避免字符串格式的数字出现10 < 2这类异常排序结果
内容的提问来源于stack exchange,提问作者Baras
相关产品推荐
相关产品推荐

