此方法将返回所有帖子,包括包含和不包含请求的帖子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.