从所有帖子中获取 ACF 转发器字段值,按子字段排序
Posted
技术标签:
【中文标题】从所有帖子中获取 ACF 转发器字段值,按子字段排序【英文标题】:Get ACF repeater field values from all posts, sorted by a sub-field 【发布时间】:2021-12-10 23:51:38 【问题描述】:我有一个带有 2 个子字段的 ACF 转发器字段(出版物)。title
和 year
。
我需要从数据库中选择符合条件的所有帖子的所有标题(假设所有包含“搜索词”的标题),但我需要按年份排序的结果(第二个子字段)。
这是我用来获取标题的查询。
function get_search_results(): array
global $wpdb;
$sql = "SELECT pm.meta_value title, pm.post_id post
FROM $wpdb->posts p
JOIN $wpdb->postmeta pm ON p.ID = pm.post_id
WHERE p.post_status = 'publish'
AND pm.meta_key LIKE 'publication_%_title'
AND pm.meta_value LIKE '%search-term%';";
return $wpdb->get_results($sql, ARRAY_A);
如何按年份对结果进行排序?
【问题讨论】:
请打印结果并更新相关问题。 检查这个答案 - ***.com/questions/16319363/… 您需要为年份添加另一个联接并按其排序。 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 谢谢大家。要回答这个问题,您必须熟悉 ACF 以及它在数据库中存储转发器字段信息的方式。那么问题(和问题)就会清楚了。 【参考方案1】:这是我想出的解决方案。 只有 2 个 SQL 查询。
function get_search_results(): array
global $wpdb;
// Get publication titles.
$sql = "SELECT pm.meta_key, pm.meta_value title, pm.post_id researcher
FROM $wpdb->posts p
JOIN $wpdb->postmeta pm ON p.ID = pm.post_id
WHERE p.post_status = 'publish'
AND pm.meta_key LIKE 'publication_%_title'
AND pm.meta_value LIKE '%search-term%';";
$titles = $wpdb->get_results($sql, ARRAY_A);
// Get list of post IDs.
$researcher_ids = implode(', ', array_unique(array_column($titles, 'researcher')));
// Get publication years.
$sql = "SELECT REPLACE(pm.meta_key,'_year','_title') AS meta_key, pm.meta_value year, pm.post_id researcher
FROM $wpdb->posts p
JOIN $wpdb->postmeta pm ON p.ID = pm.post_id
WHERE p.post_status = 'publish'
AND pm.meta_key LIKE 'publication_list_%_year'
AND pm.post_id IN ($researcher_ids);";
$years_raw = $wpdb->get_results($sql, ARRAY_A);
$years = [];
// Reformat the publication years.
foreach ($years_raw as $year)
$years[$year['researcher'] . '__' . $year['meta_key']] = $year['year'];
// Add the year field to each title.
foreach ($titles as &$title)
$title['year'] = $years[$title['researcher'] . '__' . $title['meta_key']];
// Sort the array by the inner year value.
usort($titles, 'sortByInnerYear');
return $titles;
function sortByInnerYear($a, $b): int
return $b['year'] <=> $a['year'];
【讨论】:
以上是关于从所有帖子中获取 ACF 转发器字段值,按子字段排序的主要内容,如果未能解决你的问题,请参考以下文章
从 Wordpress 中自定义帖子类型的类别中获取 ACF 文本字段值
Wordpress ACF 字段如何从自定义帖子类型中获取选项