web-dev-qa-db-ja.com

WP_Query - >関連性のある順にソートする(=ほとんどのタグ/タクソノミ用語に共通)

私は私のカスタム投稿タイプのために新しい "関連投稿"ウィジェットを作成しようとしています。私は見つけました これ 解決策。

しかし、私が追加したいのは、投稿が関連性の高い順に並んでいるということです。私は、それらが共通して有する分類用語の数によって関連性を決定する:共通の分類用語が多いほど、関連性が高い。

例:現在の投稿にはタグ(1)、(2)、(3)、(4)があります。タグ(1)、(3)および(4)を有する関連投稿は、タグ(1)および(2)のみを有する関連投稿より関連性が高い。

また、可能であれば、カスタム分類法の用語の1つに特別な厳格度/強調を追加したいと思います(これを投稿の「主要」用語と見なします)。

例:現在の投稿にはタグ(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