source

관련성별로 워드프레스 검색 정렬

itover 2023. 2. 7. 19:46
반응형

관련성별로 워드프레스 검색 정렬

ATM에서 작업하고 있는 워드프레스 사이트에 대한 고급 검색을 만들었습니다.방문자는 다른 분류법에 따라 결과를 필터링하고 날짜 또는 사용자 지정 필드 및 일반 자유 텍스트 검색(WP에서 기본적으로 제공)별로 정렬할 수 있습니다.

이 을 이업 the the를 하여 수행했습니다.pre_get_posts필터링을 하고 쿼리에 내 데이터를 추가하는 것만으로 다음과 같은 일이 발생합니다. (온전성 검사 및 기타 코드가 누락되어 있습니다.)

<?php
add_filter('pre_get_posts', 'my_search');

function my_search ($qry) {
    # Include more post types
    $qry->set('post_type', array('foo', 'bar'));

    if ($_GET['myorder'] == 'price') {
        $qry->set('orderby', 'meta_value_num');
        $qry->set('meta_key', 'price');
        $qry->set('order', 'ASC');
    }
    else {
        $qry->set('orderby', 'date');
        $qry->set('order', 'DESC');
    }
}

이제 투고를 정렬하는 다른 방법, 즉 관련성을 추가하고자 합니다.이것은 매우 일반적인 요청이며, 제가 본 문제의 해결책의 대부분은 Relevansi 플러그인을 사용하는 것입니다.제가 이미 "플러그인"(적어도 코드)을 작성했고, 모든 검색 폼과 목록이 이를 사용하도록 설정되어 있기 때문에, 이 시점에서 Realvansi로 전환하는 것은 쉽지 않을 것입니다.

Soooo씨, 제가 가지고 있는 코드로 간단하게 추가할 수 있는 방법을 알고 싶은 사람이 있습니까?

는 WP를 사용하여 있습니다.LIKEMATCH()그래서 관련성 점수조차 없는 거죠이게 맞다면 제가 직접 질문을 작성해야 할 것 같습니까?어떻게 하면 WP의 페이지 번호부여 등을 망치지 않고 할 수 있을까요?아니면 이런 걸 더해도 될까요?$qry->set('WHERE', "MATCH(post_content) AGAINST('$q' IN BOOLEAN MODE) AS relevance"); $qry->set('sortby', 'relevance')렇게게생?생 각??

쓸 수 있을 것 같아요.Relevanssi 없이, 사용할 필요가 filter후크, 자세한 내용은 realvanssi_disc_wp_disc를 확인하십시오.다음 코드를 확인하십시오.

function func_reli($qry){
    $qry->set( 'post_type', array( 'post', 'page', 'restaurant', 'products' ) );

    if ($_GET['myorder'] == 'price') {
        $qry->set('orderby', 'meta_value_num');
        $qry->set('meta_key', 'price');
        $qry->set('order', 'ASC');
    }
    else {
        $qry->set('orderby', 'date');
        $qry->set('order', 'DESC'); // <-- set (in your code 'add' is used)
    }
    return $qry; // <-- must return, in your code you didn't
}
add_filter('relevanssi_modify_wp_query', 'func_reli');

이 코드를 테스트해 본 결과, 정상적으로 동작하고 있습니다.에서는 '우리'를 'restaurant' ★★★★★★★★★★★★★★★★★」'products'커스텀 투고 타입과 검색은, 적절한 결과만 있으면, 매우 정상적으로 동작합니다., 하다, 하다, 하다, 하다, 라고 하는 에도 사용할 수 있습니다.php 5.3+ 되어 있다

add_filter('relevanssi_modify_wp_query', function($qry){
    // Same code
});

또한 Reelvansi 플러그인을 사용하는 경우 설정 페이지를 사용하여post_type(이것을 사용하지 않고)$qry->set( 'post_type', array(...) )을 참조해 주세요.functions.phpfilename을 클릭합니다.

Screw 샷은 다음과 같습니다.

여기에 이미지 설명 입력

네, 결국 Realvansi를 사용하게 되었습니다.하지만 몇 가지 수정을 가했습니다.

때문에 에 대한 쉬웠습니다. 할 은 제 이름인 Realvansi의 이었습니다.제가 해야 할 일은 제 이름을 바꾸는 것이었습니다.<select>분류학 이름에 대한 요소 + 값을 슬래그로 변경합니다.

<select name="custom_taxonomy">
    <option value="some-term">Some term</option>
    ...
</select>

