it-swarm.com.de

WP_Query -> Ergebnisse nach Relevanz sortieren (= die meisten Tags/Taxonomiebegriffe gemeinsam)

Ich versuche, ein neues Widget "Verwandte Posts" (für die Ansicht einzelner Posts) für meinen benutzerdefinierten Post-Typ zu schreiben, wobei nach benutzerdefinierten Taxonomie-Begriffen gefiltert wird, die die verwandten Posts mit dem aktuellen Post gemeinsam haben sollten. Ich habe diese Lösung gefunden.

Was ich jedoch hinzufügen möchte, ist, dass die Posts nach Relevanz sortiert sind. Ich bestimme die Relevanz anhand der Anzahl der Taxonomiebegriffe, die sie gemeinsam haben: Je mehr Taxonomiebegriffe gemeinsam sind, desto relevanter.

Beispiel: Der aktuelle Beitrag hat die Tags (1), (2), (3) und (4). Ein verwandter Beitrag mit den Tags (1), (3) und (4) ist relevanter als ein verwandter Beitrag mit nur den Tags (1) und (2).

Außerdem möchte ich, wenn möglich, einem der benutzerdefinierten Taxonomiebegriffe (von denen ich annehme, dass sie der "Hauptbegriff" eines Posts sind) einen besonderen Schweregrad hinzufügen.

Beispiel: Der aktuelle Beitrag hat die Tags (1), (2), (3) und (4). (1) ist die Hauptlaufzeit der Stelle. Posts sollten nur als verwandte Posts angezeigt werden, wenn sie mindestens diesen Hauptbegriff gemeinsam haben. Ein verwandter Beitrag mit den Tags (1) und (3) ist relevanter als ein verwandter Beitrag nur mit dem Tag (1). (Optional: Ein Beitrag mit den Tags (2), (3) und (4) wird nicht als verwandter Beitrag angesehen, oder: Dieser Beitrag hat eine geringere Relevanz als jeder Beitrag, der den Hauptbegriff (1) gemeinsam hat.)

Können Sie mir bitte dabei helfen? Danke im Voraus! :)

Grüße, René

3
René Schubert

Sortieren Sie Ihre Beiträge nach Relevanz

Dazu muss jedem Post eine zusätzliche Propperty hinzugefügt werden. Dann sortiere das Objekt nach dieser neuen Eigenschaft. Der Trick besteht darin, die Beiträge direkt im Abfrageobjekt zu sortieren.

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>';

}

Dadurch werden die nach Ihrer berechneten Relevanz geordneten Posts ausgegeben.


Schweregrad/Betonung

Das Berechnen eines Schweregrads oder einer Betonung ist nur ein Bündel von if then else Blöcken.

Pseudocode:

...
  $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;

}

Aber wie möchten Sie einen Begriff als "Hauptbegriff" kennzeichnen?

4
Ralf912