此方法将返回所有帖子,包括包含和不包含请求的帖子meta_key
, 但它在点菜时会做出奇怪的事情。
add_action(\'pre_get_posts\', \'my_stuff\');
function my_stuff ($qry) {
$qry->set(
\'meta_query\',
array(
\'relation\' => \'OR\', # Matches to this meta_query should be added to those matching the \'meta_key\' query
array(
\'key\' => \'item_price\',
\'value\' => \'bug #23268\',
\'compare\' => \'NOT EXISTS\'
)
)
);
$qry->set(\'orderby\', \'meta_value date\'); # Sorting works with meta_value as well as meta_value_num - I\'ve tried both
$qry->set(\'order\', \'ASC DESC\');
$qry->set(\'meta_key\', \'item_price\');
}
我通过摆弄这个问题的所有不同答案并分析
the generated SQL 通过反复试验。似乎设置
array(\'meta_query\' => array(\'relation\' => \'OR\'))
输出适当的
LEFT JOIN
而不是
INNER JOIN
这对于包含缺少元数据的帖子是必要的。指定
NOT EXISTS
防止
WHERE
从句中筛选出缺少元字段的帖子。对于此特定
WP_Query
, 生成的SQL是(添加缩进/换行):
SELECT SQL_CALC_FOUND_ROWS
wp_posts.ID
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = \'item_price\')
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (2) )
AND wp_posts.post_type = \'post\'
AND (wp_posts.post_status = \'publish\'
OR wp_posts.post_status = \'private\')
AND (wp_postmeta.meta_key = \'item_price\'
-- Oh look, here we give SQL permission to choose a random
-- row from wp_postmeta when this particular post is missing
-- \'item_price\':
OR mt1.post_id IS NULL )
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value,wp_posts.post_date DESC
LIMIT 0, 10
结果是列出所有meta\\u值为的帖子
item_price
还有那些失踪的人
item_price
. 所有具有
item_price
将相对彼此正确排序,但
posts missing item_price
will use some random other meta value (比如,
_edit_last
似乎是
1
通常在我的数据库或其他一些完全任意的内部wordpress元数据中
wp_postmeta.meta_value
在
ORDER BY
条款因此,虽然此方法很接近,并且可能对某些数据有效,但它是无效的。所以,我只能说,如果你
item_price
值恰好与MySQL为缺少的帖子选择的随机元字段不冲突
item_price
, 这可能对你很有用。如果你所需要的只是保证你的帖子
item_price
没有考虑到其他帖子的顺序,可能就可以了。但我认为这只是wordpress的一个缺点。请纠正我,我希望我错了,有办法解决这个问题;-)。
看来INNER JOIN wp_postmeta
, MySQL正在从多个postmeta
当meta_key
给定帖子中缺少。从SQL的角度来看,我们需要弄清楚如何告诉wordpress输出ORDER BY mt1.meta_value
. 此列正确NULL
当我们的要求meta_key
缺少,不像wp_postmeta.meta_value
. 如果我们能做到这一点,SQL将对这些NULL
(缺少条目)在任何其他值之前,为我们提供了一个定义良好的顺序:首先是缺少特定Posteta字段的所有帖子,其次是具有该字段的帖子。但这就是问题的症结所在:\'orderby\' => \'meta_value\'
只能参考\'meta_key\' => \'item_price\'
和无负债者wp_postmeta
始终是INNER JOIN
而不是LEFT JOIN
, 意思wp_postmeta.meta_value
和wp_postmeta.meta_key
永远不会NULL
.
所以我想我不得不说,这是不可能的wordpress的内置WP_Query
正如现在所记录的(在wordpress-3.9.1中)。打扰所以如果你真的需要它来正常工作,你可能need to hook into wordpress elsewhere and modify the generated SQL directly.