ابزار سایت

پیاده_سازی_نقشه_سایت

فصل 8 - پیاده سازی نقشه سایت (SEO)

8-1- مقدمه

بهره‌مندی از یک سایت خوب با امکانات موتور جستجو یکی از المان‌های کلیدی موفقیت در زمینه کسب و کار است. اکیداً توصیه می‌شود تا صفحات سامانه اندیس‌گذاری شوند تا موتور جستجو بتواند با استفاده از این اندیس‌ها نتایج مناسب را نمایش دهد. اندیس‌گذاری روشی است که با استفاده از آن موتورهای جستجو نظیر گوگل با استفاده از ربات‌های خود، صفحات یک سامانه را پردازش و دسته‌بندی می‌کنند. به این ترتیب کاربر یک سامانه به‌راحتی می‌تواند صفحه مورد نظر خود را در سامانه جستجو کرده و نتیجه را مشاهده کند. Sitemap یک لیست ساده‌ای از صفحات سامانه است که کاربر به‌آسانی به آن دسترسی داشته و امکان جستجوی صفحه مورد نظر خود را در سریع‌ترین زمان ممکن می‌دهد

8-2- اقدامات مورد نیاز جهت اضافه شدن اطلاعات یک افزونه به sitemap

برای اضافه‌سازی یک افزونه به sitemap می‌بایست دو رویداد در کلاس event_handler.php افزونه مورد نظر Bind و تعریف شود.

8-21- رویداد onSitemapGetUrls

این رویداد در کلاس event_handler افزونه مورد نظر Bind می‌شود.

با استفاده از تابع فوق برای هر موجودیت 1 مربوط به افزونه مورد نظر، Url مربوطه ساخته شده و به sitemap اضافه می‌شود.

نکته: رویداد فوق در هنگام ساخت Sitemap در یک حلقه for برای تمامی افزونه‌ها فراخوانی می‌شود.

موجودیت‌های افزونه، در کلاس activate و با استفاده از فراخوانی تابع addSitemapEntry مربوط به کلاس seo_service به sitemap اضافه می‌شود. در تابع addSitemapEntry کلیه موجودیت‌ها به متغیر seo_sitemap_entities در جدول ow_base_config به صورت آرایه json اضافه می‌شود.

8-2-2- رویداد onCollectMetaData:

این رویداد در تابع init مربوط به کلاس event_handler افزونه مورد نظر bind می‌شود.

با استفاده از تابع فوق، تنظیماتی که مدیر سامانه می‌تواند در بخش تنظیمات، در زیربخش SEO برای افزونه مورد نظر انجام دهد، ساخته می‌شود. فراخوانی رویداد در کلاس SEO در تابع init انجام می‌شود. برای مثال اگر افزونه تصاویر در نظر گرفته شود، می‌توان امکان تنظیمات نمایش لیست تصاویر 2 را در رویداد فوق پیاده‌سازی کرده و در تنظیمات مدیر آن را ویرایش نمود. مثلاً عنوان صفحه‌نمایش داده‌شده برای لیست تصاویر و یا توضیحات صفحه و یا لغات کلیدی صفحه مورد نظر که یک موتور جستجو مانند گوگل از آن‌ها استفاده می‌کند.

8-3- تنظیمات مورد نیاز جهت تولید sitemap

تنظیمات مورد نیاز برای تولید sitemap در جدول ow_base_config ذخیره می‌شوند که در جدول 1 به آن‌ها اشاره می‌شود:

