PDA

View Full Version : حرفه ای: ساخت سایت مپ دینامیک برای حجم زیاد صفحات



moslem.hady
چهارشنبه 18 تیر 1393, 09:52 صبح
سلام دوستان عزیز.


به صورت دینامیک برای سایت XML sitemap میسازم(یعنی اطلاعات صفحات سایت رو از دیتابیس دریافت میکنم و بعد سایت مپ رو میسازم).
ولی چون تعداد صفحات سایت زیاده(بالای 10 هزار صفحه)، سایت مپ نشون داده نمیشه و مشکل دار میشه.


چطور میشه این مشکل رو بصورت دینامیک حل کرد؟ که با افزایش تعداد صفحات مجددا این مشکل پیش نیاد.
(ایجاد چند سایت مپ و تقسیم دیتاها به صورت دستی امکان پذیر نیست!)


تشکر

moslem.hady
جمعه 20 تیر 1393, 16:13 عصر
کسی نظری نداره؟؟

ahmad156
جمعه 20 تیر 1393, 18:05 عصر
وقتی تعداد صفحات زیاد میشه باید تعداد Site Map هاتون هم چند تا شه

moslem.hady
جمعه 20 تیر 1393, 18:10 عصر
وقتی تعداد صفحات زیاد میشه باید تعداد Site Map هاتون هم چند تا شه
درست. ولی چطور بصورت داینامیک وقتی صفحات زیاد میشن سایت مپ جدید بسازم؟
برای یکی از پروژه ها بصورت دستی 4 تا سایت مپ ساخته بودم و مثلا گفته بودم صفحات 1 تا 4هزار رو توی اولی بیار، 4001 تا 5هزار رو توی دومی و....
اما نمیخوام اینجوری باشه. باید راهی باشه که بشه خودکار بسازه.
تشکر

ahmad156
جمعه 20 تیر 1393, 18:20 عصر
این روش منه.دیگه فکر کنم راحت باشه تغییرش

public string changefreq = "hourly";
public string priority = "0.9";
protected void Page_Load(object sender, EventArgs e)
{
using (var writer = new XmlTextWriter(Server.MapPath("/sitemap.xml"), null))
{
writer.WriteStartDocument();
writer.WriteStartElement("urlset");
writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
var data = yourDataFromDataBase();
foreach (DataRow row in data.Rows)
{
string Loc = yourUrl
writer.WriteStartElement("url");
writer.WriteElementString("loc", Loc);
writer.WriteElementString("changefreq", changefreq);
writer.WriteElementString("priority", priority);
writer.WriteEndElement();
}
writer.WriteEndDocument();
writer.Flush();
}
}

ali_mnkt
یک شنبه 22 تیر 1393, 21:07 عصر
خوب یک سئوال : برای سایت هایی که روزانه مقالات و اخبار در سایت قرار می دن چطور باید sitemap را مدیریت کرد؟ منظورم اینه که به ازای هر خبر یا مقاله جدید باید یک node در فایل xml ایجاد کنیم ؟ اگه آره مثلا بعد از یک مدت که تعدا node ها سر به فلک می کشه !!!!!!!!!!!!!!!!!!!
البته می شه یک سناریو دیگه هم در نظر گرفت و اون هم اینکه لینک هایی که برای ما مهم هستن مثلا محصولات شرکت را فقط در sitemap قرار داد تا گوگل فقط اونها رو به عنوان لینک های مهم شناسایی کنه ؟

moslem.hady
دوشنبه 23 تیر 1393, 08:21 صبح
این روش منه.دیگه فکر کنم راحت باشه تغییرش
خوب این که روش ساخت سایت مپه. من خودم همین رو استفاده کردم. من میگم فرض کنید این دیتایی که از دیتابیس گرفتید، 10,000 رکورد رو برگردونه. توی سایت مپ میگن باید حداکثر 5هزار تا رکورد باشه. من میگم همین 10 هزارتایی رو که از دیتابیس گرفتید رو چطور بین چند تا فایل تقیسم کنیم؟(بصورت دینامیک. نه اینکه فایل sitemap1 و sitemap2 روی هاست باشه.)
گرفتید چی میگم؟

moslem.hady
دوشنبه 23 تیر 1393, 08:22 صبح
بعد از یک مدت که تعدا node ها سر به فلک می کشه !!!!!!!!!!!!!!!!!!!
منم حرفم همینه.

