我一直在使用pre_get_posts
过滤器修改内置的WP搜索,使用户可以按不同字段对帖子(包括一堆自定义帖子类型)进行排序。
我遇到的问题是,当我告诉WP按元值排序时,它将排除所有未设置该元值的帖子。如果将排序方式从“价格”更改为“日期”,这将导致结果数量发生变化,因为“帖子”没有设置“价格”,而“项目”却设置了。
这不是我想要的,所以我想知道是否有一种方法可以包含所有帖子-即使那些缺少我正在排序的元值的帖子-并将没有该值的帖子放在最后。
我知道如何在多个字段上进行排序,但这无济于事。
谢谢
似乎我不是唯一一个提出此问题的人:如何在wp_query的args中包含带有&不带有某些meta_key的帖子?但那里没有解决方案。
更新资料
我已经尝试了答案,但是不确定我是否理解正确,这是我现在所拥有的:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'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');
}
元值是一个数字(顾名思义,它用于存储价格)
更新2
我已经注释掉了订单材料,现在我所拥有的是:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
使用此代码,查询似乎返回所有没有item_price
关键字的帖子,并且没有任何包含关键字的帖子。IE浏览器的问题现在被扭转了。
如果我也添加订单代码,则会得到0个结果。
编辑:...三年后...:PI再次出现此问题。我尝试了所有给出的答案,但没有任何效果。不知道为什么有些人似乎认为自己在工作,但至少对我没有用。
我最终得到的解决方案是使用save_post
过滤器-确保所有帖子都具有我要排序的自定义字段。我必须这样做有点烦人,但是只要您尽早这样做,您可能就不会有任何问题。
在这种情况下,我在帖子上建立了一个“查看计数器”,希望用户能够对阅读次数最多的帖子进行排序。同样,按视图计数排序时,从未被查看的帖子(我想这不太可能-但仍然)消失了。我添加了以下代码以确保所有帖子都具有视图计数:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
和tax_query
是永远的array( array() )
,因为它们组合多个阵列。第二-如我的回答中所述-您需要使用meta_value_num
数字。可能还需要实际定义meta_value_num
(请参见WP_Query
-Codex页面条目)。最后,它没有意义的,order
在ASC
和 DESC
方向。那不可能 空格分隔符仅适用于该分隔符orderby
,您不能告诉它对第一ASC
和第二个空格进行排序DESC
。这就是posts_clauses
过滤器的作用。
meta_value_num
输入的是实数。经常看到有人指出这是一个数字,但实际上将其保存为字符串在数据库中。
ASC DESC
这样做的原因是它按meta_value
in ASC
和date
in进行排序DESC
。