Сделайте пост-слиток уникальным
У меня есть несколько функций, которые работают не так, как я хотел.
Пуля автоматически создается на лету в зависимости от названия поста.
Пример: Если заголовок сообщения "тест", то слаг будет "тест"
Моя проблема в том, что, если их запись дублирует заголовок сообщения "тест", что означает, что пуля тоже будет дублироваться. По этой причине я создал 2 функции, чтобы справиться с этим за меня.
Эта функция проверяет, является ли пуля существуют в базе данных
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;
}
}
Если пуля действительно существует в базе данных, то я использую эту функцию, чтобы присвоить пуле уникальное имя
if(slug_exist($slug)){
$rand = rand(10,50);
$slug = $slug."-".$rand;
return $slug;
}
Ну, когда слизняк получит уникальное имя слизняка, это будет похоже Example: test-244
Я хочу, чтобы пули располагались в числовом порядке, а не в случайном порядке.
**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"
Это единственный способ, которым я знаю, как объяснить подробно, пожалуйста, дайте мне знать, если вы не уверены, что я делаю. Спасибо!
4 answers
Это очень стандартный код, просто вам нужен небольшой цикл:
$i = 1; $baseSlug = $slug;
while(slug_exist($slug)){
$slug = $baseSlug . "-" . $i++;
}
return $slug;
<?php
$oSlug = 'Test';
$slug = $oSlug;
$count = 1;
while(slug_exist($slug)){
$slug = $oSlug.'-'.$count++;
}
print 'The slug i got is: '.$slug;
?>
Если у вас есть полный доступ к вашей бд и вам нравится хранить логику в бд, вы можете
- добавьте уникальный индекс в исключение 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 = 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
}
}
}
Я знаю, что это немного более старый вопрос, но я надеюсь, что это поможет по крайней мере еще одному человеку в будущем.