我试图让我的用户按我拥有的不同自定义字段对搜索结果进行排序。
我正在使用pre_get_posts
过滤器,除了一件事外一切正常。
我遇到的问题是,当使用自定义字段进行排序时,只有设置了该自定义字段的帖子才会显示在搜索中。
显然这是不可接受的,因为当用户更改排序方式时搜索结果的数量会发生变化。
相反,我想要的是具有自定义字段的帖子首先按顺序显示,然后其余帖子按日期排序显示。
这是我拥有的相关代码:
<?php
add_filter('pre_get_posts', 'h5b_search_pre_get_posts');
function h5b_search_pre_get_posts ($qry) {
$validOrders = array('price', 'date', 'popularity');
$orderBy = (isset($_GET['myorder']) and in_array($_GET['myorder'], $validOrders)) ? $_GET['myorder'] : 'price';
if ($qry->is_main_query() and $qry->query_vars['s'] != '') {
# This only includes the posts that have "item_price" set
if ($orderBy == 'price') {
$qry->set('orderby', 'meta_value_num date');
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
# This works fine and includes all posts (obviously)
elseif ($orderBy == 'date') {
$qry->set('orderby', 'date');
$qry->set('order', 'DESC');
}
}
}
编辑:这是实际的 MySQL 查询的样子。我该如何更改它,以便它wp_postmeta.meta_value
是否存在排序 - 如果不存在,则按日期排序?
SELECT
SQL_CALC_FOUND_ROWS wp_posts.ID
FROM
wp_posts
INNER JOIN
wp_postmeta
ON
(wp_posts.ID = wp_postmeta.post_id)
WHERE
1=1 AND
((
(wp_posts.post_title LIKE '%lorem%') OR
(wp_posts.post_content LIKE '%lorem%')
)) AND
wp_posts.post_type IN ('post', 'page', 'attachment', 'items', 'locations') AND
(wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') AND
(wp_postmeta.meta_key = 'item_price' )
GROUP BY
wp_posts.ID
ORDER BY
wp_postmeta.meta_value+0,wp_posts.post_date DESC LIMIT 0, 6
最好我会使用这些WP_Query
方法来解决它,但如果必须,我可能会考虑运行我自己的 SQL。
Edit2:我觉得我需要使用类似的东西IF NOT NULL
- 你会怎么做WP_Query
?甚至可能吗?
编辑(再次):这是同样的问题(我认为:P):https ://wordpress.stackexchange.com/questions/28409/way-to-include-posts-both-with-without-certain-meta-key-在-args-for-wp-查询