我确实按照帖子类型对搜索结果进行了分组,但我如何才能给它们各自的顺序呢?

时间:2018-01-25 作者:Tim

我确实按帖子类型(艺术家、事件、帖子)对搜索结果进行了分组,并将每个结果放在一个容器中。下一步是在容器中为每个容器指定自己的顺序:

艺术家-来自A-Z活动-所有即将到来的活动首先发布-日期描述我知道如何为每个人设置查询,但我不知道如何在我已有的代码中使其发挥功能。。。谁能帮我?

这是我的searchresults中的一个片段。php:

                    <?php   
                    $last_type="";
                    $typecount = 0;
                    while (have_posts()) :
                    the_post();
                    if ($last_type != $post->post_type){
                    $typecount = $typecount + 1;
                    if ($typecount > 1){
                        echo \'</div><!-- close container -->\'; //close type container
                    }
                    // save the post type.
                    $last_type = $post->post_type;
                    //open type container
                    switch ($post->post_type) {
                        case \'cpt_artist\':
                        echo "<div class=\\"artistsearch-container\\"><h2>Artiesten</h2>";
                        break;
                case \'cpt_event\':
                        echo "<div class=\\"eventsearch-container\\"><h2>Evenementen</h2>";
                break;
                case \'post\':
                        echo "<div class=\\"postsearch-container\\"><h2>Blog Results</h2>";
                        break;

                    }
                    } 
            ?>

                <?php if(\'post\' == get_post_type()) : ?>
            <h2 class="blog">
         <a href="<?php the_permalink(); ?>">
           <?php the_title(); ?>
         </a>
      </h2>
    <?php endif; ?>

        <?php if(\'cpt_event\' == get_post_type()) : 

                        $event_date      = get_post_meta( get_the_ID(), \'ci_cpt_event_date\', true );
                        $event_time      = get_post_meta( get_the_ID(), \'ci_cpt_event_time\', true );
                        $event_timestamp = strtotime( $event_date . \' \' . $event_time, current_time( \'timestamp\' ) );
                        $event_enddate      = get_post_meta( get_the_ID(), \'ci_cpt_event_enddate\', true );
                        $event_endtime      = get_post_meta( get_the_ID(), \'ci_cpt_event_endtime\', true );
                        $event_endtimestamp = strtotime( $event_enddate . \' \' . $event_endtime, current_time( \'timestamp\' ) );
                        $event_location  = get_post_meta( get_the_ID(), \'ci_cpt_event_location\', true );
                        $event_venue     = get_post_meta( get_the_ID(), \'ci_cpt_event_venue\', true );
                        $event_timestamp = strtotime( $event_date . \' \' . $event_time, current_time( \'timestamp\' ) );

                        ?>
                        <div class="search-results-item-event"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br/>
                        <?php if (empty($event_enddate)){?>
                            <span><?php echo date_i18n( get_option(\'date_format\'), $event_timestamp ); ?> &middot; <?php echo $event_venue; ?>, <?php echo $event_location; ?></span>
                        <?php
                        ;}
                        else {?>
                            <span><?php echo date_i18n( get_option(\'date_format\'), $event_timestamp ); ?> - <?php echo date_i18n( get_option(\'date_format\'), $event_endtimestamp ); ?> &middot; <?php echo $event_venue; ?>, <?php echo $event_location; ?></span>
                        <?php
                        ;}
                        ?>
                        </div>
        <?php endif; ?>

    <?php if(\'cpt_artist\' == get_post_type()) : ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endif; ?>


<?php endwhile; ?>

<?php else : ?>
<div class="open-a-div">
<p>No results found.</p>    

<?php endif; ?>       
</div>

            <?php ci_pagination(); ?>
        </div>
这是我的函数的一个片段。php:

add_filter(\'posts_orderby\', \'group_by_post_type\', 10, 2);
function group_by_post_type($orderby, $query) {
    global $wpdb;
    if ($query->is_search) {
        return $wpdb->posts . \'.post_type ASC\';
    }
    // provide a default fallback return if the above condition is not true
    return $orderby;
}

1 个回复
最合适的回答,由SO网友:Anson W Han 整理而成

这里有一个建议的高层次方法,可以达到预期的效果。

而不是在搜索结果中的一个大while循环中执行所有操作。php,请尝试:

建立三个对应于每种类型的数组-您可以在一个while循环中完成此操作PHP\'s Sorting Arrays documentation 对于多维数组排序的各种方法),请输出节标题并循环浏览每种类型的帖子摘要group_by_post_type 函数的if 语句,您可以执行步骤1和;然后合并数组,返回合并结果并保留搜索结果。php就像您发布的一样完好无损。

结束

相关推荐

更改回调wp_Query的POSTS_ORDERBY?

我发现this answer 这有助于在我的搜索查询中按帖子类型对查询结果排序。但问题是当我去https://example.com/?s=query%20string 如果我使用原生php搜索进行搜索。这太棒了。但我也可以通过ajax进行搜索——当我键入时,ajax将调用在自定义rest端点上注册的回调函数。因此,我想知道是否有任何方法可以识别该自定义查询,以便重用该过滤器?在条件中:if ( ! is_admin() && is_search() && is_