Есть ли где-нибудь страница, где подробно описывается, как WordPress генерирует слагов для URL? Я пишу скрипт, который должен генерировать URL-слагов, идентичных тем, которые генерирует WordPress.
Есть ли где-нибудь страница, где подробно описывается, как WordPress генерирует слагов для URL? Я пишу скрипт, который должен генерировать URL-слагов, идентичных тем, которые генерирует WordPress.
Ответы:
Я не могу дать вам страницу / учебник / документацию о том, как генерируются WP-слагы, но взгляните на sanitize_title()
функцию.
Не поймите неправильно название функции, оно не предназначено для очистки заголовка для дальнейшего использования в качестве заголовка страницы / поста . Он берет строку заголовка и возвращает ее для использования в URL:
Там может быть крайние случаи , когда ядро делает что - то дополнительное (вы должны смотреть на источник , чтобы убедиться в том , что sanitize_title()
будет всегда хватает в генерации точно такой же вы ожидали), но это должно охватывать по крайней мере , 99%, если не во всех случаях ,
sanitize_title
фильтра, применяемого также в функции, или же это обрабатывается чем-то другим после запуска функции.
sanitize_title
-фильтр, который нужно проверить. Но есть и другие связанные функции . Я действительно понятия не имел об этом. Иногда кажется, что SimplePie
это легче понять, чем WP_Rewrite
вещь. Кстати: Toscho работает над интеграцией функции Monkeyman Rewrite Analyzer в свой плагин. Вот где вещи начинают становиться действительно интересными.
Вы можете использовать эту функцию:
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.
В 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 отлично справляется с задачей проверки объекта перезаписи. И это делает еще больше: это добавляет новые возможности. Поэтому это (по крайней мере, в моих установках) часть моего базового пакета плагинов.
На самом деле, если вы посмотрите основную функцию 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(
Простите за возобновление старого вопроса, но у меня была такая же необходимость, как выяснилось, этот метод отлично работает для меня:
$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
режим обеспечивает замену всех пробелов тире -
и удаление других знаков препинания.
Надеюсь, это поможет кому-то! :)