Intereting Posts

Сортировка сообщений по количеству согласованных условий

У меня есть форма, где я перечисляю все условия, связанные с сообщениями, как флажки, пользователь должен выбрать несколько из них, нажать поиск и получить все сообщения, соответствующие всем выбранным условиям. Он отлично работает, когда есть сообщения, соответствующие критериям поиска. Мой вопрос заключается в том, как отображать сообщения, которые имеют только несколько совпадающих терминов и как сортировать результаты по количеству совпадений. Буду признателен за любую оказанную помощь. Thanx.

Так что это форма внутри страницы поиска:

<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"> 

Это то, что я вложил в файл 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"); 

после этого у меня есть только таксономия-my_tax.php с регулярным циклом.

Solutions Collecting From Web of "Сортировка сообщений по количеству согласованных условий"

Ну, единственный способ, о котором я могу думать, – создать массив двух размеров из результатов, которые вы хотите вывести, и количество совпадающих тегов.

так например:

 $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']; } 

это непроверено, поэтому попробуйте и отчитайтесь.