WordPress如何生成URL插件?

时间:2012-11-30 作者:George Edison

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

5 个回复
最合适的回答,由SO网友:Johannes Pille 整理而成

根据@SinisterBeard\'几年前,s对该问题的评论非常有效,此答案早已过时,因此所述函数已被更新的API取代:

See wp_unique_post_slug.

Original Answer

马上,我不能给你一个关于如何生成WP段塞的页面/教程/文档,但看看sanitize_title() 作用

不要对函数名产生错误的印象,它不是为了清理标题,以便进一步用作页面/帖子标题。它接受标题字符串并返回该字符串以用于URL:

剥离HTML(&L);PHP

  • 去除特殊字符
  • 将所有字符转换为小写字母
  • 用连字符/破折号替换空格、下划线和句点
  • 将多个连续破折号减少为一个
    • 在边缘情况下,核心可能会执行其他操作(您必须查看源代码以验证sanitize_title() 将始终完全满足您的期望),但这至少应涵盖99%(如果不是全部的话)。

    SO网友:Vivek Sancheti

    您可以使用此功能:

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

    SO网友:kaiser

    核心为您服务除了WP_DEBUG, 在这种情况下,这对你没有太大帮助。WP基本上使用"Rewrite API", 这是一个基于函数的低级包装器WP_Rewrite class, which you can read about in Codex. 这个global $wp_rewrite 对象位于您的服务处,用于检查它或与类交互。

    有助于研究它的插件

    Toschos "T5 Rewrite"-PluginJan Fabrys "Monkeyman Rewrite Analyzer"-Plugin 会指引你的方向。我为“T5重写”编写了一个小的扩展,以便将其与“Monkeyman重写分析器”顺利集成,您可以在“T5重写”repos wikie中找到它here on GitHub.

    “Monkeyman”插件添加了一个新页面,该页面位于工具下的管理UI菜单中。“T5重写”插件在“设置”页面中添加了一个新的帮助选项卡。我的分机还将“帮助”选项卡添加到提到的“工具”页面。

    下面是“T5重写”插件帮助选项卡内容的屏幕截图。

    enter image description here

    Vorlage=模式| Beschreibung=解释| Beispiele=示例

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

    SO网友:Jahmic

    实际上,如果查看核心函数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( 
    

    SO网友:GigiSan

    请原谅我再次提出一个老问题,但我有同样的必要,因为我发现这个方法对我来说非常有效:

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

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

    结束