【问题标题】:Get ACF repeater field values from all posts, sorted by a sub-field从所有帖子中获取 ACF 转发器字段值,按子字段排序
【发布时间】: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);
    }

如何按年份对结果进行排序?

【问题讨论】:

  • 请打印结果并更新相关问题。
  • 您需要为年份添加另一个联接并按其排序。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • 谢谢大家。要回答这个问题,您必须熟悉 ACF 以及它在数据库中存储转发器字段信息的方式。那么问题(和问题)就会清楚了。

标签: wordpress advanced-custom-fields acfpro


【解决方案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'];
    }

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 2017-05-10
    • 1970-01-01
    • 2020-01-28
    • 2019-03-09
    • 1970-01-01
    • 2015-08-07
    • 2020-05-15
    • 2017-02-22
    相关资源
    最近更新 更多