Bir altyapı geliştirici (backend developer) olarak sıfırdan içerik yönetim sistemi yazıyorsanız mutlak projenin arama motoru optimizasyonunu da (SEO) düşünmelisiniz. Malum artık müşteriler sadece platform veya website istemiyorlar, hedefledikleri kelimelerde en üst sırada çıkacak sihirli sistemler talep ediyorlar. Tamam belki bu konuda sihir yapamayız ancak yine de Laravel framework ile geliştireceğimiz özgün içerik yönetim sistemlerinde oldukça kuvvetli bir SEO altyapısı kurabiliriz. Bu yazımda da bazı Laravel paketlerinden ve yapısal optimizasyon için hesaba katmanız gereken hususlardan bahsedeceğim.
Laravel SEO Neleri İçerir?
Öncelikle şunu bilmeliyiz, bizim burada anlatacağımız optimizasyon, sadece sistemimizin yapısı ile alakalıdır. SEO’nun günümüzde nasıl bir disiplin (adeta bilim dalı) haline geldiğini düşünürsek yapabileceklerimizin kısıtlı olduğunu da rahatlıkla görebiliriz. Gerçek anlamda SEO için buradaki tedbirler alındıktan sonra kaliteli seo hizmeti veren, SEO nedir? sorusunun cevabını referanslarıyla destekleyerek cevaplayan firmalar ile görüşmeliyiz.
Gelelim burada alacağımız tedbirlere. Bu yazıda özetle şu konulara değineceğim. Laravel’de;
- SEO dostu url kullanılması,
- SEO meta etiketlerinin oluşturulması,
- Kırık linklerin tespit edilmesi,
- Site haritasının (Sitemap) oluşturulması,
- Cache ile sitenin SEO için hızlandırılması.
- Yönlendirmeler.
- Diğer Hususlar
1. SEO Dostu URL Kullanılması
Sanırım konunun en basit olan kısmı burası çünkü zaten Laravel bünyesinde oldukça güçlü ve esnek bir routing desteğiyle geliyor. Tek yapmamız gereken aşağıdaki gibi bir kodla routing özelliğinden faydalanmak.
Route::get('/makaleler/{slug}', 'HomepageController@post');
Tabi bu tür bir route yapısını en etkili şekilde kullanabilmek için hemen hemen tüm modüllerimizde (yazılar, kategoriler vs.) veri olarak başlık (title) ile beraber kısa ad (slug) oluşturmalı ve URL yapısında bu kısa adları kullanmalıyız.
Slug oluştururken kullanabileceğiniz hazır paketleri olduğu gibi henüz form aşamasında iken daha önce anlatmış olduğum jQuery Türkçe Slug Eklentisi‘ni kullanabilir veya aşağıdaki kodları kullanarak Türkçe Slug helper’ı oluşturabilisiniz.
2. Laravel SEO Meta Etiketleri Oluşturma
SEO meta etiketinden kastım yalnızda title ve meta description değil. Bunlara ilave olarak Open Graph, Twitter, Canonical ve diğer meta etiketlerini kastediyorum.
Neyse ki bu ihtiyaçlarımızı basit bir şekilde karşılayacak bir paket mevcut: SEOTools. Vermiş olduğum adreste kurulumu basit bir şekilde anlatılmış. Ben ise kısaca kullanımına değineceğim.
Bu paketi kullanırken öncelikle Controller dosyasında gerekli atamları yapacağız. Sonra da tasarımımızın etiketlerini içeren View dosyasında biraz önce tanımlamış olduğumuz verileri çağıracağız.
Not: Buradan sonraki adımları yapabilmek için paketin kurulumunun sorunsuz bir şekilde yapıldığından emin olunuz.
Controller Dosyası
Projemizin anasayfa ve içerik sayfasında (post vb.) kullancağımız meta etiketlerini, SEOTools paketi yardımıyla Controller dosyasında aşağıdaki şekilde üretebiliriz.
use SEOMeta; use OpenGraph; use Twitter; class CommomController extends Controller { public function index() { SEOMeta::setTitle('Yakuter | biri kod mu dedi?'); SEOMeta::setDescription('Programlamaya dâir yazılar'); SEOMeta::setCanonical('https://www.yakuter.com'); OpenGraph::setDescription('Programlamaya dâir yazılar'); OpenGraph::setTitle('Yakuter | biri kod mu dedi?'); OpenGraph::setUrl('https://www.yakuter.com'); OpenGraph::addProperty('type', 'articles'); Twitter::setTitle('Yakuter | biri kod mu dedi?'); Twitter::setSite('@yakuter'); $posts = Post::all(); return view('myindex', compact('posts')); } public function show($id) { $post = Post::find($id); SEOMeta::setTitle($post->title); SEOMeta::setDescription($post->resume); SEOMeta::addMeta('article:published_time', $post->published_date->toW3CString(), 'property'); SEOMeta::addMeta('article:section', $post->category, 'property'); SEOMeta::addKeyword(['key1', 'key2', 'key3']); OpenGraph::setDescription($post->resume); OpenGraph::setTitle($post->title); OpenGraph::setUrl($post->slug); OpenGraph::addProperty('type', 'article'); OpenGraph::addProperty('locale', 'tr-TR'); OpenGraph::addProperty('locale:alternate', ['en-us']); OpenGraph::addImage($post->cover->url); OpenGraph::addImage($post->images->list('url')); OpenGraph::addImage(['url' => 'http://image.url.com/cover.jpg', 'size' => 300]); OpenGraph::addImage('http://image.url.com/cover.jpg', ['height' => 300, 'width' => 300]); return view('myshow', compact('post')); } }View Dosyası
Controller dosyasında gerekli verileri ürettikten sonra bunları View dosyasında çağırmalıyız. Bunun için blade şablonda etiketleri arasına şu satırları eklememiz yeterli olacaktır.
{!! SEOMeta::generate() !!} {!! OpenGraph::generate() !!} {!! Twitter::generate() !!}3. Kırık Linklerin Tespit Edilmesi
Sitelerimizde kırık yani ulaşılamayan link bulunması ciddi bir konudur ve mutlaka önüne geçilmesi gerekir. Bunun için de birçok başarılı Laravel paketinin yapımcısı Spatie'nin geliştirdiği laravel-link-checker paketinden faydalanabiliriz. Bu paket sayesinde sitemizdeki tüm linkler test edilir ve test sonucunda başarısız olanlar yani kırık linkler log olarak kaydedilir. Tabi paketteki özellikler sayesinde dilerseniz eposta ile uyarı gelmesini de sağlayabilirsiniz. Son olarak size de bu linkleri siteden kaldırmak kalır.
Paketin kurulumu ve kullanımı hakkında bilgi almak için laravel-link-checker github sayfasına bakabilirsiniz. Paket kurulumunu yaptıktan sonra link test etme olayını şu konsol komutuyla yapabilirsiniz:
php artisan link-checker:runEğer söz konusu kırık bağlantı tespit işleminin düzenli aralıklarla cron job şeklinde yapılmasını istiyorsanız, bunun için de aşağıdaki gibi bir kod kullanabilirsiniz.
// app/console/Kernel.php protected function schedule(Schedule $schedule) { ... $schedule->command('link-checker:run')->sundays()->daily(); } ...4. Site Haritasının (Sitemap) Oluşturulması
Arama motorlarının (Google, Yandex, Bing) sitemizdeki tüm linkleri doğru ve eksiksiz bir şekilde indeksleyebilmesi için onlara yol göstermeliyiz. Seocu.com gibi bu işin uzmanı sitelerde de özellikle vurgulanan bu konuda ilk aşama sağlıklı bir site haritası (sitemap) oluşturmaktır. Bu konuda Laravelium'un laravel-sitemap paketini kullanıyorum. Bu paket ile sitedenin içeriğini aşağıdaki örnekte gördüğünüz gibi manuel olarak site haritasına ekleyerek tamamen benim istediğim şekilde bir site haritası oluşturulmasını sağlayabiliyorum. Ancak kimisi bunu zahmetli bulup sitedeki içeriğin taranarak (crawl) otomatik bir şekilde site haritası üreten paketleri tercih edebiliyor. Siz de böyle bir çözüm isterseniz yine Spatie tarafından geliştirilen laravel-sitemap'i kullanabilirsiniz.
Laravelium'un laravel-sitemap paketi ile site haritası oluşturma örneği:
Route::get('mysitemap', function(){ $sitemap = App::make("sitemap"); // haritaya yeni bağlantı eklenmesi (url, date, priority, freq) $sitemap->add(URL::to(), '2012-08-25T20:10:00+02:00', '1.0', 'daily'); $sitemap->add(URL::to('page'), '2012-08-26T12:30:00+02:00', '0.9', 'monthly'); // veritabanındaki tüm yazıların (post) çekilmesi $posts = DB::table('posts')->orderBy('created_at', 'desc')->get(); // her yazının tek tek site haritasına eklenmesi foreach ($posts as $post) { $sitemap->add($post->slug, $post->modified, $post->priority, $post->freq); } // site haritasının dosya olarak oluşturulması (format, dosya ismi) $sitemap->store('xml', 'sitemap'); // Bu kod laravel projenizin public dizininde sitemap.xml isminde bir dosya oluşturur. });5. Cache ile Sitenin SEO için Hızlandırılması
Laravel'in en güçlü yanlarından birisi de doğal Cache (önbellek) yeteneğidir ve hiçbir ilave pakete ihtiyaç kalmadan bu özellikten faydalanabilirsiniz. Ancak ben Redis altyapısı ile birlikte Spiritix'in cache paketi lada-cache'i kullanmayı tercih ediyorum. Bu paket sayesinde modellerinizin ve doğal olarak tüm veritabanı sorgusu ile sonuçlarınızın aşağıdaki örnekte gördüğünüz gibi tek satırlık kod ile Redis tabanlı object cache önbelleğine alınmasını ve oradan çağırılmasını sağlayabilirsiniz.
6. Yönlendirmeler
Yönlendirmeler SEO konusunun önemli bir ayağını oluşturur. Bu husus özellikle sitenizin url yapısında değişiklik yaptığınızda veya sitenizi farklı bir alan adına taşıdığınızda kendini gösterir. İşte böyle durumlarda Google'daki indekslerin ulaşılabilir olması için yönlendirmelerden faydalanırız. WordPress gibi platformlarda bu konu Yoast SEO gibi eklentilerle rahatlıkla çözülebildiği gibi Laravel uygulamalarda da Laravel Missing Page Redirector paketinden faydalanabilirsiniz.
Laravel yönlendirme paketinin kullanımı da oldukça basit. Tek yapmanız gereken paketi kurduktan sonra config klasörüne eklenen missing-page-redirector.php dosyasındaki redirects değişkenine aşağıdaki örnekte olduğu gibi yönlendirilecek adresleri eklemek. Varsayılan olarak yönlendirmeler 301 olarak yapılmakta ancak üçüncü örnekte görebileceğiniz gibi farklı HTTP STATUS ile de aynı işlemi gerçekleştirebilirsiniz. Hepsi bu kadar.
'redirects' => [ '/eski-adres' => '/yeni-adres', '/eski-blog/{url}' => '/yeni-blog/{url}', 'eski-adres' => ['/yeni-adres', 302], ],7. Diğer Hususlar
Burada hep yapıdan bahsettim ancak esas meselenin SEO uyumlu içerik olduğunu unutmayınız. Bu konuda malum bazı kriterler var;
- Yazının uzun olması,
- Site içi bağlantı bulundurması,
- Site dışı bağlantıların sayısı ve nofollow özelliği,
- Vurgulanmak istenen metinlerin vb. etiketlerle işaretlenmesi,
- Anahtar kelimenin yoğunluğu gibi.
Sistemi kurduktan sonra içeriklerin bu prensipler ışında hazırlandığından emin olursanız hedeflerinize kısa sürede ulaşabileceğinize inanıyorum.
Son Sözler
Bir içerik yönetimi sıfırdan yazarken düşünmeniz gereken birçok konu vardır. Arama Motoru Optimizasyonu (SEO) ise başlı başına değerlendirilmesi gereken bir husustur ve çok fazla yapılacak iş bulunduğundan gözden kaçan noktalar olabilir. Bu yazıyı yazmamdaki esas gerekçe de rehber niteliğinde bir içerik ortaya çıkarmak ve proje üretiminde adım adım bu maddeleri izlemek. Faydalı olması ümidiyle.