数组中的 Wordpress meta_values 不起作用
Wordpress meta_values in array don't work
我希望有人帮助我。
我的第一个问题:数组中的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' );
meta_query
您正在尝试将值与数组进行比较。 WP 中的 MySQL 包装器不会这样做。将您的 meta_query
集查询更改为:
array(
'key' => 'country'
'value' => array('English','Spain','German','French'),
'compare' => 'IN'
),
array(
'key' => 'ratings_score',
'compare' => 'EXISTS'
)
我假设您要包含 ratings_score
元查询,因为您想查看它是否存在。如果您要检查其他内容,请更改比较(并可能向查询添加一个值)。
订购
遗憾的是,您不能对只有字母数据的数据集使用 non-alphabetic 排序。您实际上是在寻求某种方式 MySQL 到 "know," 您想要的顺序。
通常,对于循环中的平面查询,您订购规格的最佳方式可能是在获得数据后 re-order 数据。由于您在声明范围内工作(基本上,SQL),因此您需要做一些不同的事情。
可能最简单并且(通常是这种情况)最差的方法是更改您的数据,以便它们读取['1English', '2Spain', '3German', '4French']
,然后在需要使用该名称的任何时候切断第一个字符。这真的很糟糕(特别是对于像我这样有 CDO 的人来说,他们认为非 3NF 数据是邪恶的)但它会让你找到最快的解决方案。
最简洁、更规范的方法是按正确键入的顺序加入。这可能意味着对于每个 post,您必须在 country
旁边添加第二个键,例如 country_order
,并带有值。 'country' = 'English' 的 post 会 'country_order' = '1','country' = 'German' 会 'country_order' = ' 3',依此类推。然后只需在 country_order
上订购。这可能是您最好的解决方案,尽管您必须为每个 post.
维护并行元数据
最干净和最困难的(阅读:disaster-prone)解决方案是挂钩 WP 查询生成,在您需要的数据中查找 country
元查询和补丁。询问您是否需要这样做;它既不直接也不易维护,所以如果没有明确的需要,我不会列出它。
顺便说一句
英语、德语和法语不是国家。国家由
名词。这些是语言或国籍(以及其他一些东西),因此它们是形容词。西班牙是一个名词,因此是一个合适的国家。您的数据在内部(它们之间)和外部(对于它们的字段名称)都不一致。由于其他限制,这可能不是您自己做的或在您的能力范围内修复。如果它们在您的修复能力范围内,那么为了可维护性,您最好更改它们。
我希望有人帮助我。
我的第一个问题:数组中的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' );
meta_query
您正在尝试将值与数组进行比较。 WP 中的 MySQL 包装器不会这样做。将您的 meta_query
集查询更改为:
array(
'key' => 'country'
'value' => array('English','Spain','German','French'),
'compare' => 'IN'
),
array(
'key' => 'ratings_score',
'compare' => 'EXISTS'
)
我假设您要包含 ratings_score
元查询,因为您想查看它是否存在。如果您要检查其他内容,请更改比较(并可能向查询添加一个值)。
订购
遗憾的是,您不能对只有字母数据的数据集使用 non-alphabetic 排序。您实际上是在寻求某种方式 MySQL 到 "know," 您想要的顺序。
通常,对于循环中的平面查询,您订购规格的最佳方式可能是在获得数据后 re-order 数据。由于您在声明范围内工作(基本上,SQL),因此您需要做一些不同的事情。
可能最简单并且(通常是这种情况)最差的方法是更改您的数据,以便它们读取['1English', '2Spain', '3German', '4French']
,然后在需要使用该名称的任何时候切断第一个字符。这真的很糟糕(特别是对于像我这样有 CDO 的人来说,他们认为非 3NF 数据是邪恶的)但它会让你找到最快的解决方案。
最简洁、更规范的方法是按正确键入的顺序加入。这可能意味着对于每个 post,您必须在 country
旁边添加第二个键,例如 country_order
,并带有值。 'country' = 'English' 的 post 会 'country_order' = '1','country' = 'German' 会 'country_order' = ' 3',依此类推。然后只需在 country_order
上订购。这可能是您最好的解决方案,尽管您必须为每个 post.
最干净和最困难的(阅读:disaster-prone)解决方案是挂钩 WP 查询生成,在您需要的数据中查找 country
元查询和补丁。询问您是否需要这样做;它既不直接也不易维护,所以如果没有明确的需要,我不会列出它。
顺便说一句
英语、德语和法语不是国家。国家由 名词。这些是语言或国籍(以及其他一些东西),因此它们是形容词。西班牙是一个名词,因此是一个合适的国家。您的数据在内部(它们之间)和外部(对于它们的字段名称)都不一致。由于其他限制,这可能不是您自己做的或在您的能力范围内修复。如果它们在您的修复能力范围内,那么为了可维护性,您最好更改它们。