نام تنظیم مقدار پیش‌فرض
seo_sitemap_max_urls_in_file 4000
seo_sitemap_entitites_max_count 200000
seo_sitemap_entitites_limit 500
seo_sitemap_entities اطلاعات پایه مانند کاربران و همچنین افزونه‌هایی که به صورت پیش‌فرض نصب می‌شوند به صورت آرایه json در این متغیر ذخیره می‌شوند
seo_sitemap_build_finished 0
seo_sitemap_build_in_progress 0
seo_sitemap_in_progress_time 0
seo_sitemap_last_build 0
seo_sitemap_last_start 0
seo_sitemap_schedule_update weekly
seo_sitemap_index 0
جدول 1: مقادیر پیش‌فرض تنظیمات مورد نیاز Sitemap
  • seo_sitemap_max_urls_in_file:

seo_sitemap_max_urls_in_file 4000

حداکثر url ساخته شده در هر فایل xml با نام sitemap%s است.

مقدار %s برای فایل اول 0 است که نشان داده نمی‌شود و هر بار یکی افزایش می‌یابد.

Sitemap.xml, sitemap1.xml,sitemap2.xml

برای مثال اگر مقدار فوق برابر 10 تنظیم شود، فایل‌های ساخته شده به صورت زیر خواهد بود:

فایل site.xml:

شکل 1: فایل site.xml:

  • seo_sitemap_entitites_max_count:

seo_sitemap_entitites_max_count 200000

حداکثر تعداد کل url هایی که می‌تواند تعریف شود را مشخص می‌کند.

  • seo_sitemap_entitites_limit:

seo_sitemap_entitites_limit 500

حداکثر تعداد کل موجودیت‌هایی است که می‌تواند تعریف شود (مانند event، forum، user و…)

  • seo_sitemap_entities: کلیه موجودیت‌ها و داده‌های آن در قالب json در این مؤلفه ذخیره می‌شوند:

هر آیتم دارای یک ویژگی با نام data_fetched است که به صورت پیش‌فرض false است. ازآنجایی‌که ساخت sitemap به‌تدریج ساخته می‌شود، برای هر آیتم که url آن در Sitemap ساخته شود، مقدار data_fetched برابر true می‌شود. این امر باعث می‌شود ساخت sitemap از ادامه اولین آیتمی که وارد آن نشده است، صورت گیرد.

نکته: مزیت استفاده از آرایه json این است که خواندن از این آرایه در مقایسه با xml سریع‌تر بوده و همچنین ساختار ساده‌تری دارد.

  • seo_sitemap_build_finished: این مقدار نشان‌دهنده پایان ساخت sitemap است. پس از اتمام ساخت sitemap مقدار این تنظیم برابر 1 می‌شود.
  • seo_sitemap_build_in_progress: این تنظیم نشان‌دهنده در حال ساخت بودن sitemap می‌باشد، به‌طوری‌که اگر sitemap در حال ساخت باشد این مقدار برابر 1 و در غیر این‌صورت برابر 0 است.
  • seo_sitemap_in_progress_time: زمان در حال ساخت بودن sitemap را مشخص می‌کند.
  • seo_sitemap_last_build: آخرین شماره نسخه ساخت sitemap را مشخص می‌کند و از 1 شروع می‌شود.
  • seo_sitemap_last_start: آخرین زمان شروع ساخت sitemap را مشخص می‌کند.
  • seo_sitemap_schedule_update: زمان‌بندی به‌روزرسانی sitemap را بر اساس ماهانه، هفتگی و روزانه مشخص می‌کند. در قسمت seo در تنظیمات مدیر می‌توان این گزینه را تغییر داد.
  • seo_sitemap_index: کار اندیس گذاری فایل‌های sitemap را انجام می‌دهد.

8-4- تدریجی بودن ساخت sitemap

با توجه به اینکه حجم تعداد مؤلفه‌های یک موجودیت 3 مثلاً کاربر 4 معمولاً زیاد است، برای همین منظور فراخوانی تابع ساخت sitemap (با نام generateSitemap که در کلاس seo_service قرار دارد) در داخل کلاس اصلی cron انجام‌شده و با هر بار اجرای cron تنها یک مؤلفه یا یک آیتم مؤلفه وارد sitemap می‌شود.

