从所有帖子中获取 ACF 转发器字段值,按子字段排序

Posted

技术标签:

【中文标题】从所有帖子中获取 ACF 转发器字段值,按子字段排序【英文标题】:Get ACF repeater field values from all posts, sorted by a sub-field 【发布时间】:2021-12-10 23:51:38 【问题描述】:

我有一个带有 2 个子字段的 ACF 转发器字段(出版物)。titleyear。 我需要从数据库中选择符合条件的所有帖子的所有标题(假设所有包含“搜索词”的标题),但我需要按年份排序的结果(第二个子字段)。

这是我用来获取标题的查询。

    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 字段如何从自定义帖子类型中获取选项

基于 ACF 转发器子字段自定义分类法查询帖子

获取存储在 DB 中的转发器子字段的所有值

在functions.php中获取相关组的ACF字段值(通过Post Object)

ACF 从父页面获取转发器的子字段