WordPress группы по типу поста на странице поиска - PullRequest
3 голосов
/ 21 июля 2011

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

<?php
 while (have_posts()) : the_post();  
 echo "<h1>";
 echo $post->post_type;
 echo $post->post_title;
 echo "</h1>";
 endwhile;
 ?>

Ответы [ 3 ]

4 голосов
/ 15 июля 2015

Этот код изменяет исходный поисковый запрос, чтобы упорядочить результаты по типу поста в выбранном вами порядке. Существуют и другие решения, но это единственное обнаруженное мной решение, которое не нарушает нумерацию страниц или требует нескольких запросов.

add_filter('posts_orderby', 'my_custom_orderby', 10, 2);

function my_custom_orderby($orderby_statement, $object) {
  global $wpdb;

  if (!is_search())
    return $orderby_statement;

  // Disable this filter for future queries (only use this filter for the main query in a search page)
  remove_filter(current_filter(), __FUNCTION__);

  $orderby_statement = "FIELD(".$wpdb - > prefix.
  "posts.post_type, 'post-type-c', 'post-type-example-a', 'custom-post-type-b') ASC";

  return $orderby_statement;
}
2 голосов
/ 30 июля 2013

В вашем случае я бы сделал две вещи:

  1. , чтобы отфильтровать начальный запрос страницы поиска для определенного типа записи
  2. , используйте одну WP_Query вызов для каждого оставшегося типа сообщения

Для (1) это будет указано в ваших функциях. php:

<?php
function SearchFilter($query) {
    if ($query->is_search && !is_admin()) {
        if (isset($query->query["post_type"])) {
            $query->set('post_type', $query->query["post_type"]);
        } else {
            $query->set('post_type', 'product');
        }
    }
    return $query;
}
add_filter('pre_get_posts','SearchFilter');
?>

Для (2) адаптируйте код, предоставленный вамиВаш файл шаблона:

<?php
$s = isset($_GET["s"]) ? $_GET["s"] : "";
$posts = new WP_Query("s=$s&post_type=post");
if ( $posts->have_posts() ) :
    while ( $posts->have_posts() ) : $posts->the_post();
        echo "<h1>";
        echo $post->post_type;
        echo $post->post_title;
        echo "</h1>";
    endwhile;
    wp_reset_postdata();
endif;
?>

Вы можете повторно использовать этот код для каждого типа сообщений.

Лучше избегать использования query_posts ... см. запрос сообщений без query_posts (даже разработчики WordPress согласны).

0 голосов
/ 21 июля 2011

Вам нужно изменить почтовый запрос, чтобы изменить порядок вещей.Вы должны выполнить это непосредственно перед тем, как войти в цикл.Вы можете прочитать больше о query_posts в кодексе Wordpress.

http://codex.wordpress.org/Function_Reference/query_posts

global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => array('type1', 'type2') ) );
query_posts( $args );
//the loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...