0

我想有人帮助我。

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

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

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

我的第二个问题:我想按排序顺序列出项目:“English”、“Spain”、“German”、“French”,然后按“ratings_score”排序,然后按“modified”排序。但根据国家我只能按字母顺序列出。在这一行中,我想列出“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' );
4

1 回答 1

0

元查询

您正在尝试将值与数组进行比较。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元查询并修补您需要的数据。询问您是否要这样做;它既不简单也不易于维护,所以我不会在没有明确需要的情况下列出它。

作为旁白

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

于 2018-04-01T22:49:19.343 回答