ahmad156
دوشنبه 23 تیر 1393, 08:50 صبح
بصورت دینامیک. نه اینکه فایل sitemap1 و sitemap2 روی هاست باشه.
دوست عزیز شما باید در قالب چند تا SiteMap این کار رو بکنین.اینجا (http://dynamical.biz/blog/seo-technical/sitemap-strategy-large-sites-17.html)رو ببینین

moslem.hady
دوشنبه 23 تیر 1393, 08:55 صبح
دوست عزیز شما باید در قالب چند تا SiteMap این کار رو بکنین.اینجا (http://dynamical.biz/blog/seo-technical/sitemap-strategy-large-sites-17.html)رو ببینین
درسته. منم الان مثلا برای صفحات یه سایت مپ دارم، برای محصولات یکی، برای مقالات یکی و...
اما مثلا سایت مپ مقالات بزرگ میشه و میخوام داینامیک تقسیم بشه.
اگه سایت مال خودم باشه که هردفه بهش اضافه میکنم. ولی برای سایت مشتری که نمیشه هردفه این کار رو کرد چی؟

ahmad156
دوشنبه 23 تیر 1393, 09:02 صبح
میتونی به ازای هر Insert ، فایل SiteMap رو بگیرین و در انتهای اون رکورد جدید رو درج کنین

moslem.hady
دوشنبه 23 تیر 1393, 09:07 صبح
میتونی به ازای هر Insert ، فایل SiteMap رو بگیرین و در انتهای اون رکورد جدید رو درج کنین
فکر میکنم شما منظور من رو متوجه نشدین.
اولا که روشی که من استفاده میکنم برای سایت مپ مثل روش شما روی یه فایل xml نمی نویسه. بلکه یه صفحه aspx دارم که توی لودش گفتم دیتاها رو بگیره و write کنه:
http://nafisfile.com/sitemap.aspx

حالا حرف من اینه که چطور به صورت دینامیک لینک ها رو تقسیم کنم که توی سایت مپ ها بیشتر از 5000 تا لینک نباشه. (ساخت فایل سایت مپ دینامیک باشه. نه خوندن از دیتابیس)

ahmad156
دوشنبه 23 تیر 1393, 09:36 صبح
اولا که روشی که من استفاده میکنم برای سایت مپ مثل روش شما روی یه فایل xml نمی نویسه. بلکه یه صفحه aspx دارم که توی لودش گفتم دیتاها رو بگیره و write کنه
دقیقاً من هم همین کار رو میکنم.
خب شما میتونین چک کنین توی حلقه for که اگر بیشتر از 5000 تا بود فایل جدید ایجاد کنه یا حتی برای update هم میتونین تعداد نود ها رو بشمرین که اگر بیشتر از 5000 تا بود فایل جدید رو ایجاد کنه

moslem.hady
دوشنبه 23 تیر 1393, 10:39 صبح
دقیقاً من هم همین کار رو میکنم.
خب شما میتونین چک کنین توی حلقه for که اگر بیشتر از 5000 تا بود فایل جدید ایجاد کنه یا حتی برای update هم میتونین تعداد نود ها رو بشمرین که اگر بیشتر از 5000 تا بود فایل جدید رو ایجاد کنه
یه چیزی الان به ذهن خودم رسید:
اولا که با این روش فراخوانی و نمایش در هنگام درخواست نمیشه انجام داد. و باید فایل xml داشته باشیم و مثلا در هنگام درج صفحه یا محصول جدید به فایل xml اضافه کنیم.
الگوریتم اینجوری میشه:
وقتی یه صفحه جدید ایجاد میشه:
(توجه کنید که کد زیر شبه کده و ممکنه یه اشتباهاتی داشته باشه.)

int linkcount = تعداد رکوردهایی که میخوان توی سایت مپ اضافه بشن;
int cnt= (int)linkcount/5000;// رند شده تعداد سایت مپ هایی که میشه ایجاد بشه.
// برای هرکدوم از سایت مپ ها 5000 لینک درنظر میگیریم.


for(int i=1; i<= cnt; i++)
{
string sitemap= "sitemap"+ i +".xml";


//اگر فایل سایت مپ اولی موجود باشه، لینک رو بهش اضافه میکنیم.
//وگرنه اول اون رو میسازی و بعد بهش لینک رو اضافه می کنیم.
if(File.Exist(sitemap))
{ کدهای اضافه کردن رکود به سایت مپ ;}
else
{
// فایل سایت مپ رو بسازیم.
File.Create(sitemap);
کدهای اضافه کردن رکود به سایت مپ ;
}
}

tehranpatogh
چهارشنبه 23 آبان 1397, 15:15 عصر
ممنون مفید بود
منم یه مشکلی دارم که وقتی تاریخ رو از سرور فرا میخونه و درج میکنه گوگل ایراد میگیره

اینجا (http://www.farhangblog.ir/sitemap.php)

moslem.hady
شنبه 26 آبان 1397, 17:12 عصر
حالا که این پست بالا اومد، روشی که خودم انجام دادم رو مینویسم:
یه صحفه داریم به اسم sitemap.aspx که توی پیج لود اون، این کد ها نوشته میشه (کامنت در کدها هست)




protected void Page_Load(object sender, EventArgs e)
{
/*
آدرس های سایت مپ رو با روتینگ به این صورت میکنیم:
site.com/sitemap1.xml
site.com/sitemap2.xml
site.com/sitemap3.xml


که روتینگ آن به این صورت میشه:
routes.MapPageRoute(
"sitemap-Rout",
"sitemap{id}.xml",
"~/sitemap.aspx"
);


*/
Response.Clear();
Response.ContentType = "text/xml";
using (XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8))
{
int selectCount = 20000; // تعداد ردیف های سایت مپ
int skip = 0;
int pagenum = 0;


int.TryParse(RouteData.Values["id"] as string, out pagenum);// گرفتن صفحه سایت مپ از آدرس.


if (pagenum == 0)
return;


skip = (pagenum-1) * selectCount;//تعداد رکورهایی که حذف میشن از کوئری


string Home = "http://site.com/";



//شروع شی XML
writer.WriteStartDocument();
writer.WriteStartElement("urlset");
writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");

using (DataAccessDataContext _data = new DataAccessDataContext())
{
//گرفتن تعداد مورد نظر از محصولات و اسکیپ کردن بر اساس صفحه.
foreach (Product item in _data.Products.OrderBy(a => a.ID).Skip(skip).Take(selectCount))
{
writer.WriteStartElement("url");
writer.WriteElementString("loc", Home + "product/"+item.ID);
writer.WriteElementString("changefreq", "daily");
writer.WriteElementString("priority", "1");
writer.WriteEndElement();
}


}




//پایان شی XML
writer.WriteEndDocument();
writer.Flush();
}
Response.End();
}