使 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