web-dev-qa-db-ja.com

Wordpressデコードが不適切なため、特殊文字の検索に失敗しました

Wordpress検索機能を実装しています。テキスト "Division's"(投稿の1つにあるテキスト)を検索すると、「結果が見つかりません」と返されます。 「」

さらに調査するために、コアファイルを確認しました:wp-includes/query.php => function parse_search()

そして、$ termが次のようにエンコードされて受信されていることがわかりました:Division\xe2\x80\x99s

現在、この用語は正しくデコードされていません。そして、形成される最終的なSQLステートメントは次のとおりです。
(((test_posts.post_title LIKE '%Division\xe2\x80\x99s%')OR(test_posts.post_content LIKE '%Division\xe2\x80\x99s%' ))))

そこで、特殊文字をデコードして、特殊文字を含む用語も検索できるようにしたいと思います。

次のようなデコード方法:

  • $ string = urldecode($ string);
  • $ string = html_entity_decode($ string);
  • $ string = rawurldecode($ string);
  • $ string = base64_decode($ string);
  • $ string = utf8_decode($ string);

動作しませんでした。役立つプラグイン/フック/メソッドはありますか?

提供例:

ここにある単純な_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.phpには次のものが含まれています。

_<!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>
_

私のfunctions.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');
_

だから、私は私の文字セットafaikとしてUTF-8エンコーディングを持っています。問題は何ですか、なぜ私の検索は次のとおりです:copper(i)/(ii)はURLに_?s=copper%2528i%2529%252F%2528ii%2529_を返しますか?これで2つの結果が見つかるはずですが、0の結果が見つかりました。どうして?

そして、URLを次のように変更すると:?s=copper(i)/(ii)2つの結果が表示されます。しかし、なぜ結果やURLをこのように取得できないのですか?正直なところ、URL構造を気にする必要はありませんが、検索フォームにcopper(i)/(ii)と入力すると、2つの結果が表示されるようにしたいと思いますが、現在は結果が見つかりません。

22
zeetit

さて、検索クエリをデコードする必要があります。これが私がどのように機能し、魅力のように機能するかを示しています。これで検索結果が返されますが、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の一部である何かのために、これが適切に機能するために首の痛みは何でしたか。

9
Solomon Closson