it-swarm.com.ru

WP_Query -> сортировка результатов по релевантности (= большинство общих тегов/терминов таксономии)

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

Но я хотел бы добавить, что посты упорядочены по релевантности. Я определяю релевантность по количеству общих терминов таксономии: чем больше общих терминов таксономии, тем более они актуальны.

Пример: текущая запись имеет теги (1), (2), (3) и (4). Связанный пост с тегами (1), (3) и (4) более релевантен, чем связанный пост только с тегами (1) и (2).

Также, если возможно, я бы хотел добавить особую строгость/акцент к одному из пользовательских терминов таксономии (который я предполагаю в качестве "основного" термина сообщения).

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

Можете ли вы помочь мне с этим? Заранее спасибо! :)

С уважением, Рене

3
René Schubert

Сортировка ваших сообщений по релевантности

Это нужно будет добавить дополнительные свойства для каждого сообщения. Чем отсортировать объект по этой новой собственности. Хитрость заключается в сортировке сообщений непосредственно в объекте запроса.

function get_posts(){

  // get the posts but do NOT order them  
    $query_posts = new WP_Query( array( 'numberposts' => 5 ) );

  // calculate the relevance for each post
    foreach( $query_posts->posts as $post )    
        $post->relevance = calculate_relevance( $post );

  // sorting the posts 
    usort( $query_posts->posts, 'compare' );

   return $query_posts;

}

function calculate_relevance( $post ){
    // calculate the relevance of the post here
    return Rand( 0, 100 );

}

function compare( $a, $b ){

    if(  $a->relevance ==  $b->relevance )
        return 0;

    return ( $a->relevance > $b->relevance ) ? -1 : 1;

}

$posts = get_posts();

// output the sorted posts
while( $posts->have_posts() ){

  $posts->the_post();

  echo the_title() . '<br>';

}

Это выведет сообщения, упорядоченные по вашей расчетной релевантности.


Серьезность/Акцент

Вычисление серьезности или акцента - это просто набор блоков if then else.

Псевдокод:

...
  $post->emphasis = get_post_emphasis( $post, 'main_term' );
...

function get_post_emphasis( $post, $main_term ){

  $emphasis = 0;
  $terms = get_posts_terms( $post ); // $terms is an array

  if( in_array( $main_term, $terms ) )
    $emphasis++;

  if( in_array( $main_term, $terms ) && 2 < count( $terms) )
    $emphasis++;

  return $emphasis;

}

Но как вы хотите отметить термин как "основной термин"?

4
Ralf912