我正在尝试使用meta\\u值过滤和排序Wordpress查询,但是ORDER BY
部分查询似乎在错误的表上工作。
此处的查询参数为:
array(12) {
["post_type"]=>"op-events"
["paged"]=>1
["meta_query"]=>
array(2) {
["relation"]=>"OR"
[0]=>
array(4) {
["key"]=>"_simple_fields_fieldGroupID_9_fieldID_1_numInSet_0"
["value"]=>"2012-03-28"
["compare"]=>">"
["type"]=>"DATE"
}
}
["meta_key"]=>"_simple_fields_fieldGroupID_9_fieldID_1_numInSet_0"
["orderby"]=>"meta_value"
["order"]=>"ASC"
}
想法是在今天之后按日期过滤,然后按日期升序排列帖子。通常我可能会手动构建此查询,但您会看到“\\u simple\\u fields”meta\\u键,这是因为这些字段是由simple fields插件创建的,因此我不知道它们的键是什么。
生成的查询结果为:
SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
WHERE 1=1
AND wp_posts.post_type = \'op-events\'
AND
(
wp_posts.post_status = \'publish\'
OR wp_posts.post_status = \'private\'
)
AND
(
wp_postmeta.meta_key = \'_simple_fields_fieldGroupID_9_fieldID_1_numInSet_0\'
OR
(
mt1.meta_key = \'_simple_fields_fieldGroupID_9_fieldID_1_numInSet_0\'
AND CAST(mt1.meta_value AS DATE) > \'2012-03-28\'
)
)
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value ASC
LIMIT 0, 10
由于某些原因,此查询没有按正确的顺序返回行,我唯一能想到的是
ORDER BY wp_postmeta.meta_value ASC
该行实际上应该由my1订购。meta\\u值。
有人能解释一下吗?
最合适的回答,由SO网友:kaiser 整理而成
注意:只需简单阅读,否则我可能会误解你的问题。
JOIN
在…上meta_query
/post\\u元表很漂亮。。。嗯,有趣(?)。。。你会的JOIN
您添加的每个键的表(再次)-这是一个已知的问题(在trac上读取)。详细地INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
是否与相同INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
. 和ORDER BY wp_postmeta.meta_value ASC
是否与相同ORDER BY mt1.meta_value ASC
.
您可以尝试使用posts_clauses
or posts_orderby
filter 更改ORDER BY
声明:
function wpse_change_orderby( $orderby )
{
return \'ORDER BY DATE ASC\';
}
add_filter( \'posts_orderby\', \'wpse_change_orderby\' );