چگونه در فریم ورک لاراول sitemap ایجاد کنیم؟

7 دیدگاه

در این مطلب می خواهم نحوه ایجاد نقشه سایت یا همون Sitemap در فریم ورک لاراول رو به صورت داینامیک توضیح بدم .برای این کار از بسته “RoumenDamianoff/laravel-sitemap” استفاده می کنیم. همونطور که می دونید سایت مپ ها برای سئو سایت شما بسیار موثر هستند چون محتوای سایت شما رو به صورت تمیز و مرتب شده در اختیار موتورهای جستجو مثل گوگل قرار می دهند و باعث افزایش رتبه و ترافیک ورودی شما از گوگل می شوند.

اخیرا سایتی با لاراول نوشتم که دارای مقالات و اخبار مختلف بود و نیاز بود تمام اونها سریعا در گوگل ثبت بشن.برای همین با استفاده از بسته فوق این امکان رو اضافه کردم که نقشه سایت به صورت اتوماتیک از همه محتویات سایت ایجاد بشه و اون رو در گوگل وب مستر ثبت کردم . اگر شما هم از لاراول استفاده می کنید و قصد ایجاد sitemap رو از محتویات پروژه تون دارید با ما همراه باشید.

xmlsitemap

در ادامه بسته مورد نظر رو نصب و نحوه اش رو خواهیم دید.

قدم اول : نصب بسته

ابتدا باید دستور زیر را در ترمینال وارد کنید تا آخرین نسخه از بسته روی لاراول نصب بشه.(برای اجرای این دستور باید composer نصب باشه و مسیر ترمینال روی پوشه اصلی پروژه باشه)

composer require roumen/sitemap

حالا باید ServiceProvider اش رو به تنظیمات لاراول اضافه کنیم.فایل config/app.php رو باز کنید و در بخش providers اضافه کنید:

'providers' => [
	....
	'Roumen\Sitemap\SitemapServiceProvider',
]

و در انتها برای پابلیش کردن فایل تنظیمات خود این بسته در مسیر config/sitemap.php ،باید دستور زیر را در ترمینال وارد کنید:

php artisan vendor:publish --provider="Roumen\Sitemap\SitemapServiceProvider"

 

در همین رابطه :   آموزش استفاده از PHPUnit در Laravel (قدم اول)

قدم دوم : ایجاد Sitemap در Route

قدم نهایی اضافه کردن کدهایی است که نقشه سایت رو ایجاد می کنند.من این کدها رو داخل بخش route لاراول قرار دادم و شما می تونید داخل controller دلخواه تون هم ببرید.

کدهای زیر رو در فایل routes/web.php وارد کنید:

Route::get('sitemap', function(){
    /* create new sitemap object */
    $sitemap = App::make("sitemap");
    
    /* add item to the sitemap (url, date, priority, freq) */
    $sitemap->add(URL::to('/'), '2012-08-25T20:10:00+02:00', '1.0', 'daily');
    
 
    $posts = DB::table('post')
                ->select('post.*'
                    ,'post.title as postTitle','post.slug as postSlug'
                    ,'post_image.image as image','post.updated_at as postUpdated_at')
                    ->join('post_image','post_image.post_id','=','post.id')
                    ->orderBy('created_at','desc')
                    ->groupBy('post.id')
                    ->get();
    
    $postResult = array();
    if(!empty($posts)){
        foreach ($posts as $key => $value) {
            $postResult[$value->id]['id'] = $value->id;
            $postResult[$value->id]['slug'] = $value->postSlug;
            $postResult[$value->id]['postTitle'] = $value->postTitle;
            $postResult[$value->id]['postUpdated_at'] = $value->postUpdated_at;
            $postResult[$value->id]['image'][] = $value->image;
        }
    }
    
     /* add every post to the sitemap */
     foreach ($postResult as $key=>$value)
     {
        $images = array();
        foreach ($value['image'] as $key2 => $value2) {
            $images[] = array(
                'url' => URL::to('/')."/uploadImages/post/".$value2,
                'title' => $value['slug'],
                'caption' => $value['postTitle']
            );    
        }
        $sitemap->add(URL::route('front.post',$value['slug']), $value['postUpdated_at'], '1.0', 'daily', $images);
    }
    
    /* show your sitemap (options: 'xml' (default), 'html', 'txt', 'ror-rss', 'ror-rdf') */
    return $sitemap->render('xml');
});

 

