WP_Query - ordene los resultados por relevancia (= la mayoría de las etiquetas / términos de taxonomía en común)

2

Estoy tratando de escribir un nuevo widget de "publicaciones relacionadas" (para la vista de una sola publicación) para mi tipo de publicación personalizada, filtrando por términos de taxonomía personalizados que las publicaciones relacionadas deben tener en común con la publicación actual. Encontré esta solución .

Pero lo que me gustaría agregar es que las publicaciones están ordenadas por relevancia. Determino la relevancia por el número de términos de taxonomía que tienen en común: cuanto más términos de taxonomía en común, más relevantes.

Ejemplo: la publicación actual tiene las etiquetas (1), (2), (3) y (4). Una publicación relacionada con las etiquetas (1), (3) y (4) es más relevante que una publicación relacionada solo con las etiquetas (1) y (2).

Además, si es posible, me gustaría agregar un énfasis / severidad especial a uno de los términos de taxonomía personalizados (que asumo que es el término "principal" de una publicación).

Ejemplo: la publicación actual tiene las etiquetas (1), (2), (3) y (4). (1) es el término principal del post. Las publicaciones solo deben mostrarse como publicaciones relacionadas, si tienen al menos este término principal en común. Una publicación relacionada con las etiquetas (1) y (3) es más relevante que una publicación relacionada con la etiqueta (1) solamente. (Opcional: una publicación con las etiquetas (2), (3) y (4) no se considera una publicación relacionada) o: esta publicación tiene una relevancia menor que cualquier publicación que tenga el término principal (1) en común.)

¿Puedes ayudarme con esto por favor? ¡Gracias por adelantado! :)

Saludos, René

    
pregunta René Schubert 29.11.2012 - 20:18

1 respuesta

4

Ordenar tus publicaciones por relevancia

Esto deberá agregar una propiedad adicional a cada publicación. Que ordene el objeto por esta nueva prperty. El truco consiste en ordenar las publicaciones directamente en el objeto de consulta.

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

}

Esto generará las publicaciones ordenadas por tu relevancia calculada.

Severity/Emphasis

Calcular una gravedad o un énfasis es solo un grupo de if then else blocks.

Pseudo código:

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

}

Pero, ¿cómo quieres marcar un término como 'término principal'?

    
respondido por el Ralf912 29.11.2012 - 22:25

Lea otras preguntas en las etiquetas