【问题标题】:Wordpress meta_values in array don't work数组中的 Wordpress 元值不起作用
【发布时间】:2018-04-02 08:31:14
【问题描述】:

我想有人帮助我。

我的第一个问题:数组中的 meta_value 在我的函数中不起作用:

'value' => array('English','Spain','German','French'),

它适用于单个值,但数组中的更多值不起作用。 它只是忽略了我的数组。

我的第二个问题:我想按排序顺序列出项目:“English”、“Spain”、“German”、“French”,然后按“ratings_score”排序,然后按“修改”排序。 但根据国家我只能按字母顺序列出。在这一行中,我想列出“English”、“Spain”、“German”、“French”,但忽略它。

有人可以帮我解决问题吗?

这是我的功能:

function ta_modify_main_query($query) {
      if ( $query->is_main_query() && ( $query->is_home() || $query->is_search() || $query->is_archive() )  ) {

    {
     $query->set('meta_query', array(
            'country' => array(
                'key' => 'country',
                'value' => array('English','Spain','German','French'),
                ),
            'ratings_score' => array(
                    'key' => 'ratings_score',
                ),
            ));
            $query->set('orderby',array(
                'country' => 'ASC', 
                'ratings_score' => 'DESC',
                'modified' => 'DESC'
            ));     
        }

  return $query;       
  }
}
add_action( 'pre_get_posts', 'ta_modify_main_query' );

【问题讨论】:

  • 它会返回任何东西还是只是订单不起作用?如果它没有返回任何内容,请尝试添加 'compare' => 'IN'array( 'country' => array( 'key' => 'country', 'value' => array('English','Spain','German','French'), 'compare' => 'IN' ),
  • 嗨奥马尔!有或没有 'compare' => 'IN' 它会返回任何东西,使用 'compare' => 'LIKE' 或 'REGEXP' 它会返回帖子,但订单不起作用
  • 您可以尝试将'relation' => 'AND' 添加到meta_query 吗?您想为'ratings_score' 获取什么值?
  • 你好奥马尔。该数组现在可以使用,但仅按字母顺序排列。您知道如何按优先级等自定义顺序列出此数组。
  • 我添加了我的答案..关于 orderby,我认为不可能在 pre_get_posts 操作中按照您想要的方式设置它。您可以构建自己的 SQL 语句,也可以创建另一个数字元键示例“country_order”并将其设置为例如 1 用于英语帖子,2 用于西班牙语帖子等。然后将 orderby 设置为这个新的元键。

标签: arrays wordpress meta-key


【解决方案1】:

元查询

您正在尝试将值与数组进行比较。 WP 中的 MySQL 包装器不这样做。将您的 meta_query 设置查询更改为:

array(
  'key' => 'country'
  'value' => array('English','Spain','German','French'),
  'compare' => 'IN'
),
array(
  'key' => 'ratings_score',
  'compare' => 'EXISTS'
)

我假设您包含 ratings_score 元查询,因为您想查看它是否存在。如果您正在尝试检查其他内容,请更改比较(并可能在查询中添加一个值)。

订购

很遗憾,您不能对只有字母数据的数据集使用非字母排序。您实际上是在要求 MySQL 以某种方式“知道”您想要它的顺序。

通常,对于循环中的平面查询,按照规范排序的最佳方式可能是在获取数据后重新排序。由于您在声明性范围(基本上是 SQL)中工作,因此您需要做一些不同的事情。

可能最简单和(通常情况下)最糟糕的方法是更改​​您的数据,以便它们读取['1English', '2Spain', '3German', '4French'],然后切断任何时候需要使用名称的第一个字符。这确实很糟糕(尤其是对于像我这样认为非 3NF 数据是邪恶的 CDO 的人来说),但它会让您找到最快的解决方案。

最干净和更规范的方法是按正确键入的顺序加入。这可能意味着对于每个帖子,您必须在country 旁边添加第二个键,例如country_order,并带有值。 'country' = 'English' 的帖子将具有 'country_order' = '1','country' = 'German' 将具有 'country_order' = '3',依此类推。然后只需在country_order 订购。这可能是您最好的解决方案,尽管您必须为每个帖子维护并行元数据。

最干净和最困难(阅读:容易发生灾难)的解决方案是挂钩 WP 查询生成,查找 country 元查询并修补您需要的数据。询问您是否需要这样做;它既不简单也不易于维护,所以我不会在没有明确需要的情况下列出它。

顺便说一句

英语、德语和法语不是国家。国家表示为 名词。这些是语言或国籍(以及其他一些东西),因此它们是形容词。西班牙是一个名词,因此是一个合适的国家。您的数据在内部(彼此之间)和外部(与其字段名称)不一致。由于其他限制,这可能不是您自己做的或在您的能力范围内修复。如果它们在您的修复能力范围内,您最好在可维护性方面进行更改。

【讨论】:

  • 谢谢斯蒂芬·塞缪尔!第二个键(country_order)对我有用。
猜你喜欢
  • 2014-02-12
  • 2019-10-04
  • 1970-01-01
  • 2021-07-19
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多