web-dev-qa-db-ja.com

WordPressのポストスラッグがアクセントを許可しないのはなぜですか?

à 漢語 title thingのようにタイトルにアクセントが含まれ、他のUnicode文字が含まれている投稿を作成すると、そのスラッグ(パーマリンク)はa-漢語-title-thing...になります。つまり、àは通常のaに変換されます。無傷のままでした。 WordPressがアクセントの付いた文字をそのままにしないのはなぜですか?私はWordPressにそれらを一人にしておくように言うためのコードスニペットを作成しました

function mn_sanitize_title($modified_title, $original_title, $context)
{
    // the $modified_title may have had accents removed, but not the $original_title
    return $original_title;
}
// set this filter to run BEFORE WP already ran the title through `sanitize_title_with_dashes`
add_filter('sanitize_title', 'mn_sanitize_title', 5, 3);

そしてそれはうまく機能するようです(アクセントのついた文字はポストスラッグにそのまま残されています)ので、なぜWordPress開発者がポストのスラッグからアクセントのついたキャラクターを削除したのでしょう?

3
thespacecamel

sanitize_title() 関数はすぐに remove_accents() を使います。これらの関数はどちらもv1.2.1以下にまでさかのぼります。 remove_accents()関数はいくつかの特定の言語で少数の文字を明示的に置き換えるためのアクセント文字のハードコードされたリストです。インラインコメントと 関数参照 は単にこう言います:

すべてのアクセント文字をASCII文字に変換します。

RFC 3986によると、有効なURL はASCIIのみです。

だから(私はこれの証拠を見つけることができませんが)私はここで起こっていることはちょうど 少数 ほぼASCII文字を含む言語のためのASCII有効URLを作るためにアクセント文字を置き換えることです。そして、これは遡りから始まっているということ。

無効なURL /à-b-c/は(有効なエンコードされた/a-b-c/タイトルではなく)有効な/%wtv-b-c/になります。


なぜ漢字(ASCIIではない)がWordPressによって置き換えられたり、取り除かれたり、あるいはエンコード/エスケープされなかったのかは、意図的なようです。繰り返しになりますが、これに関するドキュメントはありませんが、前述のアクセント文字のように、その文字がascii-validに近づくことさえないので、それらを置き換えるものは何もありません。 URLをエスケープするのはばかげていて、ほとんど使えないでしょう。そして このスレッド全体 、そして特に この記事 は、URLのこれらの文字にいくつかの光を当てました:

[非ASCII文字を含むアドレス]はURIではありません(したがって、URLではありません。URLは URIの一種です )。私たちが既存のIETF標準の用語に忠実であると考えるならば、私たちは RFC 3987 で定義されるようにそれらをIRI(Internationalized Resource Identifiers)と正しく呼ぶべきですIRIのすべての非ASCII文字をパーセントエンコードします。

だから私はWordPressがこれらの文字のためのハンドラを持っていないと仮定するだろう、それはこれらの場合ユーザとブラウザに任せているが、それは初期の頃からアクセントを片付けてきた。

(私はこの答えが質問を満足させないことを理解しています、しかしうまくいけばそれはあなたの答えに近づけるためにもう少し情報を提供します)。

4
David Sword

すでに1つの「回答」があるので、推測だけではありませんが、独自の「回答」を追加します。

重要な側面は、10年以上前のi18nの状態です。これは、Web関連ソフトウェアだけでなく、OS自体にも当てはまります。当時IDNはまだ標準ではなく、WebはASCII指向でした。i18nでWebを改善することは、ほとんどの主要なOSがすぐにサポートしなかったためです。たとえば、ヘブライ語をサポートするウィンドウが必要な場合は、特別なバージョンを購入するか、言語パックをインストールする必要がありました。ただし、適切な言語パックをすべてインストールしていても、ブラウザにはバグがあり、chromeより前の時代にはブラウザに新しいバージョンがあり、WebサーバーにもURLの適切な処理と適切なバグがありましたそれらをPHPレイヤーに渡します。

ラテンスクリプトの解決策は簡単で、ASCII以外のものを音声的に正しいASCII等価に変換するだけです。同様のアクセントの問題がありますが、コードはヘブライ語を処理しないことを非常に伝えています。ヘブライ語についての私の推測は、両方のアクセントは通常読まれるテキストではそれほど重要ではないということです(若い年齢で単語を理解することに基づいてアクセントを「想像」することを学んでいる子供、そして実際にそれらを必要とする場所は外国語のテキスト言語は、たとえば yiddish )のヘブライ語スクリプトを使用しており、Webがイスラエルで実際に使用され始めた頃には、これらのバグはほとんど修正されていました(ただし、 4.4でのみデフォルトになったかなりのパーマリンクを使用しない、または英語でスラッグを使用することによる問題)。

今では、関数が何かに役立つとは思わず、wordpressコードの他の部分と同様に、慣性の一部として維持され、実際のニーズに基づいていません。

4
Mark Kaplun