دقت کنید که کد بالا برای جدول و سایت خاصی نوشته شده و شما باید بخش هایی از اون رو بسته به جدول ها و دیتابیس سایت خودتون ویرایش کنید.مثلا من کد بالا رو برای سایت خودم اول به controller انتقال دادم تا فایل route شلوغ نشه و چون می خواستم همزمان از چندین بخش sitemap بسازم، به این صورت تغییرش دادم :

class SitemapController extends Controller
{
    public function mainSite()
    {
        /* create new sitemap object */
        $sitemap = App::make("sitemap");

        /* add item to the sitemap (url, date, priority, freq) */
        $sitemap->add(URL::to('/'), date('c', time()) , '1.0', 'daily');


        $tabs = Tab::where('sub_domain_id', null)->get();
        $tabResult = array();
        if(!empty($tabs)){
            foreach ($tabs as $key => $value) {
                $tabResult[$value->id]['id'] = $value->id;
                $tabResult[$value->id]['slug'] = $value->slug;
                $tabResult[$value->id]['title'] = $value->title;
                $tabResult[$value->id]['updated_at'] = $value->updated_at;
                $tabResult[$value->id]['image'][] = $value->image;
            }
        }

        /* add every tab to the sitemap */
        foreach ($tabResult as $key=>$value)
        {
            $images = array();
            foreach ($value['image'] as $key2 => $value2) {
                if(isset($value2))
                {
                    $images[] = array(
                        'url' => route('getEntry', ['tab', $value2]),
                        'title' => $value['slug'],
                        'caption' => $value['title']
                    );
                }

            }
            $sitemap->add(route('tab.show',[$value['id'], $value['slug']]), $value['updated_at'], '1.0', 'daily', $images);
        }

        /*******************************************************/
        $tabs = News::where('sub_domain_id', null)->get();
        $tabResult = array();
        if(!empty($tabs)){
            foreach ($tabs as $key => $value) {
                $tabResult[$value->id]['id'] = $value->id;
                $tabResult[$value->id]['slug'] = $value->slug;
                $tabResult[$value->id]['title'] = $value->title;
                $tabResult[$value->id]['updated_at'] = $value->updated_at;
                $tabResult[$value->id]['image'][] = $value->image;
            }
        }

        /* add every tab to the sitemap */
        foreach ($tabResult as $key=>$value)
        {
            $images = array();
            foreach ($value['image'] as $key2 => $value2) {
                if(isset($value2))
                {
                    $images[] = array(
                        'url' => route('getEntry', ['news', $value2]),
                        'title' => $value['slug'],
                        'caption' => $value['title']
                    );
                }
            }
            $sitemap->add(route('news.show',[$value['id'], $value['slug']]), $value['updated_at'], '1.0', 'daily', $images);
        }

        /*******************************************************/
        $tabs = Menu::where('sub_domain_id', null)->get();
        $tabResult = array();
        if(!empty($tabs)){
            foreach ($tabs as $key => $value) {
                $tabResult[$value->id]['id'] = $value->id;
                $tabResult[$value->id]['slug'] = $value->slug;
                $tabResult[$value->id]['title'] = $value->title;
                $tabResult[$value->id]['updated_at'] = $value->updated_at;
                $tabResult[$value->id]['image'][] = $value->image;
            }
        }

        /* add every tab to the sitemap */
        foreach ($tabResult as $key=>$value)
        {
            $images = array();
            foreach ($value['image'] as $key2 => $value2) {
                if(isset($value2))
                {
                    $images[] = array(
                        'url' => route('getEntry', ['menu', $value2]),
                        'title' => $value['slug'],
                        'caption' => $value['title']
                    );
                }
            }
            $sitemap->add(route('menu.show',[$value['id'], $value['slug']]), $value['updated_at'], '1.0', 'daily', $images);
        }
        /*******************************************************/
        $tabs = IranianStudent::where('sub_domain_id', null)->get();
        $tabResult = array();
        if(!empty($tabs)){
            foreach ($tabs as $key => $value) {
                $tabResult[$value->id]['id'] = $value->id;
                $tabResult[$value->id]['slug'] = $value->slug;
                $tabResult[$value->id]['title'] = $value->title;
                $tabResult[$value->id]['updated_at'] = $value->updated_at;
                $tabResult[$value->id]['image'][] = $value->image;
            }
        }

        /* add every tab to the sitemap */
        foreach ($tabResult as $key=>$value)
        {
            $images = array();
            foreach ($value['image'] as $key2 => $value2) {
                if(isset($value2))
                {
                    if(isset($value2))
                    {
                        $images[] = array(
                            'url' => route('getEntry', ['is', $value2]),
                            'title' => $value['slug'],
                            'caption' => $value['title']
                        );
                    }
                }
            }
            $sitemap->add(route('is.show',[$value['id'], $value['slug']]), $value['updated_at'], '1.0', 'daily', $images);
        }

        /*******************************************************/
        $tabs = NewVolunteer::where('sub_domain_id', null)->get();
        $tabResult = array();
        if(!empty($tabs)){
            foreach ($tabs as $key => $value) {
                $tabResult[$value->id]['id'] = $value->id;
                $tabResult[$value->id]['slug'] = $value->slug;
                $tabResult[$value->id]['title'] = $value->title;
                $tabResult[$value->id]['updated_at'] = $value->updated_at;
                $tabResult[$value->id]['image'][] = $value->image;
            }
        }

        /* add every tab to the sitemap */
        foreach ($tabResult as $key=>$value)
        {
            $images = array();
            foreach ($value['image'] as $key2 => $value2) {
                if(isset($value2))
                {
                    $images[] = array(
                        'url' => route('getEntry', ['nv', $value2]),
                        'title' => $value['slug'],
                        'caption' => $value['title']
                    );
                }
            }
            $sitemap->add(route('nv.show',[$value['id'], $value['slug']]), $value['updated_at'], '1.0', 'daily', $images);
        }

        /* show your sitemap (options: 'xml' (default), 'html', 'txt', 'ror-rss', 'ror-rdf') */
        return $sitemap->render('xml');
    }

امیدوارم استفاده کنید و لذت ببرید.سوال یا نظری داشتید بپرسید

در همین رابطه :   پلاگین Under Construction برای لاراول

منبع

دسته بندی : Laravel

7 نظر

