programing

잘못된 디코딩으로 인해 특수 문자에 대한 워드프레스 검색에 실패했습니다.

subpage 2023. 3. 15. 19:35
반응형

잘못된 디코딩으로 인해 특수 문자에 대한 워드프레스 검색에 실패했습니다.

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

반응형