在我的搜索函数中,先按元值PRO排序,然后再按元值自由排序

时间:2014-10-31 作者:itcgpit mark

我的元密钥是geo_listing_type 这把钥匙有两个meta_value, profree. 我想订购这些pro 首先,然后free

<?php get_header(); ?>
<!--Start Content Wrapper-->
<div class="content_wrapper">
    <div class="grid_16 alpha">
        <div class="featured_content">
            <h1>
                <?php
                $sfrom = $_REQUEST[\'sfrom\'];
                $location = $_REQUEST[\'location\'];
                if ($sfrom !== "" && $location == "") {
                    printf(__(U_SRC_FR . \' %s\', THEME_SLUG), \'\' . $sfrom . \'\');
                } elseif ($sfrom == "" && $location !== "") {
                    printf(__(NEAR . \' %s\', THEME_SLUG), $location);
                } elseif ($sfrom !== "" && $location !== "") {
                    printf(__(U_SRC_FR . \' %s \' . NEAR . \' %s\', THEME_SLUG), \'\' . $sfrom . \'\', $location);
                }
                ?>
            </h1>     
            <?php
            $results = gc_multi_search($sfrom, $location);
            if (isset($_GET[\'pn\'])) { // Get pn from URL vars if it is present
                $pn = preg_replace(\'#[^0-9]#i\', \'\', $_GET[\'pn\']); // filter everything but numbers for security(new)
            } else { // If the pn URL variable is not present force it to be value of page number 1
                $pn = 1;
            }

            $itemsPerPage = get_option(\'posts_per_page\');

            $lastPage = ceil($results[\'query\'] / $itemsPerPage);

            if ($pn < 1) { // If it is less than 1
                $pn = 1; // force if to be 1
            } else if ($pn > $lastPage) { // if it is greater than $lastpage
                $pn = $lastPage; // force it to be $lastpage\'s value
            }

            $centerPages = "";
            $sub1 = $pn - 1;
            $sub2 = $pn - 2;
            $add1 = $pn + 1;
            $add2 = $pn + 2;
            if ($pn == 1) {
                $centerPages .= \'<li><a class="current" href="">\' . $pn . \'</a></li>\';
                $centerPages .= \'<li> <a href="\' . site_url(GC_SEARCH . "/?pn=$add1&sfrom=$sfrom&location=$location") . \'">\' . $add1 . \'</a></li>\';
            } else if ($pn == $lastPage) {
                $centerPages .= \'<li> <a href="\' . site_url(GC_SEARCH . "/?pn=$sub1&sfrom=$sfrom&location=$location") . \'">\' . $sub1 . \'</a></li>\';
                $centerPages .= \'<li><a class="current" href="">\' . $pn . \'</a></li>\';
            } else if ($pn > 2 && $pn < ($lastPage - 1)) {
                $centerPages .= \'<li><a href="\' . site_url(GC_SEARCH . "/?pn=$sub2&sfrom=$sfrom&location=$location") . \'">\' . $sub2 . \'</a></li>\';
                $centerPages .= \'<li><a href="\' . site_url(GC_SEARCH . "/?pn=$sub1&sfrom=$sfrom&location=$location") . \'">\' . $sub1 . \'</a></li>\';
                $centerPages .= \'<li><a class="current" href="">\' . $pn . \'</a></li>\';
                $centerPages .= \'<li><a href="\' . site_url(GC_SEARCH . "/?pn=$add2&sfrom=$sfrom&location=$location") . \'">\' . $add1 . \'</a></li>\';
                $centerPages .= \'<li><a href="\' . site_url(GC_SEARCH . "/?pn=$add2&sfrom=$sfrom&location=$location") . \'">\' . $add2 . \'</a></li>\';
            } else if ($pn > 1 && $pn < $lastPage) {
                $centerPages .= \'<li> <a href="\' . site_url(GC_SEARCH . "/?pn=$sub1&sfrom=$sfrom&location=$location") . \'">\' . $sub1 . \'</a> </li>\';
                $centerPages .= \'<li><a class="current" href="">\' . $pn . \'</a></li>\';
                $centerPages .= \'<li><a href="\' . site_url(GC_SEARCH . "/?pn=$add1&sfrom=$sfrom&location=$location") . \'">\' . $add1 . \'</a></li>\';
            }

            $limit = \'LIMIT \' . ($pn - 1) * $itemsPerPage . \',\' . $itemsPerPage;
            $paginationDisplay = "<ul class=\'paginate\'>"; // Initialize the pagination output variable
            if ($lastPage != "1") {
                //$paginationDisplay .= \'Page <strong>\' . $pn . \'</strong> of \' . $lastPage . \'&nbsp;  &nbsp;  &nbsp; \';

                if ($pn != 1) {
                    $previous = $pn - 1;
                    $paginationDisplay .= \'<li><a href="\' . site_url(GC_SEARCH . "/?pn=$previous&sfrom=$sfrom&location=$location") . \'">&laquo;</a></li>\';
                }
                $paginationDisplay .= $centerPages;
                if ($pn != $lastPage) {
                    $nextPage = $pn + 1;
                    $paginationDisplay .= \'<li><a href="\' . site_url(GC_SEARCH . "/?pn=$nextPage&sfrom=$sfrom&location=$location") . \'">&raquo;</a></li> \';
                }                
            }
            $paginationDisplay .= \'</ul>\';
            if($pn < 1){
                $paginationDisplay = \'\';
            }


            $results = gc_multi_search($sfrom, $location, $limit);
            if ($results[\'result\']) {
                foreach ($results[\'result\'] as $q) {
                    $featured_class = \'\';
                    $is_pro = get_post_meta($q->ID, \'geocraft_listing_type\', true);
                    if ($is_pro == \'pro\') {
                        $featured_class = \'featured\';
                    }
                    $img_meta = get_post_meta($q->ID, \'geocraft_meta_image1\', true);
                    ?>
                    <!--Start Featured Post-->
                    <div class="featured_post">
                        <div class="<?php echo $featured_class; ?>">
                            <!--Start Featured thumb-->
                            <div class="featured_thumb">
                                <?php if ((function_exists(\'has_post_thumbnail\')) && (has_post_thumbnail())) { ?>
                                    <?php inkthemes_get_thumbnail(128, 108, \'\', $img_meta); ?>                    
                                <?php } else { ?>
                                    <?php search_get_image(128, 108, \'\', $img_meta, get_permalink($q->ID)); ?> 
                                    <?php
                                }
                                ?>
                                <?php if ($is_pro == \'pro\') { ?>
                                    <img class="ribbon" src="<?php echo get_template_directory_uri(); ?>/images/ribbon.png"/>                   
                                <?php } ?>
                                <ul class="star_rating">
                                    <?php
                                    echo geocraft_get_post_rating_star($q->ID);
                                    ?>
                                </ul>
                                <span class="review_desc"><?php  gc_comments_popup_link($q->ID,N_RV, _RV, \'% \' . REVIEW); ?></span> </div>
                            <!--End Featured thumb-->
                            <div class="f_post_content">
                                <h4 style="margin-bottom: 3px !important;" class="f_post_title"><a href="<?php echo get_permalink($q->ID); ?>" rel="bookmark" ><?php echo get_the_title($q->ID); ?></a></h4>
                                <?php if (get_post_meta($q->ID, \'geo_address\', true)): ?>
                                    <p class="f_post_meta"><img src="<?php echo TEMPLATEURL . \'/images/location-icon.png\'; ?>"/>&nbsp;&nbsp;<?php echo get_post_meta($q->ID, \'geo_address\', true); ?></p>                               
                                <?php endif; ?>
                                <?php
                                $excerpt = preg_replace("/<img[^>]+\\>/i", "", $q->post_content);
                                $excerpt = substr(strip_tags($excerpt), 0, 111);
                                printf("%s", $excerpt);
                                if (strlen($excerpt) > 110)
                                    echo \'&nbsp;<a href="\' . get_permalink($q->ID) . \'">\' . \'[...] Read More\' . \'</a>\';
                                ?>
                            </div>
                        </div>
                    </div>
                    <!--End Featured Post-->
                    <?php
                }
            }else {
                ?>            
                <div class = "featured_post">
                    <p class = "place"><?php echo NO_LST_FND; ?></p>
                </div>
                <?php
            }
            ?>
            <div class="paging"><span style="float:right;"><?php echo $paginationDisplay; ?></span></div>
        </div>
    </div>
    <div class="grid_8 omega">
        <?php
        global $post;
        get_sidebar(POST_TYPE);
        ?>
    </div>
</div>
<!--End Content Wrapper-->
<?php get_footer(); ?>
以上是我的搜索功能。

我的帖子类型是=listing

  • meta key = geocraft_listing_type
  • meta_valueprofree
  • 我希望上述搜索功能pro 先值后值free 随机的。

    目前,每个函数的帖子都是按id排序的。如果我在按ASC和DESC分组后添加,那么它会起作用,但我希望pro 先值后值free.

    1 个回复
    最合适的回答,由SO网友:Pieter Goosen 整理而成

    EDIT 2 - FINAL EDIT

    在我开始编辑之前,这里有几件事

    我的答案中的代码是基本的,旨在演示这些概念。我现在已经测试了这两组代码,所有的工作都如预期的那样。您必须自己添加所有所需的标记、样式和模板标记。

    在实现方面,这完全取决于您,我们不是来为您实现代码的。希望您至少了解如何在主题中使用和实现此代码

    您已确认这是您的搜索。php,这使得我原始答案中的代码毫无用处。您不应该使用自定义查询更改主查询,因为正如您所看到的,这总是有问题的。请参见this post 我已经完成了这个主题

    我的解决方案是粘贴我第一次编辑的代码(EDIT 1) 在您的功能中。php。您必须修改pre_get_posts 根据需要采取行动。我已经测试了代码,它工作得很好。要使其工作,您需要使用main loop 正在搜索中。php。

    ORIGINAL ANSWER

    我从你的问题中了解到的是pro 值必须首先按日期排序,然后free 随机排序

    我们将使用与中基本相同的想法your previous question 经过一些修改

    在我开始之前,请注意,您不应该使用自定义SQL查询。利用pre_get_posts, WP_Queryget_posts 而是相应地创建/调整/修改查询

    我还是一个SQL学习者,所以我将放弃你的想法,与WP_Query

    使用上述本机函数无法实现所需的排序类型。此外,您不需要运行两个查询来实现这一点,一个就足够了。

    我的想法是检索meta_value 属于profree. 我们将保留默认的“orderby”和“order”参数,因为这无关紧要。我们将使用PHP实现所需的排序顺序

    因此,让我们编写代码:

    STEP 1

    如前所述,我们需要得到所有有meta_value 属于provalue

    $args = [
        \'post_type\'         => \'listing\',
        \'meta_key\'          => \'geocraft_listing_type\',
        \'meta_value\'        => \'free, pro\',
        \'meta_compare\'      => \'IN\',
        \'posts_per_page\'    => -1,
    ];
    
    $the_query = new WP_Query( $args );
    

    STEP 2

    在我个人看来,实现排序顺序的最佳方法是打破$posts 将数组分成两个单独的数组,其中一个数组将容纳所有带有meta_value 属于pro 而另一个阵型将以meta_value free.

    $free = [];
    $pro = [];
    foreach ( $the_query->posts as $post ) {
        $meta = get_post_meta( $post->ID, \'geocraft_listing_type\', true );
        if ( \'free\' == $meta ) {
            $free[] = $post;  
        }else{
            $pro[] = $post;  
        }
    }
    unset($post);
    

    STEP 3

    使用meta_value pro 将保持不变,此帖子数组将根据帖子日期进行排序。我们需要用meta_value free

    由于您需要对这些帖子进行随机排序,我们将使用PHP函数shuffle() 将这些帖子随机显示

    shuffle($free);
    

    STEP 4

    我们需要取消原始的$posts 并用新值重置它。这一价值将通过将两个阵列合并在一起来创造,pro 首先,然后free. 为此,请使用array_merge(). 此新数组将设置为的新值$posts

    unset($the_query->posts);
    $the_query->posts = array_merge($pro, $free);
    

    STEP 5

    现在你可以像往常一样循环浏览你的帖子了

    if ( $the_query->have_posts() ) {
        echo \'<ul>\';
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
    
            echo \'<li>\' . get_post_meta( $post->ID, \'geocraft_listing_type\', true ). \'</br>\' . get_the_title() . \'</li>\';
    
        }
        echo \'</ul>\';
    } 
    wp_reset_postdata();
    

    ALL TOGETHER NOW

    <?php
    $args = [
        \'post_type\'         => \'listing\',
        \'meta_key\'          => \'geocraft_listing_type\',
        \'meta_value\'        => \'free, pro\',
        \'meta_compare\'      => \'IN\',
        \'posts_per_page\'    => -1,
    ];
    
    $the_query = new WP_Query( $args );
    
    $free = [];
    $pro = [];
    foreach ( $the_query->posts as $post ) {
        $meta = get_post_meta( $post->ID, \'geocraft_listing_type\', true );
        if ( \'free\' == $meta ) {
            $free[] = $post;  
        }else{
            $pro[] = $post;  
        }
    }
    unset($post);
    shuffle($free);
    unset($the_query->posts);
    $the_query->posts = array_merge($pro, $free);
    
    if ( $the_query->have_posts() ) {
        echo \'<ul>\';
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
    
            echo \'<li>\' . get_post_meta( $post->ID, \'geocraft_listing_type\', true ). \'</br>\' . get_the_title() . \'</li>\';
    
        }
        echo \'</ul>\';
    } 
    wp_reset_postdata();
    
    您可以修改此代码以使用pre_get_poststhe_posts 如果假设这是主查询,则进行筛选。

    EDIT 1

    如果假设这是在搜索页面上作为主查询完成的,那么您将使用pre_get_posts 更改搜索页面上的主查询。我不会详细解释每件事,因为它应该以与上面相同的方式工作WP_Query

    在您的功能中。php,添加以下代码。这将仅更改搜索页面的主查询

    add_action( \'pre_get_posts\', function ( $query ) {
        if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
            $query->set( \'post_type\', \'listings\' );
            $query->set( \'meta_key\', \'geocraft_listing_type\' );
            $query->set( \'meta_value\', \'free, pro\' );
            $query->set( \'meta_compare\', \'IN\' );
            $query->set( \'posts_per_page\', \'-1\' );
        }
    });
    
    您现在要使用the_posts filter可筛选搜索页面上的排序顺序。

    所以,还是在你的函数中。php,添加以下代码

    add_filter( \'the_posts\', function ($posts, $query) {
      if( $query->is_main_query() && $query->is_search() ) {
        $free = [];
        $pro = [];
        foreach ( $posts as $post ) {
            $meta = get_post_meta( $post->ID, \'geocraft_listing_type\', true );
            if ( \'free\' == $meta ) {
                $free[] = $post;  
            }else{
                $pro[] = $post;  
            }
        }
        unset($post);
        shuffle($free);
        $posts = array_merge($pro, $free);
        }
        return $posts;  
    }, 
    10, 2 );
    
    在您的搜索中。php您不需要修改任何内容。这里只需要默认循环。

    结束

    相关推荐

    带有条件的WP_Meta_Query对象

    我有一个自定义帖子类型(Books),它与第二个自定义帖子类型(People)相连接。图书CPT有一个额外的作者元框,如果选中,它应该出现在额外的人物CPT上。然而,即使检查并指定了第二位作者,这本书CPT也不会出现在第二个人CPT的页面上。我的页面代码如下:<?php $author_id = get_the_ID(); $single_books_query = new WP_Query(array( \'post_type\' =>