我希望有人帮助我。
我的第一个问题:数组中的meta_value在我的函数中不起作用:
'value' => array('English','Spain','German','French'),
它使用一个值,但数组中的更多值不起作用。 它只是忽略了我的数组。
我的第二个问题:我想按照排序顺序列出项目:“英语”,“西班牙”,“德语”,“法语”之后按“ratings_score”排序按“修改”排序。 但根据国家,我只能按字母顺序列出。在这一行中,我想列出“英语”,“西班牙语”,“德语”,“法语”,但忽略它。
有人可以帮我解决错误吗?
这是我的功能:
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' );
答案 0 :(得分: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']
,然后剪切在您需要使用该名称的任何时候关闭第一个字符。这真是太糟糕了(特别是像我这样的CDO认为非3NF数据是邪恶的人),但它会让你找到最快的解决方案。
最干净,更规范化的方法是加入正确键入的顺序。这可能意味着对于每封帖子,您必须在country
旁边添加第二个键,如country_order
,并带有值。 'country'='English'的帖子会有'country_order'='1','country'='German'会有'country_order'='3',依此类推。然后只需在country_order
上订购。这可能是您最好的解决方案,尽管您必须为每个帖子维护并行元数据。
最干净,最困难(阅读:容易发生灾难)的解决方案是挂钩WP查询生成,查找country
元查询并修补您需要的数据。询问你是否需要这样做;它既不简单也不容易维护,所以我不打算在没有明确需要的情况下列出它。
英语,德语和法语不是国家。国家用表示 名词。那些是语言或国籍(以及其他一些东西),因此它们是形容词。西班牙是一个名词,因此是一个适当的国家。您的数据既不是内部(他们自己)也不是外部(他们的字段名称)。由于其他限制,这可能不属于您自己的行为或您的修复能力。如果它们在你修复的能力范围内,那么你可以很好地修改它们。