是否有页面详细说明了WordPress如何为URL生成段?我正在编写一个脚本,该脚本需要生成与WordPress生成的URL相同的URL标记。

评论

现在,此问题的答案已过时-请改为使用codex.wordpress.org/Function_Reference/wp_unique_post_slug。

@SinisterBeard今天偶然遇到了这个。非常欢迎您添加新答案或编辑已接受的答案。现在将对其进行更新。迟到总比不到好。感谢您提出正确的观点。

#1 楼

根据@SinisterBeard在几年前对该问题的非常有效的评论,此答案早已过时,因此所提到的功能已由较新的API代替:
请参阅[wp_unique_post_slug]。(https ://developer.wordpress.org/reference/functions/wp_unique_post_slug/)
原始答案
我无法即时提供有关WP块如何生成的页面/教程/文档,但是请看一下sanitize_title()函数。
函数名称不会给人留下错误的印象,它并不意味着要清除标题以用作页面/帖子标题。它需要一个标题字符串并返回它以在URL中使用:

strips HTML和PHP 将所有字符转换为小写字母
替换空白,用连字符/破折号加下划线和句点
将多个连续的破折号减少为一个

在某些情况下,核心可能还要执行其他操作(您必须查看源代码以验证sanitize_title()将足以生成与您期望的完全相同的内容),但这应该涵盖至少99%(如果不是全部)的情况。

评论


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

–约翰内斯·皮尔(Johannes Pille)
2012年11月30日18:24

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

– kaiser
2012年11月30日18:52

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

–汤姆·俄格(Tom Auger)
2014-12-09 16:16



#2 楼

您可以使用此功能:

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

评论


今天偶然遇到了这个。您说:“它确实是wp url清理功能的工作方式。”然后,假定已经在php执行的上下文中将它从基于主题的或基于插件的调用链中挂接到某些WordPress中,出于什么可想到的原因,一个人将不仅仅使用native sanitize * API的相关功能之一?无论是好是坏,都可以在全局名称空间中作为自由函数使用。为什么建议在〜source〜分发代码中添加额外的503字节来复制现有功能?只是因为有可能吗?

–约翰内斯·皮尔(Johannes Pille)
20年8月30日在12:35



#3 楼

为您服务的核心

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

插件可帮助您查看它。

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

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

这是“ T5 Rewrite”-插件帮助选项卡内容的屏幕快照。



Vorlage =模式| Beschreibung =说明| Beispiele =示例

注释

“ T5重写”插件在帮助您检查重写对象方面做得很好。它的作用甚至更多:它增加了新的可能性。因此,它是(至少在我的安装中)基本插件包的一部分。

#4 楼

实际上,如果您查看核心功能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( 


#5 楼

原谅要恢复一个古老的问题,但是我有同样的必要性,因为发现该方法对我来说是完美的:

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

希望对您有所帮助! :)