web-dev-qa-db-fra.com

Trier les messages par nombre de termes correspondants

J'ai un formulaire où je liste tous les termes associés aux publications sous forme de cases à cocher, l'utilisateur doit en sélectionner quelques-unes, cliquer sur Rechercher et obtenir toutes les publications qui correspondent à tous les termes choisis. Cela fonctionne très bien quand il y a des posts qui correspondent aux critères de recherche. Ma question est la suivante: comment puis-je afficher des publications contenant peu de termes correspondants et comment trier les résultats en fonction du nombre de correspondances? Toute aide est très appréciée. Merci.

Donc, voici le formulaire dans la page de recherche:

<form action="<?php bloginfo('template_url') ?>/build_search.php" method="post" accept-charset="utf-8">
<?php $terms = get_terms( 'my_tax' );
$checkboxes = '';
foreach($terms as $term) :
    $checkboxes .='<input type="checkbox" name="term[]" value="'.$term -> slug.'" id="term-'.$term->term_id.'" /><label for="term-'.$term->term_id.'">'.$term->name.'</label>';
endforeach;
print $checkboxes;
?>
<input id="submit" type="submit" value="Search">

C'est ce que j'ai mis dans le fichier build_search.php

if (isset($_POST["term"])){ $terms_array = array(); $terms_array = $_POST["term"]; foreach ($terms_array as $key => $value) { $string .= $value.'+'; } $terms_string = substr($string, 0, -1); $term = $terms_string; } else { $term = ""; } $url = header("Location:/?my_tax=$term");

après cela, je n'ai plus que taxonomy-my_tax.php avec une boucle régulière.

3
Bezbeli

Le seul moyen auquel je puisse penser est de créer un tableau à deux dimensions des résultats que vous voulez afficher, ainsi que le nombre de balises correspondantes.

ainsi par exemple:

$results = array();
$searched_tags = $_post['my_tax'];
$searched_tags = explode("+", $searched_tags);
while (have_posts()){
    $the_post();
    $result['r'] = '<div class="post">
    <div class="title"><h2><a href="'.get_permalink($post->ID).'" title="'.get_the_title($post->ID).'">'.get_the_title($post->ID).'</a></h2></div>
    <div class="excerpt">'.get_the_excerpt().'</div>
    </div>';
    //get current posts terms of the taxonomy
    $current_post_terms = wp_get_object_terms( $post->ID, 'my_tax', array('orderby' => 'name', 'order' => 'ASC', 'fields' => 'names'));
    $matchs = 0;
    //check and count matchs
    foreach ($current_post_terms as $t){
        if (in_array($t,$searched_tags){
            $matchs = $matchs + 1;
        }
    }
    $result['m'] = $matchs;
    //save results to array
    $results[] = $result;
}
//then sort array by matchs count
//quick sorting function
function cmp($a, $b) {
    if ($a['m'] == $b['m']) {
        return 0;
    }
    return ($a['m'] > $b['m']) ? -1 : 1;
}
//the actuall array sort
uasort($results, 'cmp');
foreach ($results as $result){
    echo $result['r'];
}

ceci n'a pas été testé, alors essayez de faire rapport.

1
Bainternet