加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php – WordPress – 按元值排序(如果存在),否则为date

发布时间:2020-05-25 09:02:16 所属栏目:PHP 来源:互联网
导读:我正在尝试允许我的用户按我的不同自定义字段对搜索结果进行排序. 我正在使用pre_get_posts过滤器,一切正常,除了一件事. 我遇到的问题是,当使用自定义字段进行排序时,只有具有该自定义字段集的帖子才会显示在搜索中. 显然,当用户更改如何对搜索结果进行排序时

我正在尝试允许我的用户按我的不同自定义字段对搜索结果进行排序.

我正在使用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-in-args-for-wp-query

它不会很漂亮(或优化),但我认为你可以在这里使用IF或CASE:
ORDER BY 
CASE wp_postmeta.meta_value WHEN IS NOT NULL THEN wp_postmeta.meta_value END ASC,CASE wp_postmeta.meta_value WHEN IS NULL THEN wp_posts.post_date END DESC

注意:我自己没有尝试过,所以可能存在语法错误,但它应该在理论上有效

进一步阅读:
Can you add an if statement in ORDER BY?

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读