Как WordPress генерирует URL-слагов?

17

Есть ли где-нибудь страница, где подробно описывается, как WordPress генерирует слагов для URL? Я пишу скрипт, который должен генерировать URL-слагов, идентичных тем, которые генерирует WordPress.

Джордж Эдисон
источник
Ответы на этот вопрос теперь устарели - вместо этого используйте codex.wordpress.org/Function_Reference/wp_unique_post_slug .
SinisterBeard

Ответы:

16

Я не могу дать вам страницу / учебник / документацию о том, как генерируются WP-слагы, но взгляните на sanitize_title()функцию.

Не поймите неправильно название функции, оно не предназначено для очистки заголовка для дальнейшего использования в качестве заголовка страницы / поста . Он берет строку заголовка и возвращает ее для использования в URL:

  • полоски HTML и PHP
  • полоски специальных символов
  • преобразует все символы в нижние
  • заменяет пробелы, подчеркивания и точки на дефисы / тире
  • уменьшает количество последовательных штрихов до одного

Там может быть крайние случаи , когда ядро делает что - то дополнительное (вы должны смотреть на источник , чтобы убедиться в том , что sanitize_title()будет всегда хватает в генерации точно такой же вы ожидали), но это должно охватывать по крайней мере , 99%, если не во всех случаях ,

Йоханнес Пилле
источник
1
@kaiser: Я подумал, что ты просто влюблен в T5 Rewrite :) (который стоит посмотреть в моей программе) | и вообще: если заголовок действительно длинный, WP также обрезает слагов до определенной максимальной длины. Это один из тех случаев, когда я не совсем уверен, что это делается с помощью sanitize_titleфильтра, применяемого также в функции, или же это обрабатывается чем-то другим после запуска функции.
Йоханнес Пилле
Я думаю, это sanitize_title-фильтр, который нужно проверить. Но есть и другие связанные функции . Я действительно понятия не имел об этом. Иногда кажется, что SimplePieэто легче понять, чем WP_Rewriteвещь. Кстати: Toscho работает над интеграцией функции Monkeyman Rewrite Analyzer в свой плагин. Вот где вещи начинают становиться действительно интересными.
Кайзер
1
Также подумайте о sanitize_title_with_dashes (), если вы хотите быть более откровенным о создании слаг-ориентированного URL-адреса.
Том Оже
5

Вы можете использовать эту функцию:

static public function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('~[^\pL\d]+~u', '-', $text);

  // transliterate
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  // trim
  $text = trim($text, '-');

  // remove duplicate -
  $text = preg_replace('~-+~', '-', $text);

  // lowercase
  $text = strtolower($text);

  if (empty($text)) {
    return 'n-a';
  }

  return $text;
}

Это своего рода, как работает функция wp url sanitize.

Вивек Санчети
источник
4

Ядро к вашим услугам

В WordPress нет встроенного режима разработчикаWP_DEBUG , который в этом случае не сильно вам поможет. В основном WP использует «Rewrite API» , низкоуровневую оболочку для WP_Rewriteкласса, основанную на функциях , о которой вы можете прочитать в Кодексе . global $wp_rewriteОбъект находится в вашем распоряжении , чтобы проверить его или взаимодействовать с классом.

Плагины, которые помогают разобраться в этом.

Toschos "T5 Rewrite" - плагин и Ян Фабрис "Monkeyman Rewrite Analyzer" - плагин поможет вам в этом. Я написал небольшое расширение для «T5 Rewrite», чтобы плавно интегрировать его с «Monkeyman Rewrite Analyzer», который вы можете найти в вики репозитория «T5 Rewrite» здесь, на GitHub .

Плагин Monkeyman добавляет новую страницу, хранящуюся в меню интерфейса администратора в разделе Инструменты . Плагин «T5 Rewrite» добавляет новую вкладку справки на страницу « Настройки» > « Постоянные ссылки» . Мое расширение также добавляет вкладки справки на упомянутую страницу инструментов .

Вот скриншот того, как выглядит содержимое вкладки справки "T5 Rewrite".

введите описание изображения здесь

Vorlage = Шаблон | Beschreibung = Объяснение | Beispiele = Примеры

Примечания

Плагин T5 Rewrite отлично справляется с задачей проверки объекта перезаписи. И это делает еще больше: это добавляет новые возможности. Поэтому это (по крайней мере, в моих установках) часть моего базового пакета плагинов.

кайзер
источник
2

На самом деле, если вы посмотрите основную функцию wp_insert_post (post.php), вы увидите, что она выполняет следующее:

$data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_ID ), $post_ID, $data['post_status'], $post_type, $post_parent );

$wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );

Главное, на что нужно обратить внимание, это то, что используются как wp_unique_post_slug, так и sanitize_title:

wp_unique_post_slug( sanitize_title( 
Jahmic
источник
0

Простите за возобновление старого вопроса, но у меня была такая же необходимость, как выяснилось, этот метод отлично работает для меня:

$some_string = "DON'T STOP ME NOW!";
$slug = sanitize_title(sanitize_title($some_string, '', 'save'), '', 'query');
echo $slug; // dont-stop-me-now

Этот метод использует двойную санитарную обработку.

Первый использует saveрежим, в котором теги HTML и PHP удаляются, а акценты удаляются (акцентированные символы заменяются неакцентированными эквивалентами).

Второй queryрежим обеспечивает замену всех пробелов тире -и удаление других знаков препинания.

Надеюсь, это поможет кому-то! :)

GigiSan
источник