web-dev-qa-db-fra.com

WP_Query -> trier les résultats par pertinence (= la plupart des balises/termes de taxonomie en commun)

J'essaie d'écrire un nouveau widget "publications associées" (pour la vue publication unique) pour mon type d'article personnalisé, en filtrant les termes de taxonomie personnalisés que les articles associés doivent avoir en commun avec l'article actuel. J'ai trouvé ceci solution.

Mais ce que j'aimerais ajouter, c'est que les messages sont classés par pertinence. Je détermine la pertinence en fonction du nombre de termes de taxonomie qu’ils ont en commun: plus il ya de termes de taxonomie en commun, plus ils sont pertinents.

Exemple: La publication actuelle comporte des balises (1), (2), (3) et (4). Un message associé avec des balises (1), (3) et (4) est plus pertinent qu'un message associé comportant uniquement les balises (1) et (2).

En outre, si possible, j'aimerais ajouter une sévérité/un accent particulier à l'un des termes de taxonomie personnalisée (que je suppose être le terme "principal" d'un message).

Exemple: La publication actuelle comporte des balises (1), (2), (3) et (4). (1) est le terme principal du poste. Les publications ne doivent être affichées en tant que publications liées que si elles ont au moins ce terme principal en commun. Un message associé avec des balises (1) et (3) est plus pertinent qu'un message associé avec la balise (1) uniquement. (Facultatif: une publication portant les balises (2), (3) et (4) n'est pas considérée comme une publication liée ou: cette publication a une pertinence inférieure à celle d'une publication ayant en commun le terme principal (1).)

Pouvez-vous m'aider s'il vous plaît avec cela? Merci d'avance! :)

Cordialement, René

3
René Schubert

Trier vos messages par pertinence

Cela devra ajouter une propriété supplémentaire à chaque poste. Que trier l'objet par cette nouvelle propriété. L'astuce consiste à trier les publications directement dans l'objet de requête.

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

}

Cela affichera les messages classés par votre pertinence calculée.


Gravité/Emphase

Le calcul d'une gravité ou d'une emphase n'est qu'un groupe de blocs if then else.

Pseudo-code:

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

}

Mais comment voulez-vous marquer un terme comme "terme principal"?

4
Ralf912