使 post slug 独一无二

Posted

技术标签:

【中文标题】使 post slug 独一无二【英文标题】:Make a post slug unique 【发布时间】:2013-12-24 17:52:41 【问题描述】:

我放置的功能很少,但无法按我的意愿工作。

slug 会根据帖子标题自动动态创建。

示例:如果帖子标题为“test”,则 slug 将为“test”

我的问题是,如果他们的帖子标题“test”重复条目,这意味着 slug 也会被重复。出于这个原因,我创建了 2 个函数来为我处理这个问题。

此函数检查数据库中是否存在 slug

function slug_exist($x)
    global $db;
        $sql = "SELECT post_name FROM posts WHERE post_name=\"$x\"";
        $query = $db->select($sql);
            if($db->num_rows() > 0)
                return true;
    

如果数据库中确实存在 slug,则使用此函数为 slug 赋予唯一名称

    if(slug_exist($slug))
        $rand = rand(10,50);
        $slug = $slug."-".$rand;
            return $slug;
    

好吧,当 slug 获得唯一的 slug 名称时,它会像 Example: test-244

我希望 slug 按数字顺序排列,而不是按随机顺序排列。

**Example:**

Post Title is "Test"
Slug is "test-1"

Post Title is "Test"
Slug is "test-2"

Post Title is "Test"
Slug is "test-3"

这是我知道如何详细解释的唯一方法,如果您不确定要做什么,请告诉我。谢谢!

【问题讨论】:

那么您遇到的问题是什么?如果“test”被拿走了,你试试“test-1”,看看它是否被拿走了。如果不是,请使用它,否则尝试“test-2”等。使用循环和您已有的代码很容易实现。 顺便说一句,无论如何你都需要循环,因为现在仍然可以得到重复。假设进行了“测试”,并且 rand 返回 244 - 您没有检查它是否已被使用。 【参考方案1】:

这是一个非常标准的代码,只是你需要一个小循环:

$i = 1; $baseSlug = $slug;
while(slug_exist($slug))
    $slug = $baseSlug . "-" . $i++;        


return $slug;

【讨论】:

我又得到了忍者!无论如何 +1,但您的代码可能会返回 Slug-0,不确定 OP 是否需要。 完全正确,改变了。谢谢!【参考方案2】:
<?php
$oSlug    = 'Test';
$slug     = $oSlug;
$count = 1;
while(slug_exist($slug))
    $slug = $oSlug.'-'.$count++;

print 'The slug i got is: '.$slug;
?>

【讨论】:

【参考方案3】:

在我偶然发现这一点之前,我已经研究了几个小时。这个问题对我有一点帮助,但我最终得到了一些不同的东西;

我还创建了一个函数来检查 slug 是否已经存在;

function slugExist($slug)
    global $db;
    $query = $db->query("SELECT * FROM `blog-posts` WHERE `slug` = '".$slug."'");
    $results = $query->num_rows;
    if($results > 0)
        return true;
    else
        return false;
    

对于发布新文章或帖子(取决于您在做什么),我有以下内容;

    $slug = furl($_POST['title']);

    $CheckSlug = $db->query("SELECT * FROM `blog-posts` WHERE `slug` LIKE '".$slug."%'");
    $numHits = $CheckSlug->num_rows;
    if($numHits > 0)
        $slug = $slug.'-'.$numHits;
    

这在执行时要容易得多,因为没有循环并且非常干净。但是,如果您正在编辑现有帖子怎么办?如果他们更改标题,您希望 slug 更改,但如果用户不更改,您不希望它更改或增加/减少数字后缀。

所以使用了一些帖子,我最终得到了这个;

$slug = furl($_POST['title']);

if($slug != $oldSlug)                      // 1. If the slug of the new title is different to the old one, proceed to adding suffix
    $i = 1; $baseSlug = $slug;              // 2. Set counter and baseSlug vars.
    while(slugExist($slug))                // 3. Start a loop to keep adding to the numeric value until an empty one is found
        $slug = $baseSlug . "-" . $i++;     // 4. Set the new slug variable to the base with a new number
        if($slug == $oldSlug)              // 5. If the slug with the added number matchs the existing slug, then we dont want to change it
            break;                          // 6. Break the loop to prevent additional numeric changes to the slug
        
    

我知道这是一个较老的问题,但我希望这对将来至少其他人有所帮助。

【讨论】:

【参考方案4】:

如果您拥有对数据库的完全访问权限并且喜欢在数据库中存储逻辑,则可以

为 slug 添加唯一索引并在插入时捕获异常 在插入时添加触发器为您生成 slug 工作

【讨论】:

以上是关于使 post slug 独一无二的主要内容,如果未能解决你的问题,请参考以下文章

分类 slug + post slug Laravel Eloquent

获取WP页Slug

带有 ID 和 slug 组合的 Wordpress query_posts

Slug作为字符串

缺少或不正确的 slug 检查 Laravel 7

使用基于类的视图具有类别 slug 和 Post slug 的 URL