按配置的值对结果集进行排序,然后列出所有剩余结果

时间:2021-10-13 作者:MarkW

我想按国家顺序列出工作(工作是自定义职位类型)。结果集中要优先考虑的国家/地区由WP CMS中的用户定义。首先列出配置的国家,然后我想控制其余行的顺序。

e、 g.如果他们选择“gb”,我希望结果集如下所示:

gb 
gb 
au 
es 
fr 
sw 
sw
我需要使用pre\\u get\\u posts来实现这一点。希望这一切都有意义。

这是我刚刚得到的。为了便于阅读,我硬编码了键/值,而不是显示CMS类/值。

        add_action(
            \'pre_get_posts\',
            function(WP_Query $query) {
                if ($query->is_main_query()) {
                    $country_order = array(
                        \'meta_query\' => array(
                            array (
                                \'key\' => \'job_country\',
                                \'value\' => \'gb\',
                                \'compare\' => \'=\' 
                            )
                        )
                    );
                    $query->set(\'meta_query\', $country_order);
                }
            }
        );
这只返回“gb”,其他的都不返回,我有点纠结于从这里走到哪里。任何帮助都将不胜感激。

更新:根据Tom的评论,这里有一些代码可以在使用$working\\u list按我需要的方式排序后实现我想要的东西。本例中的自定义职位类型为“job”。

        $args = array(
            \'post_type\' => \'job\',
            \'posts_per_page\' => -1,
            \'post__in\' => $working_list,
            \'orderby\' => \'post__in\'
        );

        return get_posts($args);
所以$working\\u list本质上包含一个post id数组,由于一些非Wordpress特定的PHP编码,所有post id的顺序都是正确的。没有\'orderby\' => \'post__in\' $args中的元素get\\u posts()中返回的帖子顺序不一致。

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

This isn\'t possible with WP_Query. 为了实现您的目标,需要进行多个查询,每个国家一个,分别获取结果,然后在PHP中手动组合。

您也不能使用meta_query 要排序,meta_query 用于过滤/搜索帖子元,这非常昂贵,并且随着元表变大而变慢。Post meta针对以下方面进行了优化get_post_meta, 当您已经知道post ID/键时获取值。它从未打算按值搜索/过滤帖子,这就是为什么添加了分类法。

如果要将排序更改为使用meta,请参阅the sorting official docs, 显示您可以按meta_valuemeta_value_num 对于单个键(meta_value_key ), 定义使用meta_key_valueorderby, 只有有限的排序选项:

“meta\\u value”-请注意,“meta\\u key=keyname”也必须存在于查询中。还请注意,排序将按字母顺序进行,这对于字符串(即单词)来说是很好的,但对于数字(例如1、3、34、4、56、6等,而不是您自然期望的1、3、4、6、34、56等)来说可能是意外的。对于数值,请使用“meta\\u value\\u num”。如果要将元值强制转换为特定类型,还可以指定“meta\\u type”。可能的值为“NUMERIC”、“BINARY”、“CHAR”、“DATE”、“DATETIME”、“DECIMAL”、“SIGNED”、“TIME”、“UNSIGNED”,与“$meta\\u query”中的值相同。使用“meta\\u type”时,也可以相应地使用“meta\\u value\\u*”。例如,当使用DATETIME作为“meta\\u type”时,可以使用“meta\\u value\\u DATETIME”来定义订单结构。

无法列出这些值以及它们的优先级或顺序。可以使用post id列表执行此操作,它将按照指定的顺序返回post,但在所有这些情况下,在执行查询之前已经知道了顺序。

如果不执行多个WP_Query 然后在PHP中提取结果,编译一个post ID数组并将其传递给pre_get_posts. 这将是不可靠和非常缓慢的。

我能预见的唯一可行的途径是通过插件与软件(如Elastic Search或Algolia)集成。