是否有一个页面详细说明了WordPress是如何为URL生成slug的?我正在编写一个脚本,需要生成与WordPress生成的URL段塞相同的URL段塞。
WordPress如何生成URL插件?
根据@SinisterBeard\'几年前,s对该问题的评论非常有效,此答案早已过时,因此所述函数已被更新的API取代:
See wp_unique_post_slug
.
Original Answer
马上,我不能给你一个关于如何生成WP段塞的页面/教程/文档,但看看sanitize_title()
作用不要对函数名产生错误的印象,它不是为了清理标题,以便进一步用作页面/帖子标题。它接受标题字符串并返回该字符串以用于URL:
剥离HTML(&L);PHP
- 在边缘情况下,核心可能会执行其他操作(您必须查看源代码以验证
sanitize_title()
将始终完全满足您的期望),但这至少应涵盖99%(如果不是全部的话)。您可以使用此功能:
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_DEBUG
, 在这种情况下,这对你没有太大帮助。WP基本上使用"Rewrite API", 这是一个基于函数的低级包装器WP_Rewrite
class, which you can read about in Codex. 这个global $wp_rewrite
对象位于您的服务处,用于检查它或与类交互。
有助于研究它的插件
Toschos "T5 Rewrite"-Plugin 和Jan Fabrys "Monkeyman Rewrite Analyzer"-Plugin 会指引你的方向。我为“T5重写”编写了一个小的扩展,以便将其与“Monkeyman重写分析器”顺利集成,您可以在“T5重写”repos wikie中找到它here on GitHub.“Monkeyman”插件添加了一个新页面,该页面位于工具下的管理UI菜单中。“T5重写”插件在“设置”页面中添加了一个新的帮助选项卡。我的分机还将“帮助”选项卡添加到提到的“工具”页面。
下面是“T5重写”插件帮助选项卡内容的屏幕截图。
Vorlage=模式| Beschreibung=解释| Beispiele=示例
注意,“T5重写”插件在帮助您检查重写对象方面做得很好。它做的更多:它增加了新的可能性。因此,它(至少在我的安装中)是我基本插件包的一部分。
实际上,如果查看核心函数wp\\u insert\\u 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\\u unique\\u post\\u slug和sanitize\\u标题: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
模式确保所有空格都替换为破折号-
删除其他标点符号。
希望这对某人有所帮助!:)