web-dev-qa-db-ja.com

ユーザー名のヘブライ文字に関する問題

私は、ユーザー名にヘブライ文字を使用可能にするためのプラグインを書きました。これは完全なコードです:

add_filter ('sanitize_user', 'hu_sanitize_user', 10, 3);

//Overrides the Wordpress sanitize_user filter to allow hebrew letters and english letters only

function hu_sanitize_user ($username, $raw_username, $strict)
{
//Strip HTML Tags
$username = wp_strip_all_tags ($raw_username);

//Remove Accents
$username = remove_accents ($username);

//Kill octets
$username = preg_replace ('|%([a-fA-F0-9][a-fA-F0-9])|', '', $username);


//Kill entities
$username = preg_replace ('/&.+?;/', '', $username);

if ($strict){
    //Replace
    $username = preg_replace( '[\p{Hebrew}a-zA-Z]', '', $username );
}

//Remove Whitespaces
$username = trim ($username);

// Consolidate contiguous Whitespaces
$username = preg_replace ('|\s+|', ' ', $username);

return $username;

}

これはうまく機能しますが、問題は、ユーザー名の長さが8文字を超える場合、ユーザーリストにユーザーが作成されないことです。ただし、それでもユーザーが作成されたことを示す確認メールが送信されます。名前と電子メールアドレスはメッセージに表示されません。

私が悪いことをしているという考えはありますか?

6
DrMosko

これは完全な答えではありませんが、それはあなたに何らかの方向性を与える試みです。うまくいけばここコミュニティと私たちはあなたのための解決策を思い付くことができます!

最初に、私はあなたの問題を再現することができました:

  1. 私はあなたのコードを取り、今のところ私のテーマのfunctions.phpに入れました。
  2. if( $strict )テストを削除しました
  3. 8文字のヘブライ語の名前を登録してみました - うまくいきました
  4. 私はあなたの機能を削除して再試行しました - 失敗しました(これはあなたの機能が機能することを確認する)
  5. 私はあなたの機能を追加し、9文字のヘブライ語の名前で試してみました - it failed

(ヘブライ語を話さない人は、 Google翻訳 を使って自分の名前をヘブライ語に翻訳した後、文字を削除しました)。

うまくいかなかったとき、私が得たエラーは次のとおりです。

エラー:あなたを登録できませんでした…ウェブマスターに連絡してください!

私は前にこのエラーを見たことがない。 wp-includes/user.php から来ています。この順序で調べていることは、wp_create_user()、したがってwp_insert_user()がfalseまたはエラーオブジェクトを返すことです。

wp_insert_user() はこの作業を手助けするためにプラグインすることができるたくさんのフィルターを持っています。それはこれらのうちの1つをつまずくかもしれません。

あるいは、データベースの問題である可能性があります。 このStackOverflow回答 には、MySQLデータベースでヘブライ文字をサポートするためのいくつかのアイデアがあります。私のテーブルエンコーディングは既にutf8_general_ciに設定されていましたが、私のデータベース自体はそうではありませんでしたので、私はそれを変更し、残念ながらそれは解決しませんでした。また、 wpdb を介してSET NAMESクエリを実行しようとしましたが、そのように動作することを意味していない可能性があります。

ここからどこへ

私はデータベースのエキスパートではないので、これがデータベースの制限であるかどうかわからないので、回避できない可能性があります。今のところ、私はwp_insert_user()が通過するこれらのフィルタのうちの1つに最良の可能性があると思います。

now これらを徹底的に調べてそれがうまくいっている場所を見つけ出す時間はありませんが、うまくいけばこれでうまくいくでしょう。私は見つけることができます。

1
Tim Malone