  1. سلام من
    یک سایت مپ با همین پکیج ایجاد کردم توی لوکال هاست مشکل نداره ولی توی هاست این ارور را می دهد:
    This XML file does not appear to have any style information associated with it. The document tree is shown below.

    می توانید راهنمایی کنید مشکل از چی هست؟

    1. سلام.
      راه های مختلفی داره می تونید با استفاده از روابط دسته بندی هایی رو ایجاد کنین . یا می تونید از پلاگین عالی laravel nestedset استفاده کنید که من در همه پروژه هام ازش استفاده می کنم و ویژگی عالیش امکان ایجاد دسته بندی های داخل هم نامحدود هست .کاری که خودمون انجام بدیم زمان بره

  2. سلام داداش دمت گرم.
    اولین سایتم رو دارم با لاراول میسازم کارم رو راه انداخت، یه سایت مپ تک صفحه ای ساختم پست ها و کتگوری ها رو ریختم توش، ولی از عکس ها سر در نیاوردم بیخیالش شدم.
    برای نصبش هم یکم مشکل داشتم. رو لاراول 5.4 اگه بخواید نصب کنید باید توی composer.json اضافش کنید.
    و ورژن 2.6 و خورده یی رو هم باید نصب کنید، 2.7 نصب نمیشه روی لاراول 5.4 :
    اینو به require اضافه کنید:
    “roumen/sitemap”: “2.6.*”
    یه داکیومنتیشن هم تو گیتهاب داره. ; )

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *