zachshallbetter
  • 0
Учитель

Разделение результатов поиска пользовательских записей

  • 0

У меня есть сайт с несколькими пользовательскими типами сообщений. Когда клиент выполняет поиск, он показывает комбинацию всех разных сообщений. Я хотел бы сегментировать их на одной странице, чтобы получилось что-то похожее на пример ниже. Любая помощь будет оценена по достоинству.

Показаны результаты для: действительно классный поиск

Централизованное управление видео

. Radius предлагает возможность интерактивной карты и поддержку нескольких мониторов. Предназначен для среды с несколькими мониторами… http://openeye.net/products/software/video-management




Записи в базе знаний: централизованный

ремонт вашего устройства

. Radius предлагает возможность интерактивной карты и поддержку нескольких мониторов. Предназначен для среды с несколькими мониторами… http://openeye.net/?faq=video-management-repair

Пример моего цикла из loop-search.php

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h4 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h4>
<?php if ( is_archive() || is_search() ) : // Only display excerpts for archives and search. ?>
    <div class="entry-summary">
        <?php the_post_thumbnail; ?>
        <?php if (function_exists('relevanssi_the_excerpt')) { relevanssi_the_excerpt(); }; ?>
        <a href="<?php the_permalink(); ?>"><?php the_permalink(); ?></a>
    </div><!-- .entry-summary -->
<?php else : ?>
    <div class="entry-content">
        <?php the_post_thumbnail; ?>
        <?php the_content( __( 'Continue reading', 'twentyten' ) ); ?>
        <?php wp_link_pages( array( 'before' => '<div class="page-link">' . __( 'Pages:', 'twentyten' ), 'after' => '</div>' ) ); ?>
        <a href="<?php the_permalink(); ?>"><?php the_permalink(); ?></a>
    </div><!-- .entry-content -->
<?php endif; ?>

мои изменения в search.php

<?php if ( have_posts() ) : $posts_per_page = 20; ?>
    <span style="font-size:18px;" class="page-title"><?php printf( __( 'Showing results for: %s', 'twentyten' ), '<span>' . get_search_query() . '</span>' ); ?></span>
    <?php
    /* Run the loop for the search to output the results.
     * If you want to overload this in a child theme then include a file
     * called loop-search.php and that will be used instead.
     */
     get_template_part( 'loop', 'search' );
    ?>
<?php else : ?>
    <div id="post-0" class="post no-results not-found">
        <h2 class="entry-title"><?php _e( 'Nothing Found', 'twentyten' ); ?></h2>
        <div class="entry-content">
    <?php if (function_exists('relevanssi_didyoumean')) {
        relevanssi_didyoumean(get_search_query(), "<p>Sorry, but nothing matched your search criteria. Please try again with some different keywords. Or you can also try ", "</p>", 5);
    }?>
            <?php related_searches(); ?>
        </div><!-- .entry-content -->
    </div><!-- #post-0 -->
<?php endif; ?>
Share
  1. Я искал то же самое и нашел кое-что интересное на сайте relevanssi. Вы можете найти это здесь Разделение сообщений по типам сообщений На самом деле я не могу заставить это работать, но, надеюсь, это лучшее решение с использованием Relevanssi.

    • 0
  2. Вы можете группировать посты по типу с помощью posts_groupby хука-фильтра:

    add_filter('posts_groupby', 'group_by_post_type' );
    function group_by_post_type( $groupby )
    {
      global $wpdb;
      if( !is_search() ) {
        return $groupby;
      }
      $mygroupby = "{$wpdb->posts}.post_type";
      if( !strlen(trim($groupby))) {
        // groupby was empty, use ours
        return $mygroupby;
      }
      // wasn't empty, append ours
      return $groupby . ", " . $mygroupby;
    }
    

    Затем в вашем цикле сделайте что-то вроде этого:

    $last_type="";
    $typecount = 0;
    while (have_posts()){
        the_post();
        if ($last_type != $post->post_type){
            $typecount = $typecount + 1;
            if ($typecount > 1){
                echo '</div>'; //close type container
            }
            // save the post type.
            $last_type = $post->post_type;
            //open type container
            switch ($post->post_type) {
                case 'post':
                    echo "<div class="post container"><h2>posts search result</h2>";
                    break;
                case 'page':
                    echo "<div class="page container"><h2>pages search result</h2>";
                    break;
                case 'custom_type_name':
                    echo "<div class="custom container"><h2>custom post type search result</h2>";
                    break;
                //add as many as you need.
            }
        }
    
        //...
        // do your loop 
        //...
    }
    
    • 0
  3. Просто хотел добавить, что, хотя решение @bainternet, за которое проголосовали, отличное, оно может нарушить функцию поиска в медиатеке. Эта проблема и простое решение представлены здесь.

    Простое решение состоит в том, чтобы добавить это условное выражение вокруг приведенного выше кода:

    if (!is_admin()) {
      [your code here]
    }
    
    • 0
  4. У меня это сработало после небольшой настройки приведенного выше решения. Сначала необходимо изменить фильтр, чтобы получить более 1 результата:

    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 DESC';
    }
    // provide a default fallback return if the above condition is not true
    return $orderby;
    }
    

    Затем петлю пришлось немного подправить. Я хотел по-разному стилизовать свои результаты с различной информацией, поэтому я добавил еще одно условие.

    <?php if(have_posts()) : ?>
    
    <?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 'post':
                echo "<div class="postsearch container"><h2>Blog Results</h2>";
                break;
            case 'product':
                echo "<div class="productsearch container"><h2>Product Search   Results</h2>";
                break;
    
        }
    } 
    ?>
    
        <?php if('post' == get_post_type()) : ?>
         <li class="post"><?php the_title(); ?></li>
    <?php endif; ?>
    
      <?php if('product' == get_post_type()) : ?>
     <li class="product"><?php the_title(); ?></li>
      <?php endif; ?>
    
    
    <?php endwhile; ?>
    
    <?php else : ?>
    <div class="open-a-div">
    <p>No results found.</p>    
    
    <?php endif; ?>       
    
    </div><!-- throw a closing div in --> 
    

    По сути, единственные изменения — это фильтр и закрывающий div, который был опущен в конце. Это и «Результаты не найдены». Это работает на моем сайте.

    • 0

Оставить ответ

You must login to add an answer.