2016-08-11 5 views
18

Wordpress検索機能を実装しています。私はテキストを検索すると は「部門の」それは今 不適切なデコードのためにWordpress検索が特殊文字で失敗しました

をさらに調査するために、「結果が見つかりません」を返し、 (ポストの1のテキストがあるが)、私はコアファイルをチェックする: wp-/query.php =>関数parse_search()

が含まれており、$用語はとしてエンコード受信されたことがわかった:課\ XE2 \ X80 \ x99s

今、この用語が正しく復号されません。最終的なSQL文は、
(((test_posts.post_title LIKE '%Division \ xe2 \ x80 \ x99s%')または(test_posts.post_content LIKE '%Division \ xe2 \ x80 \ x99s%')))

です。

したがって、特殊文字を含む用語を正しく検索するには、特殊文字をデコードする必要があります。以下のような

復号方法:

  • $文字列= urldecode($文字列);
  • $ 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> 

は今、彼らはURLエンコードを取得し、その同じURLエンコード文字列がテキストフィールドに移入されていません百分率などで表します。

この場合、

$search_query = !empty($search_query) ? trim(sanitize_text_field(urldecode($search_query))) : ''; 

文字列が正しくない文字列に問題はなくなりましたが、現在は検索結果が存在しないという問題があります。

Wordpress Searchでこの問題を解決するにはどうすればよいですか?

のwp-config.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> 

define('DB_CHARSET', 'utf8'); 
define('DB_COLLATE', ''); 

header.phpのは、以下が含まれています。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つの結果が見つかるようにしたいのですが、現在は結果が見つかりません。

+1

それはエンコードについてではなく、その約charsets、使用[utf8](http://stackoverflow.com/questions/279170/utf-8-all-the-way-through) –

+0

私はこれに遭遇していないクリーンなWordPressのインストールの前に。あなたの質問に追加する必要があるいくつかの詳細は、カスタムの投稿タイプを使用しているのか、これがデフォルトの投稿タイプなのか、あなたの知識の中で最高です。私の知る限り、wordpressは投稿のタイトル、タグ、カテゴリのみを検索し、ポストボディは検索しません(私は間違っているかもしれませんが、検索結果と同様の問題があって、 。 @Lashaneが指摘したように、これがカスタムなものなら、UTF-8はおそらく答えでしょう。 – Shawn

+0

データベースに表示されている用語を入力してください。そうすれば、私たちが探しているものと比較して、同じであるかどうかを見ることができます。 –

答えて

9

あなたは検索クエリをデコードする必要があります。ここで私はそれをどのように動作させ、魅力のように動作させるのですか?これで検索結果が返されますが、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の一部である何かのために、適切に動作することでした。

関連する問題