잘못된 디코딩으로 인해 특수 문자에 대한 워드프레스 검색에 실패했습니다.
Wordpress 검색 기능을 구현하고 있습니다."Division's"(투고 중 하나에 있는 텍스트)를 검색하면 "No results found"가 반환됩니다.
더 자세히 조사하기 위해 코어 파일 wp-files/files.files parse_search()를 확인했습니다.
그리고 $term이 다음과 같이 인코딩된 상태로 수신되었음을 발견했습니다: Division\xe2\x80\x99s
이제 이 용어는 제대로 해독되지 않았습니다.마지막으로 작성된 SQL 문은 다음과 같습니다.
(((test_module).post_title LIKE '%Division\xe2\x80\x99s%' 또는 (test_posts).post_content Like '%Division\xe2\x80\x99s%')
그래서 특수문자를 해독해서 특수문자로 검색도 잘 할 수 있도록 하고 싶습니다.
다음과 같은 디코딩 방법:
- $string = urldecode string);
- $string = html_syslog_syslogstring);
- $string = rawuldecode ($string);
- $string = base64_substring);
- $string = utf8_substring);
동작하지 않았다.도움이 되는 플러그인/훅/방법이 있나요?
제공된 예:
간단하죠.searchform.php
파일링:
if (!defined('ABSPATH')) exit(0);
global $wp_query;
$search_query = get_search_query();
$error = get_query_var('error'); ?>
<form role="search" method="get" class="search-form form-inline" action="<?php echo esc_url(home_url('/')); ?>">
<input id="mod-search-searchword" type="search" size="30" class="inputbox search-query search-field" placeholder="search products, content" value="<?php echo !empty($search_query) && empty($error) ? $search_query : ''; ?>" name="s" title="Search for:" />
<input type="submit" class="button btn btn-primary" value="Search" />
</form>
자, 이렇게 문자를 입력하면()
urlencoded를 취득하여 같은 urlencoded 문자열이 퍼센티지 등으로 텍스트필드에 입력되지 않습니다.
이렇게 하면:
$search_query = !empty($search_query) ? trim(sanitize_text_field(urldecode($search_query))) : '';
아직 문제가 있지만 텍스트 입력에 올바른 문자열이 없는 문제가 아니라 검색 결과가 없는 문제가 발생합니다.
Wordpress Search에서 이 문제를 해결하는 방법
wp-config.php에는 다음이 포함됩니다.
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
header.timeout에는 다음이 포함됩니다.
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=3.0, user-scalable=yes"/>
<meta name="HandheldFriendly" content="true" />
<meta name="apple-mobile-web-app-capable" content="YES" />
<link rel="shortcut icon" href="<?php echo get_stylesheet_directory_uri(); ?>/favicon.ico" type="image/vnd.microsoft.icon" />
<title><?php wp_title(' - ', true, 'right'); ?></title>
<?php wp_head(); ?>
</head>
제 직무에는 다음과 같은 것이 있습니다.php 파일:
function livchem_searchfilter($query) {
global $search_query;
if ($query->is_search && !is_admin()) {
// check if length of query > 3 but < 200
$search_query = trim(get_search_query());
$search_length = strlen($search_query);
if ($search_length < 3 || $search_length > 200)
{
$query->set('error', 'Search term must be a minimum of 3 characters and a maximum of 200 characters.');
return $query;
}
else
{
$query->set('post_type', array('post', 'page', 'product'));
$query->set('posts_per_page', 20);
}
}
return $query;
}
add_filter('pre_get_posts','livchem_searchfilter');
UTF-8 인코딩을 charset afaik로 사용하고 있습니다.문제, 검색 이유:copper(i)/(ii)
돌아오는?s=copper%2528i%2529%252F%2528ii%2529
이 URL에서 2개의 결과가 나와야 하는데 0개의 결과가 나와야 해요. 왜요?
URL을 다음과 같이 변경했을 경우:?s=copper(i)/(ii)
두 가지 결과가 나왔네요.그런데 왜 결과 및/또는 URL을 얻을 수 없습니까?솔직히 URL 구조가 무엇인지에 대해서는 별로 신경 쓰지 않지만, 다음과 같이 입력할 때 2개의 결과가 나왔으면 합니다.copper(i)/(ii)
검색 양식에 포함되지만 현재 검색 결과를 찾을 수 없습니다.
검색 쿼리를 디코딩해야 합니다.이것이 어떻게 동작하고 있는지 설명하겠습니다.이것이 바로 마법처럼 기능하는 방법입니다.이렇게 하면 검색 결과가 반환되지만 URL은 인코딩된 상태로 유지되므로 문제 없습니다.
function livchem_search_filter($s) {
return urldecode($s);
}
add_filter('get_search_query', 'livchem_search_filter');
add_filter('the_search_query', 'livchem_search_filter');
function livchem_query_vars_search_filter($query)
{
if ($query->is_search && !is_admin()) {
$query->query_vars['s'] = urldecode($query->query_vars['s']);
}
return $query;
}
add_action('parse_query', 'livchem_query_vars_search_filter');
게다가 이것은 패스 관련 검색에도 유효하기 때문에, 다음의 항목을 .htaccess 에 추가했을 경우.
RewriteCond %{QUERY_STRING} s=(.*)
RewriteRule ^$ /search/%1? [R,L]
은 다음과 /search/searchterm
또한 특수 문자가 포함된 쿼리도 작동합니다.CMS의 일부인 일을 제대로 하는 것이 얼마나 힘들었는지.
언급URL : https://stackoverflow.com/questions/38889007/wordpress-search-failed-on-special-characters-due-to-improper-decode
'programing' 카테고리의 다른 글
WordPress에서 자동으로 페이지 생성 (0) | 2023.03.15 |
---|---|
useReducer 액션이 두 번 디스패치되었습니다. (0) | 2023.03.15 |
TypeScript에서는 강력한 타입의 함수를 파라미터로 사용할 수 있습니까? (0) | 2023.03.15 |
Spring RestTemplate 시간 초과 (0) | 2023.03.10 |
AngularJS - ng-repeat에서 정의되지 않은 속성에 대한 필터? (0) | 2023.03.10 |