Как отфильтровать порядок результатов поиска?
Есть ли способ сделать так, чтобы в результатах поиска сначала отображались Страницы, а затем записи?
Мой сайт - это бизнес-сайт с блогом, а не просто блог. На статических страницах размещена вся информация о том, "чем мы занимаемся", и было бы идеально, если бы они появлялись первыми, когда кто-то ищет различные услуги. Записи блога более легкие по тону, но они более свежие, поэтому отображаются первыми.
Цикл поиска взят из темы Kubrick:
<?php if (have_posts()) : ?>
<div class="center">
<div class="padding-bottom">
<h1><?php _e('Our Search Results', 'kubrick'); ?></h1>
</div>
</div>
<?php while (have_posts()) : the_post(); ?>
<div <?php post_class(); ?>>
<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php printf(__('Permanent Link to %s', 'kubrick'), the_title_attribute('echo=0')); ?>"><?php the_title(); ?></a></h3><?php the_excerpt(); ?>
</div>
<?php endwhile; ?>
<?php else : ?>
<h2 class="center"><?php _e('No luck. Try again?', 'kubrick'); ?></h2>
<?php get_search_form(); ?>
<?php endif; ?>
Могу ли я добавить что-то туда, чтобы указать, что любой результат из "страницы" будет отображаться перед результатами из "записи"? Или WordPress не различает страницы и записи на этом уровне? Поскольку статические страницы являются "статическими", возможно, я мог бы использовать ID?
Спасибо!

Вы можете использовать фильтр posts_orderby
для изменения порядка возвращаемых записей. Этот фильтр будет выполняться для каждого запроса (как на фронтенде, так и в админке), поэтому убедитесь, что хотите изменить порядок, используя проверки is_admin
, is_search
и другие.
В приведенном ниже примере результаты поиска сортируются по типу записи в порядке возрастания (например, сначала страницы, затем записи), а затем по дате публикации в порядке убывания.
add_filter('posts_orderby','my_sort_custom',10,2);
function my_sort_custom( $orderby, $query ){
global $wpdb;
if(!is_admin() && is_search())
$orderby = $wpdb->prefix."posts.post_type ASC, {$wpdb->prefix}posts.post_date DESC";
return $orderby;
}
Примечание: если у вас есть тип записи 'advert', и он появляется в результатах поиска - он будет отображаться перед страницами.
Несмотря на примечание выше, это относительно простой способ достичь желаемого результата.

Привет, Стивен: это похоже на то, что мне нужно — спасибо! Но куда мне вставить этот фильтр? В поисковый цикл, который я опубликовал? (Если да, то после чего?) Или в functions.php?
