bezbeli
  • 0
Новичок

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

  • 0

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

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

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

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

Share
  1. каков ваш поисковый запрос/фильтр?

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

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

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

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

    • 0

Оставить ответ

You must login to add an answer.