ساختار تابع site_map در cron به صورت زیر است:

همان‌طور که مشاهده می‌شود دو تنظیم مربوط به درحال پردازش بودن ساخت sitemap و مدت‌زمان پردازش در ابتدا مقداردهی می‌شوند و در پایان ساخت sitemap نیز تنظیم در حال پردازش بودن به‌روز می‌شود.

/**
 * Generate sitemap
 */
public function generateSitemap()
{
 $service = BOL_SeoService::getInstance();
 $inProgress = (int) OW::getConfig()->getValue('base', 'seo_sitemap_in_progress');
 $inProgressTime = (int) OW::getConfig()->getValue('base', 'seo_sitemap_in_progress_time');
 
// is it possible to start sitemap generating?
 if ((!$inProgress || time() - $inProgressTime >= 3600) && $service->isSitemapReadyForNextBuild())
 {
 OW::getConfig()->saveConfig('base', 'seo_sitemap_in_progress', 1);
 OW::getConfig()->saveConfig('base', 'seo_sitemap_in_progress_time', time());
 
 $service->generateSitemap();
 
 OW::getConfig()->saveConfig('base', 'seo_sitemap_in_progress', 0);
 }
}

تابع isSitemapReadyFornextBuild در کلاس seo_service قرار دارد و با استفاده از تنظیم زمان‌بندی به‌روزرسانی sitemap که در بالا گفته‌شده (ماهانه، روزانه و یا هفتگی) بررسی می‌کند که آیا نیاز به ساخت sitemap وجود دارد یا خیر.

8-5- توضیحات فنی تابع اصلی ساخت sitemap

ساختار تابع generateSitemap() در کلاس seo_service.php به صورت زیر است:

public function generateSitemap()
{
 
 $isAllEntitiesFetched = true;
 
// don't collect urls while sitemap is building
 if (!(int)OW::getConfig()->getValue('base', 'seo_sitemap_build_in_progress')) {
 OW::getConfig()->saveConfig('base', 'seo_sitemap_build_finished', 0);
 
// get sitemap entities
 $entities = $this->getSitemapEntities();
 $maxCount = (int)OW::getConfig()->getValue('base', 'seo_sitemap_entitites_max_count');
 $limit = (int)OW::getConfig()->getValue('base', 'seo_sitemap_entitites_limit');
 
 if ($entities) {
// fetch urls
 foreach ($entities as $entityType => $entityData) {
// skip all disabled entities
 if (!$entityData['enabled']) {
 continue;
 }
 
// get sitemap items
 foreach ($entityData['items'] as $item) {
// skip already fetched items
 if ($item['data_fetched']) {
 continue;
 }
 
// correct the limit value
 if ($item['urls_count'] + $limit > $maxCount) {
 $limit = $maxCount - $item['urls_count'];
 }
 
// get urls
 $event = new OW_Event('base.sitemap.get_urls', array(
 'entity' => $item['name'],
 'limit' => $limit,
 'offset' => $item['urls_count']
));
 
 OW::getEventManager()->trigger($event);
 
 $newUrlsCount = count($event->getData());
 $totalUrlsCount = (int)$item['urls_count'] + $newUrlsCount;
 $isAllEntitiesFetched = false;
 
!$newUrlsCount || $newUrlsCount!= $limit || $totalUrlsCount >= $maxCount
? $this->updateSitemapEntityItem($entityType, $item['name'], true, $totalUrlsCount)
: $this->updateSitemapEntityItem($entityType, $item['name'], false, $totalUrlsCount);
 
// add new urls
 if ($newUrlsCount) {
// process received urls
 foreach ($event->getData() as $url) {
 if ($this->isSitemapUrlUnique($url)) {
 $this->addSiteMapUrl($url, $entityType);
 }
 }
 }
 
// we process at a time only one entity item
 break 2;
 }
 }
 }
 }
 
// build sitemap
 if ($isAllEntitiesFetched) {
 $this->buildSitemap();
 }
 }

