我有一个表单,我将所有与帖子相关的术语列为复选框,用户应该选择其中的几个,点击搜索并获得所有与所选术语匹配的帖子。当有符合搜索条件的帖子时,它非常有效。我的问题是如何显示匹配项很少的帖子,以及如何根据匹配数对结果进行排序。非常感谢您的帮助。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\\u 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\\u tax。php中有规则循环。
SO网友:Bainternet
我能想到的唯一方法是创建一个二维数组,其中包含要输出的结果和匹配标记的数量。
例如:
$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\'];
}
这是未经测试的,请尝试并报告。