관련성별로 워드프레스 검색 정렬
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
'source' 카테고리의 다른 글
| C#에 JSON 파일을 쓰는 방법 (0) | 2023.02.07 |
|---|---|
| Uncaught TypeError: null wp-embed.min.js의 속성 'secret'을 읽을 수 없습니다. (0) | 2023.02.07 |
| 커스텀 투고가 저장 또는 갱신될 때마다 트리거되는 WordPress에서 사용할 수 있는 액션은 무엇입니까? (0) | 2023.02.07 |
| WP_DEBUG_LOG가 true로 설정되어 있으면 debug.log에 디버깅 출력이 표시되지 않습니다.이유는 무엇입니까? (0) | 2023.02.07 |
| POST JSON이 415 Unsupported media type, Spring 3 mvc로 실패합니다. (0) | 2023.02.07 |