Достаточно ли функции sanitize_title для генерации слагов записей?
Я хочу сгенерировать слаг для некоторых строк без использования стандартного процесса генерации слагов WordPress. Поэтому мне нужно знать, какие функции он вызывает для получения аккуратного слага. Я попробовал sanitize_title(), но в результате остаются символы %c2 %a0.
Вы почти у цели. Функция, которая вам нужна, это sanitize_title_with_dashes( $title )
Хотя это определенно выглядит правильно, мне не совсем понятно, чем sanitize_title_with_dashes отличается от sanitize_title. sanitize_title также добавляет тире вместо пробелов...
Tim Malone
Если вы проверите WordPress Codex для функции sanitize_title_with_dashes( $title ), вы увидите примечание 'она не заменяет специальные символы с акцентами', что означает, что символы типа èäç и т.п. останутся на месте при использовании этой функции.
JHoffmann
Обратите внимание, что sanitize_title_with_dashes, как и sanitize_title, оставляют некоторые специальные символы, которые могут нарушить работу некоторых систем. Если вам нужен более универсальный подход к преобразованию строк, взгляните на sanitize_html_class
GDY
Этот ответ неверен, как объяснено в комментариях, и автор должен обновить его, возможно, лучше сославшись на более правильный ответ, например https://wordpress.stackexchange.com/a/294587/27896
Tyler Collier
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-_
Как видите, они абсолютно одинаковы. Таким образом, кажется, что единственное различие между ними заключается в том, что одна кодирует акцентированные символы, а другая заменяет их.