Как показать результаты поиска из определенной категории в конце в WordPress - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь переместить сообщения в определенной категории (без категории) в конце результатов поиска на странице поиска по внешнему интерфейсу WordPress.

Подход, который у меня есть сейчас:

  1. Удалить сообщения из выбранной категории из основного запроса
  2. Создать новый запрос и получить сообщения только из этой категории
  3. Объединить оба результата запроса, поэтому теперь результаты из указанной категориив конце
  4. Необходимо также поддерживать нумерацию страниц

Код, который я использую для шага 1:

function wcs_exclude_category_search( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
      return;

    if ( $query->is_search ) {
      $query->set( 'cat', '-11' );
    }

  }
  add_action( 'pre_get_posts', 'wcs_exclude_category_search', 1 );

Любое руководство для этого подхода илилучший подход будет оценен.Благодаря.

1 Ответ

1 голос
/ 11 апреля 2019

Обычно я бы предпочел параметр "tax_query", например,

// in case there are other tax_query clauses on the query
$tax_query = (array) $query->get( 'tax_query' );
$tax_query[] = [
    'taxonomy' => 'category',
    'terms'    => 11,
    'field'    => 'term_id',
    'operator' => 'NOT IN'
];
$query->set( 'tax_query', $tax_query ); 

С другой стороны, если в запросе уже есть записи из категории «без категории», вы можете отсортировать результаты непосредственно перед отображением, подключив the_posts, что-то вроде:

add_action( 'the_posts', function( $posts, $query ){
    if ( ! $query->is_search() ) {
        return $posts;
    }
    usort( $posts, function ( $a, $b ){
        $a_in_uncategorized = has_term( 11, 'category', $a );
        $b_in_uncategorized = has_term( 11, 'category', $b );
        // if neither or both are on the "uncategorized" category
        // sort by date or whatever
        if ( $a_in_uncategorized === $b_in_uncategorized ) {
             return $b->post_date <=> $a->post_date;
        }
        if ( $a_in_uncategorized && ! $b_in_uncategorized )  {
             return 1;
        }
        if ( ! $a_in_uncategorized && $b_in_uncategorized )  {
             return -1;
        }
        return 0;
    } );
    return $posts;
}, 10, 2 );

Надеюсь, это поможет: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...