2017-01-13 13 views
0

私はMongooseを使ってMongoDBのブログタイトルからURLスラッグを保存しています。したがって、ユーザーが同じブログタイトルを入力する場合、Wordpressがそれをどのように処理しているかのようにして、スラッグに数字を追加し、すべての重複に対してインクリメントするようにしたいと考えています。マングースハンドルのURLスラッグを複製

例:また

  1. ブログタイトル
  2. ブログタイトル-2
  3. ブログタイトル-3

ブログタイトルから評価スラグがブログタイトルであります-2となっており、すでにブログタイトル2のスラッグがある場合、数字を増やす代わりに-2を後ろに追加するほどスマートになります。だから、blog-title-2-2になります。

どのように実装すればよいですか?あなたがフィールドに固有のオプションを与えることができ、あなたのmongooeseモデルで

答えて

0

var post = new post({ 
    slug: { 
    type: String, 
    unique: true 
    } 
}); 

その後、あなたはスラッグを変更することができ、その場合には、あなたはそれを保存するときに検証することができますし、スラッグが一意でない場合は知っています:

var post = new post({ slug: "i-am-slug"}); 
var tempSlug = post.slug 
var slugIsUnique = true; 
car counter = 1; 
do{ 
    error = post.validateSync(); 
    if(// not unique){ //Make sure to only check for errors on post.slug here 
    slugIsUnique = false; 
    counter++; 
    tempSlug = post.slug + "-" + counter; 
    } 
}while(!slugIsUnique) 

post.slug = tempSlug; 
post.save((err, post) => { 
    // check for error or do the usual thing 
}); 

編集: この文句を言わないブログタイトル-2および出力ブログタイトル-2-2を取るが、それはすでに

を存在しない限り、それは、ブログタイトル-2-1の出力に含まれます210
0

私はそれを自分で実装する方法を理解することができました。

function setSlug(req, res, next) { 
    // remove special chars, trim spaces, replace all spaces to dashes, lowercase everything 
    var slug = req.body.title.replace(/[^\w\s]/gi, '').trim().replace(/\s+/g, '-').toLowerCase(); 
    var counter = 2; 
    // check if there is existing blog with same slug 
    Blog.findOne({ slug: slug }, checkSlug); 
    // recursive function for checking repetitively 
    function checkSlug(err, existingBlog) { 
    if(existingBlog) { // if there is blog with the same slug 
     if(counter == 2) // if first round, append '-2' 
     slug = slug.concat('-' + counter++); 
     else // increment counter on slug (eg: '-2' becomes '-3') 
     slug = slug.replace(new RegExp(counter++ + '$', 'g'), counter); 
     Blog.findOne({ slug: slug }, checkSlug); // check again with the new slug 
    } else { // else the slug is set 
     req.body.slug = slug; 
     next(); 
    } 
    }; 
} 

私はWordpressで少し遊んでいました。奇妙なタイトルのテストブログ記事をたくさん公開して、タイトルの変換をどのように処理するかを確認し、自分の発見に基づいてタイトルを変換する最初のステップを実装しました。 Wordpressの:

  • トリム離れてすべての特殊文字を削除先頭と終わりのスペース
小文字のすべて
  • 単一のダッシュに残りのスペースを変換し、
  • 関連する問題