Достаточно ли sanitize_title для создания пост-слагов?

16

Я хочу создать слаг для некоторых строк без прохождения потока генерации слагов WordPress. Поэтому я хочу знать, какие функции он вызывает, чтобы получить аккуратный слаг. Я попытался sanitize_title (), но он оставляет% c2% a0 в результате.

болельщик
источник

Ответы:

27

Вы почти там. Вам нужна функция sanitize_title_with_dashes ($ title)

Brady
источник
1
Хотя это определенно кажется правильным, мне немного неясно, что sanitize_title_with_dashes, по-видимому, делает по-другому sanitize_title. sanitize_title также добавляет тире, где есть пробел ...
Тим Мэлоун
7
Если вы проверите кодекс WordPress для sanitize_title_with_dashes ($ title) , вы увидите заметку «он не заменяет специальные символы с акцентом», что означает, что такие символы, как èäçи т. Д., Останутся на месте с этой функцией.
Джоффманн
Обратите внимание, что sanitize_title_with_dashesтак же sanitize_titleоставляйте некоторые специальные символы, которые могут сломать некоторые системы. Если вы хотите более универсальный подход к сокращению строк, взгляните наsanitize_html_class
GDY
2

Ну, ответ уже есть, но я хотел его немного расширить, поэтому вот мои выводы:

Если мы посмотрим на wp_insert_post()то, что мы видим, то $post_nameего дезинфицируют, используя wp_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()вполне достаточно.

websupporter
источник
2

sanitize_title() кажется, единственный, что вам нужно.

В строке 211 wp-includes / default-filters.php вы найдете:

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

Это означает, что при вызове sanitize_title()сначала будут удалены все специальные символы, затем будет применен sanitize_titleфильтр, таким образом, вызовsanitize_title_with_dashes()

Как отметил @JHoffmann, простое обращение sanitize_title_with_dashes()не удалит специальные символы.

Жюль
источник
Это должен быть правильный ответ
bysanchy
0

В дополнение к отличному ответу websupporter я нашел следующее:

В зависимости от вашего использования это будет зависеть от того, что вам нужно.

sanitize_title() как говорится:

удаляются акценты (акцентированные символы заменяются неакцентированными эквивалентами)

... и sanitize_title_with_dashesговорит:

Обратите внимание, что он не заменяет специальные символы с акцентом

Итак, с этим примером строки:Â+Ä Ö %%% ßá %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~ èäç

sanitize_title() результат:

аа-о-SA-% 20-оо-р -_- EAC

Как вы можете видеть, он заменил акцентированные символы их неакцентированными эквивалентами и удалил все другие не алфавитно-цифровые символы, кроме тех, %за которыми следует число, но вы увидите, что он был удален, когда за ним следовала буква; возможно, это потому, что он воспринимает это как уже закодированное . Это применяется, когда вы пытаетесь вставить %c3в вашу строку, она не удаляется, как %c3допустимая последовательность кодирования.

sanitize_title_with_dashes результат:

% C3% а2% с3% A4-% с3% b6-% C3% 9F% с3% A1-% 20-оо-р -_-% с3% а8% с3% а4% с3% а7

Итак, как вы можете видеть, он не удаляет акцентированные символы, а кодирует их.

Теперь давайте посмотрим на строку без акцентированных символов, чтобы увидеть, как они оба ведут себя ...

Пример строки: %%% building %20 oo %pp + -_^^#@!**()=[]|\/\'"<>?``~'

sanitize_title() результат:

20% здание-оо-рр-_

sanitize_title_with_dashes результат:

20% здание-оо-рр-_

Итак, как вы можете видеть, они точно такие же. Таким образом, похоже, единственное различие в них состоит в том, что один кодирует акцентированные хартии, а другой заменяет их.

Brett
источник