در تابع بالا مقدار متغیر isAllEntitiesFetched$ در ابتدا برابر true قرار داده می‌شود، یعنی فرض می‌شود که کلیه آیتم‌های موجود در مقدار seo_sitemap_entities در جدول ow_base_config به sitemap واردشده‌اند (مقدار data_fetch برای تمامی آن‌ها true است). در ادامه تابع در صورت پیدا شدن آیتمی که دارای مقدار false برای data_fetch باشد، مقدار isAllEntitiesFetched$ برابر false می‌شود و در انتهای کد خط زیر:

// build sitemap
 if ($isAllEntitiesFetched) {
 $this->buildSitemap();
 }
//}

با مقدار false مانع از اجرای تابع ساخت sitemap می‌شود، یعنی هنوز آیتمی برای واردسازی وجود دارد. پس‌ازآنکه تمامی آیتم‌ها واردسازی شدند. شبه کد داخل if بالا اجراشده و تابع buildSitemap در کلاس seo_service فراخوانی می‌شود.

8-6- توضیحات فنی تابع buildSitemap در کلاس seo_service

در این تابع با استفاده از تابع getBaseSitemapPath در کلاس seo_service مسیر پیش‌فرض ساخت sitemap برای ساخت مسیر جدید فایل xml گرفته می‌شود. مسیر پیش‌فرض آدرس زیر است:

\ow_userfiles\plugins\base\sitemap\

و ساخت مسیر جدید در داخل این مسیر و با استفاده از به‌اضافه 1 کردن تنظیم seo_sitemap_last_build انجام می‌شود.

$newSitemapBuild = (int) OW::getConfig()->getValue('base', 'seo_sitemap_last_build') + 1;

در ادامه کد، در هنگام ساخت یک نسخه جدید از sitemap کلیه نسخه‌های قدیمی‌تر پاک می‌شود.

8-7- توضیحات فنی تابع sitemap در کلاس seo_service

مشاهده sitemap توسط تابع sitemap در کلاس seo_service انجام می‌شود.

در ابتدا می‌بایست حتماً پس از جایگزینی آدرس سامانه با عبارت {siteurl}، نوشته زیر در انتهای فایل robots.txt اضافه شود:

Sitemap: http:{siteurl}/sitemap.xml با توجه به محدودیت‌های تعیین‌شده در تنظیمات مربوط به ساخت sitemap مانند حداکثر تعداد url هایی که می‌توان در یک فایل تعریف کرد، لینک ارتباطی میان url ها در داخل فایل‌های sitemap با استفاده از کلمه کلیدی part انجام می‌شود. موتورهای جستجو مانند گوگل نیز از این کلمه برای شناسایی ارتباط میان بخش‌هایی مختلف استفاده می‌کنند. پروتکل ساخت sitemap به صورت زیر است: - در ابتدا urlset تنظیم می‌شود. <urlset> (تنظیم مورد نظر اجباری است) - سپس url مسیرهای والد مشخص می‌شوند. <url> (تنظیم مورد نظر اجباری است) داخل هر url اطلاعات زیر وجود دارد: - آدرس مسیر url. <loc> (تنظیم مورد نظر اجباری است) - اولویت‌بندی صفحات برای این‌که موتورهای جستجو صفحات مهم سایت را شناسایی کنند. مقداری بین 0 تا 1 است. <priority> (تنظیم مورد نظر اختیاری است) - مدت‌زمان تغییر (روزانه، هفتگی، ماهانه و …) برای ارزیابی موتورهای جستجو به‌منظور صحت داده‌هایی است که دریافت می‌کنند. <changefreq> (تنظیم مورد نظر اختیاری است)

1) , 3) entity
2) photo_list
4) user
پیاده_سازی_نقشه_سایت.txt · آخرین ویرایش: 2019/01/15 12:45