Достаточно ли функции sanitize_title для генерации слагов записей?

6 июл. 2011 г., 17:27:29
Просмотры: 28.2K
Голосов: 30

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

0
Все ответы на вопрос 4
4
32

Вы почти у цели. Функция, которая вам нужна, это sanitize_title_with_dashes( $title )

6 июл. 2011 г. 18:03:26
Комментарии

Хотя это определенно выглядит правильно, мне не совсем понятно, чем sanitize_title_with_dashes отличается от sanitize_title. sanitize_title также добавляет тире вместо пробелов...

Tim Malone Tim Malone
24 июл. 2015 г. 05:31:55

Если вы проверите WordPress Codex для функции sanitize_title_with_dashes( $title ), вы увидите примечание 'она не заменяет специальные символы с акцентами', что означает, что символы типа èäç и т.п. останутся на месте при использовании этой функции.

JHoffmann JHoffmann
26 авг. 2015 г. 11:43:25

Обратите внимание, что sanitize_title_with_dashes, как и sanitize_title, оставляют некоторые специальные символы, которые могут нарушить работу некоторых систем. Если вам нужен более универсальный подход к преобразованию строк, взгляните на sanitize_html_class

GDY GDY
27 февр. 2019 г. 17:01:52

Этот ответ неверен, как объяснено в комментариях, и автор должен обновить его, возможно, лучше сославшись на более правильный ответ, например https://wordpress.stackexchange.com/a/294587/27896

Tyler Collier Tyler Collier
12 июн. 2024 г. 23:18:19
1
14

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() не удалит специальные символы.

20 февр. 2018 г. 12:25:23
Комментарии

Это должен быть правильный ответ

bysanchy bysanchy
23 июл. 2018 г. 11:14:52
0

Что ж, ответ уже есть, но я хотел немного его расширить, так что вот мои находки:

Если мы посмотрим в 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() кажется достаточным.

10 янв. 2017 г. 14:58:22
0

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

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

sanitize_title(), как указано:

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

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

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

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

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

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

Как видите, он заменил акцентированные символы их неакцентированными эквивалентами и удалил все остальные неалфавитно-цифровые символы, кроме %, за которым следует число. Но вы заметите, что он удалил его, когда за ним следовала буква; возможно, это происходит потому, что он воспринимает это как уже закодированное. Это подтверждается, когда вы пытаетесь вставить %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

Как видите, он не удалил акцентированные символы, а закодировал их.

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

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

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

building-%20-oo-pp-_

Результат sanitize_title_with_dashes:

building-%20-oo-pp-_

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

30 июл. 2018 г. 18:53:10