web-dev-qa-db-ja.com

Sanitize_titleはポストスラッグを生成するのに十分ですか?

WordPressのスラグ生成フローを経由せずに、いくつかの文字列に対してスラグを生成したい。したがって、私はそれがきちんとしたスラグを取得するためにそれが呼び出す関数を知りたいです。 sanitize_title()を試しましたが、結果として%c2%a0のままになります。

15
a_fan

あなたはもうすぐそこにいます。あなたが必要とする機能は sanitize_title_with_dashes($ title) です。

26
Brady

sanitize_title()があなたが必要とする唯一のもののようです。

Wp-includes/default-filters.phpの211行目には、

add_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10, 3);

つまり、sanitize_title()を呼び出すと、最初にすべての特殊文字が削除され、次にsanitize_titleフィルタが適用され、sanitize_title_with_dashes()が呼び出されます。

@JHoffmannが指摘したように、単にsanitize_title_with_dashes()を呼び出しても特殊文字は削除されません。

2
Jules

まあ、答えはもうありますが、私はそれを少し広げたいと思ったので、ここに私の発見があります:

wp_insert_post()を見れば、$post_namewp_sanitize_title()を使用してサニタイズされます( wp-includes/post.php を参照)

関数sanitize_title()には、フィルタsanitize_titleがあります。デフォルトのフィルタではsanitize_title_with_dashes()がこのフィルタにフックされているのでこれは面白いです( wp-includes/default-filters.php を見てください)。

<?php
echo sanitize_title( 'Â+ÄÖßáèäç' ) // aaeoessaeaec
?>

Sanitize_title()を試しましたが、結果として%c2%a0のままになります。

これは奇妙に聞こえます。入力値を知ることは素晴らしいことですが、wp_insert_post()sanitize_title()に従うことで十分であるように思われます。

1
websupporter

Websupporterの素晴らしい answer に加えて、私は以下を見つけました:

使用法に応じて、必要なものに依存します。

sanitize_title()のとおり:

アクセントが削除されます(アクセント記号付きの文字は、アクセント記号のない同等のものに置き換えられます)

...そしてsanitize_title_with_dashesのコメント:

は特別なアクセント付き文字を置き換えないことに注意してください

したがって、このexample文字列ではÂ+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~ èäç

sanitize_title()結果:

aa-o-sa-%20-oo-pp -_- eac

ご覧のように、replacedアクセント付き文字とそれに対応する非アクセント記号およびがすべて削除されています数字が後に続く%以外の英数字以外の文字。ただし、文字の後に削除されたことがわかります。おそらく、これは すでにエンコードされている として認識しているためです。これは、%c3が有効なエンコードシーケンスであるため、%c3を文字列に挿入しようとすると強制されます。

sanitize_title_with_dashes結果:

%c3%a2%c3%a4-%c3%b6-%c3%9f%c3%a1-%20-oo-pp -_-%c3%a8%c3%a4%c3%a7

ご覧のとおり、アクセント付き文字は削除されておらず、エンコードされています。

noアクセント付き文字を含む文字列を見て、両方の動作を確認しましょう...

文字列の例:%%% building %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~'

sanitize_title()結果:

building-%20-oo-pp-_

sanitize_title_with_dashes結果:

building-%20-oo-pp-_

あなたが見ることができるように、それらは正確に同じです。したがって、それらの唯一の違いは、1つencodesがアクセント付きチャーターで、もう1つreplacesであるということです。

0
Brett