번째,로 정렬할 수 하기 째,, 필 second스,,,, the the 를 사용해야 했습니다.relevanssi_hits_filter필터링을 실시합니다.와는 달리pre_get_posts또는relevanssi_modify_wp_query이 필터는 WP_Query 객체가 아닌 투고 배열을 통과합니다.WP_Query 오브젝트를 사용하려고 했을 때 오더는 단순히 변경을 거부했습니다.여기 기본적인 방법은 다음과 같습니다.relevanssi_hits_filter:

<?php
add_filter('relevanssi_hits_filter', 'h5b_hits_filter');

function h5b_hits_filter ($hits) {
    global $wp_query;

    if (isset($wp_query->query_vars['orderby']) and $wp_query->query_vars['orderby'] == 'price') {
        if (count($hits[0])) {
            usort($hits[0], 'h5b_sort_by_price');
        }
    }

    return $hits;
}

function h5b_sort_by_price ($a, $b) {
    $priceKey   = 'price';
    $aPrice     = get_post_meta($a->ID, $priceKey, true);
    $bPrice     = get_post_meta($b->ID, $priceKey, true);
    $aPrice     = $aPrice ? $aPrice : 10000000;
    $bPrice     = $bPrice ? $bPrice : 10000000;

    if ($aPrice == $bPrice) {
        return 0;
    }

    return ($aPrice < $bPrice) ? -1 : 1;
}

또, 이전의 투고에서는, 「가격」키가 검색시에 표시되지 않았던 문제도 도움이 되었습니다.지금은 그렇습니다. 제가 "10000000"이라고 부르는 이유는 가격이 있는 제품 뒤에 나타나기 위해서입니다.

마지막으로 빈 검색도 필요했습니다.Reelvansi dev에 따르면 Premium 버전에서만 지원되지만, 어떻게든 대응했다고 생각합니다.먼저 WP에 검색 페이지를 표시하도록 강제했습니다.

<?php
add_filter('request', 'h5b_allow_empty_search');

function h5b_allow_empty_search ($qryVars) {
    if (isset($_GET['s']) and empty($_GET['s'])) {
        $qryVars['s'] = ' ';
    }

    return $qryVars;
}

둘째, Relevansi에게 ?s가 비어 있으면 모든 투고를 가져오라고 했습니다.기본적으로는 투고는 전혀 가져오지 않습니다.불행히도 이 작업을 하면서 커스텀 분류법에 의한 디폴트 동작이 정지되어 버렸습니다(내 코드는 그것을 덮어썼습니다).그래서 이 코드의 분류법도 수동으로 확인해야 했습니다.

<?php
add_filter('relevanssi_hits_filter', 'h5b_allow_empty_search_filter');

function h5b_allow_empty_search_filter ($hits) {
    if (isset($_GET['s']) and empty($_GET['s']) and !count($hits[0])) {
        $taxQry = array('relation' => 'AND');

        if (!empty($_GET['custom_taxonomy'])) {
            $taxQry[] = array(
                'taxonomy' => 'custom_taxonomy', 
                'field' => 'slug', 
                'terms' => $_GET['custom_taxonomy']
            );
        }

        $args = array(
            'numberposts' => -1, 
            'post_type' => 'any'
        );

        if (count($taxQry) > 1) {
            $args['tax_query'] = $taxQry;
        }

        $hits[0] = get_posts($args);
    }

    return $hits;
}

그리고 이것이 마지막입니다.모든 것이 잘 되는 것 같고, 이것이 미래에 비슷한 요구를 하는 사람에게 도움이 되기를 바란다.

앞으로 WP가 터무니없는 검색을 개선했으면 좋겠다.관련성에 따른 정렬은 세계에서 가장 인기 있는 CMS imo에서 사용할 수 있어야 합니다.

@Sheikh Heera가 나를 올바른 방향으로 인도해줘서 고마워.당신이 제안한 것을 사용할 수 없어서 누구에게 정답을 말해야 할지 모르겠어요.

WP가 이미 이 내용을 핵심으로 하고 있다는 걸 방금 알았어요.

https://developer.wordpress.org/reference/classes/wp_query/,에서 "orderby" = > "displayed" 파라미터를 확인합니다.

검색어로 다음 순서로 정렬합니다.첫 번째, 문장 전체가 일치하는지 여부입니다.두 번째, 모든 검색어가 제목 안에 있는 경우.세 번째, 제목에 검색어가 나올 경우.그리고 넷째, 전체 문장이 나오는 경우입니다.

언급URL : https://stackoverflow.com/questions/17712388/sort-wordpress-search-by-relevance

반응형