WordPress如何生成URL链接?


Answers:


16

简而言之,我无法给您提供有关如何生成WP块的页面/教程/文档,但是请看一下该sanitize_title()函数。

不要对函数名称有错误的印象,这并不意味着要清理标题以便进一步用作页面/帖子标题。它接受一个标题字符串并返回它以在URL中使用:

  • 剥离HTML和PHP
  • 去除特殊字符
  • 将所有字符转换为小写
  • 用连字符/破折号代替空格,下划线和句点
  • 将多个连续破折号减少为一个

在某些情况下,核心可能还会做其他事情(您必须查看源以验证sanitize_title()始终在生成足够正是你所期望的一样),但应至少覆盖99%,如果不是全部,案件。


1
@kaiser:我想您只是爱上了T5 Rewrite:)(我的议程上有待检查)| 通常,如果标题真的很长,WP还会将条块修剪到一定的最大长度。在那种情况下,我不能完全确定这是否由sanitize_title功能中应用的过滤器完成,还是在功能运行后是否由其他方法处理。
约翰内斯·皮尔

我猜这是sanitize_title需要检查的-filter。但是,还有其他相关功能。我真的不知道这一点。有时似乎SimplePie比这WP_Rewrite件事更容易理解。顺便说一句:Toscho致力于将“ Monkeyman Rewrite Analyzer”功能集成到他的插件中。那就是事情开始变得真正有趣的地方。
kaiser 2012年

1
如果想更明确地生成一个URL友好的段,还可以考虑使用sanitize_title_with_dashes()
Tom Auger 2014年

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清理功能的工作方式。


4

为您服务的核心

除了之外,WordPress 没有内置任何开发人员模式WP_DEBUG,在这种情况下,它不能为您提供太多帮助。基本上,WP使用“重写API”,它是WP_Rewrite该类的基于函数的低层包装器,您可以在Codex中进行阅读。的global $wp_rewrite对象将为您服务,以检查它或与类进行交互。

有助于查找的插件。

Toschos“ T5 Rewrite”-插件Jan Fabrys“ Monkeyman Rewrite Analyzer” -Plugin将为您提供指导。我为“ T5 Rewrite”编写了一个小扩展程序,以使其与“ Monkeyman Rewrite Analyzer”顺利集成,您可以在GitHub的“ T5 Rewrite” repos Wikie 中找到它

“ Monkeyman”插件会添加一个新页面,该页面位于“ 工具”下的管理UI菜单中。“ T5重写”插件将一个新的帮助选项卡添加到“ 设置” >“ 永久链接”页面。我的扩展程序也将帮助选项卡添加到提到的“ 工具”页面

这是“ 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( 

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模式确保将所有空格替换为破折号,-并删除其他标点符号。

希望这对某人有帮助!:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.