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

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

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

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

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

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

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

Что ж, ответ уже есть, но я хотел немного его расширить, так что вот мои находки:
Если мы посмотрим в 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 я обнаружил следующее:
В зависимости от вашего использования будет зависеть, что вам нужно.
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-_
Как видите, они абсолютно одинаковы. Таким образом, кажется, что единственное различие между ними заключается в том, что одна кодирует акцентированные символы, а другая заменяет их.
