使用POSTS_ORDERBY过滤器和POST元值对搜索结果进行重新排序

时间:2019-02-11 作者:RachieVee

我想根据帖子元和日期重新排序搜索结果。post元键是_prioritize_s 价值并不重要。因此,在“普通”元查询中,我只需编写compare 要检查的参数是否存在。虽然我有元查询的经验,但直到现在我还从未对搜索结果进行过重新排序,所以我非常感谢您的帮助。

This is how I\'d like to re-order the search results:

<检查帖子是否带有post meta_prioritize_s 存在于搜索结果中,如果存在,请按日期顺序(从最近到最旧)将其放在结果的顶部。显示这些帖子后,按默认顺序显示下面的其余搜索结果
  • 如果搜索结果中没有包含此post meta的帖子,则按默认顺序排序,看起来我必须使用2个过滤器,一个用于加入,另一个用于设置顺序。看起来不错,但顺序不对?有什么想法?

    Updated Code from this sample

        add_filter( \'posts_join\', \'modify_search_results_join\' );
        add_filter( \'posts_orderby\', \'modify_search_results_order\', 10, 2 );
    
    
        function modify_search_results_join( $orderby ) {
            global $wpdb;
    
            if ( ! is_admin() && is_search() ) {
                $orderby .= "LEFT JOIN (
                SELECT *
                FROM $wpdb->postmeta
                WHERE meta_key =  \'_prioritize_s\' ) AS postmeta ON $wpdb->posts.ID = postmeta.post_id";
    
                return $orderby;
            }
    
            return $orderby;
        }
    
        function modify_search_results_order( $orderby, $query ) {
            global $wpdb;
            //how do I order the results by _prioritize_s set to \'yes\'?
            $orderby = "postmeta.meta_value+\'\' DESC";
    
            return $orderby;
        }
    

  • 2 个回复
    最合适的回答,由SO网友:RachieVee 整理而成

    在与其他人进行了大量的谷歌搜索和头脑风暴后,我发现我可能已经把这件事复杂化了。我的印象是我不能使用pre_get_posts 搜索结果时挂钩。事实证明,我可以。我使用一个元查询来检查post元是否存在。我还包括了一些检查,以防止函数在不是主查询、是管理或不是搜索时运行。

    以下是对我有效的方法:

    
        add_filter( \'pre_get_posts\', \'modify_search_results_order\', 10, 2 );
    
    
        function modify_search_results_order( $query ) {
            if ( ! $query->is_main_query() || is_admin() || ! is_search() ) {
                return $query;
            }
    
            $query->query_vars[\'order\'] = \'DESC\';
            $query->query_vars[\'orderby\']    = \'meta_value date\';
            $query->query_vars[\'meta_query\'] = [
                \'relation\' => \'OR\',
                array(
                    \'key\'   => \'_prioritize_s\',
                    \'compare\' => \'EXISTS\'
                ),
                array(
                    \'key\'     => \'_prioritize_s\',
                    \'compare\' => \'NOT EXISTS\'
                )
            ];
    
            return $query;
        }
    

    SO网友:Fabrizio Mele

    可能只是JOIN 问题:theSELECT 查询没有postmeta 排序依据字段。尝试实现来自的第二个答案this question.

    也就是说,将此代码粘贴到文件中。

    function custom_posts_join($join){
         global $wpdb;
    
         $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
    
         return $join;
    }
    add_filter( \'posts_join\' , \'custom_posts_join\');
    

    相关推荐

    将架构添加到搜索结果页面的正文。已尝试使用IS_SEARCH

    我正在尝试将架构标记添加到搜索结果页,并尝试使用以下代码:-function body_schema() { $schema = \'http://schema.org/\'; if(is_search()) { $type = \"SearchResultsPage\"; } else { $type = \'Blog\'; } echo \'itemscope itemtype=\"\' . $schema . $