• 27-02-2022, 04:18:16
    #1
    Yazılım bir okyanustur. Bu okyanusta kimileri gemi, kimileri tekne, kimileri sandal ile seyahat eder. Kimileride yüzmeyi sever ve sürekli yüzer.

    Yukardaki cümlede anlatılmak istenen nedir? Her beynin farklı bir düşünme yapısı vardır. Her yazılımcı farklı yollardan sonuca varır. Kafa boşaltmak için boş zamanlarımda yazacağım bu ipuçları bazı insanlara mantıklı gelmeyebilir. Bir görüşünüz var ise benim görüşüme çamur atmayın. Çünkü ben zaten bir görüş belirtiyorum. Okyanus üzerinde hepinize iyi seyahatler dilerim..


    # SEO URL nasıl yapılır?
    Seo url htaccess içerisinde link yapılarını manipüle ederek okunaklı site linkleri oluşturmaya yaradığını bilmeyeniniz yoktur. Bizim yapımızda bir URL'e sahip olan tüm içerikleri tek bir tabloda oluşturuyoruz.
    ÖRN: Sayfa, yazı, hizmet, duyuru, etkinlik vs..

    Basit mantıkla düşünürsek URL'e sahip olan içeriklerin belirli özellikleri olur.
    ÖRN:
    • Banner - Resim
    • Title - Başlık
    • Content - İçerik
    • Meta Seo - Meta Title, Meta keyw, Meta desc
    • Seo URL - Seo linki
    • Dates - Eklenme Tarihi
    • Status - Durum

    Zamanında satışa sunduğum kurumsal scriptlerde bu anlatacağım yapıyı kullandım. Bana o zaman mantıklı geliyordu, birkaç değişiklik yaparak dahada geliştirdim, düzenledim. Aslında düşündükçe ulan daha iyisini yapabilirmişim dediğim çok alan olmadı değil

    Neyse konuya dönelim. Yukarıdaki listede bir URL'e sahip olacak içeriklerin ortak sütunlarını görüyoruz. Bunların haricinde olabilecek içerikleri iki şekilde entegre edebiliriz.
    1. Bir sutün daha açıp ekstra içerikleri bu sutüna json olarak depolamak.
    2. Bu tablo dışınnda ekstralar için ayrı ayrı tablo oluşturup eklenen içeriğe göre o tabloyu manipüle etmek ( ekleme düzenleme silme işlemleri için ekstra sorgu yazmaktan bahsediyorum )

    Benim sistemde kullandığım tablo görseldeki gibiydi. Resmi inceleyin bir mantık kafanızda oturacaktır. Ben içeriklerin türüne göre ayrılmasını sağlamak adına post_type adında bir sutün eklemiştim. Burada içeriğe göre bir anahtar kelime belirleyip kaydediyor, veri düzenleme, ön kısımda veri çekme işlemi yaparken bu anahtar kelimeye göre veri çekme işlemi gerçekleştiriyordum.

    Şimdi ben bunu neden anlatıyorum? Amaç MVC altyapısı olmayan projelerde tek bir RewriteRule kuralı kullanarak URL'leri manipüle etmek. Dil olayını anlatmayacağım o başka bir ipuçu konusu olacak.
    Tablo yapısında seo_title, seo_keyword, seo_description alanlarını tek bir sütun içerisinde json olarakta depolayabilirsiniz. Zamanında bu şekilde yapmışım o yüzden ekstra değişiklik yapmadım görselde.

    Resmi incele okumaya devam et...



    Evet gelelim ön kısma. İki adet htaccess kuralına ihtiyacımız var. Bknz;
    RewriteEngine on
    RewriteRule ^([0-9a-zA-Z-_/]+)$ directs.php?seo_url=$1 [QSA]
    İlk kodumuz yeniden yazma motorunu aktif ediyor. İkinci kodumuzda URL yapımız için yazılan kural. Basitce directs.php sayfasına gelen seo_url anahtar kelimelerini SEO URL yapısına çeviriyor.

    Şimdi neden index değilde directs.php?
    Ben anasayfayı sabit kullanıp URL'e sahip sayfaları bu sayfa içerisinde manipüle etmeye karar vermişim özel bir sebebi yok Benim anasayfada modüller vs olduğu için o zaman kafam acayip karışmış olabilir. Bu sayfa içerisinde URL sahip olupta eklediğiniz tüm içerikleri döndürüyoruz işte kısacası.
    Ayrımı nasıl yapıcaz?
    İyi anlatıyorsun da şablonları farklı olabilecek içerikleri nasıl ayırıcaz diyecekseniz, tablo oluştururken eklemiş olduğum post_type 'ın faydasınıda burada göreceğiz. Eklenen içeriklerin kısmında aynı URL'e sahip olmaması için gerekli önlemi almadıysanız almanızı mutlaka öneririm. Bu benlik bir durum değil sizin yapınız ile alakalı bir sorundur. Bizim yapıda site.com/seo-url olarak işliyor. ID'ye göre değil seo_url göre çekim ve yönlendirme işleri yapıyoruz.
    Genellikle sayfaların şablonları farklı olur. Örn: kurumsal, hizmetler, ürünler, iletisim vb. Bunlar içinde template sütununu kullanmıştım. Ayrımı post_type sütunu, şablon farklılığını template sütunu ile halletmişim zamanında.
    Tamam hadi sadede gel diyenler için. [post_type]

    • Yazarak anlatmak biraz daha zahmetli oluyormuş Sadede geliyorum.
    • Tüm URL sahip içerikler posts tablosunda kayıt altına aldık.
    • directs.php dosyamızı oluşturup htaccess kodumuzu ekledik.
    • directs.php içerisinde türlere göre $_GET['seo_url'] yi post_type yardımıyla sorguluyoruz sorguları ayrı ayrı değişkenlere atayıp if else yapısı ile kontrol ederek sayfa include ediyoruz.
    Örn( Burada iki tür sorgulaması gösterdim içeriğinize göre bunları siz çoğaltırsınız ):
      require_once 'header.php';
    
    // $_GET['seo_url'] page query
    $pageAsk=$db->prepare("SELECT * FROM posts WHERE post_type=:post_type AND seo_url=:seo_url");
    $pageAsk->execute(array(
    'post_type' => 'post_page',
    'seo_url' => $_GET['seo_url']
    ));
    $pagesCount=$pageAsk->rowCount();
    
    // $_GET['seo_url'] post query
    $postAsk=$db->prepare("SELECT * FROM posts WHERE post_type=:post_type AND seo_url=:seo_url");
    $postAsk->execute(array(
    'post_type' => 'post_post',
    'seo_url' => $_GET['seo_url']
    ));
    $postCount=$postAsk->rowCount();
    
    if ($pagesCount){
    require_once 'pages.php';
    }elseif($postCount){
    require_once 'postspage.php';
    }else{
    header("Location: 404.php");
    }
    require_once 'footer.php';
    Örneğe nazaran bu sayfalar servicespage.php , productpage.php vb gibi giderek uzayabilir. post_type bu kısımda işimizi halletmeye yardımcı oldu.

    Tamam hadi sadede gel diyenler için #2. [template]
    pages.php benim sayfalarımı döndürdüğüm kısımdı. Buradaki olay $_GET['seo_url'] değişkenini bir kere daha sorguya alıp bir değişkene verileri fetch'liyorum. Daha sonra template sütunundaki anahtar kelimeyi switch'e sokup ilgili şablonun olduğu dosyayı sayfaya include ediyorum.
    Örn:
     $pageDataAsk->execute(array(
    'seo_url' => $_GET["seo_url"],
    'post_type' => 'post_page',
    'language' => $getLangCheck['language_id']
    ));
    $pageDataCheck=$pageDataAsk->fetch(PDO::FETCH_ASSOC);
    
    switch ($pageDataCheck['template']){
    case 'emptytemplate':
    include "variation/page/emptypage.php";
    break;
    case 'contacttemplate':
    include "variation/page/contacttemplate.php";
    break;
     }
    Bu sayfa içerisinde verileri bir değişkene atadığımız için include edilen sayfada aynı değişkeni kullanarak verileri yazdırabilirsiniz.

    Olay bu şekilde çözüme kavuşmakta.

    ### Önemli
    Kategoriler için ise directs.php içerisinde yaptığınız sorgularda bu tabloyuda sorgulayıp yönlendirme yapabilirsiniz. Dikkat etmeniz gereken şey seo_url'lerin aynı olmaması. Gerçi ekstra prefix ekleyerek bu sorununda önüne geçebilirsiniz.


    Bu konu bu kadar. Bu yapıyı 3 yıl önce ağır sanayi işinde çalışırken akşamları fırsat oldukça parça parça kurdum. Mantıksız gelebilir. Mantıklıda gelebilir.
    Şimdiki deneyimlerim 3 yıl önce olsaydı böyle bir yapı kurar mıydım?
    Kesinlikle hayır. Yani kısmen hayır. Daha basit haliyle yada kısa yoldan yapabilirdim.
    Bu sistem şuan işe yarar mı?
    Elbette yarar. R10 üzerinde 30+ kişi bu sistem ile çalışan ürünleri satın aldı ( satın alanlarda bayağı satmıştır ) . Forum dışında 20+ firmaya bu sistemle çalışan kurumsal siteler yapıldı.

    Yazılım mantık işidir arkadaşlar, önünüze çorba gelir içmek için ya kaşık yaparsınız yada kafanıza dikersiniz. Hala iş görecek bir sistem olduğu için fikir olması açısından paylaşmak istedim. Uzun zamandır bir paylaşımda bulunmuyordum. Zaman zaman böyle ipuçları, püf noktaları paylaşmayı düşünüyorum.

    Hepiniz sevgiyle, saglıkla kalın.
    Klavyemiz basmadıysa affola..
  • 27-02-2022, 04:29:55
    #2
    AI Prof. ✍️
    Elinize sağlık, çok güzel ve detaylı işlemişsiniz
  • 27-02-2022, 10:07:46
    #3
    Paylaşım için teşekkürler, çok yararlı bir içerik olmuş ellerinize sağlık.
  • 27-02-2022, 10:18:19
    #4
    Bu şekilde değilde slugs diye bi tablo oluşturun. Bu tabloya bağlayın tüm tabloları. En doğru yol bu olur.

    Örneğin ;
    pages tablosu:

    slug_id
    title
    contents
    created_at
    updated_at


    Post tablosu:
    slug_id
    title
    contents
    created_at
    updated_at

    products tablosu:

    slug_id
    title
    contents
    created_at
    updated_at

    slugs tablosu:
    id
    slug
    target

    bu şekilde yaparsınız. Tüm trafiği index.php'ye yönlendirirsiniz.

    Ordan routeyi parçalarsınız.

    mesela
    /contact olsun link

    slugs'da contact'ı bulursa target'den pages tablosuna gider verileri gösterirsiniz.

    Ne faydası olacak?

    Tüm linkleriniz için bi prefix kullanmamış olursunuz.

    Güzel bir yapı elde edersiniz.
  • 27-02-2022, 14:26:40
    #5
    İki detaylı paylaşım için de teşekkürler.
  • 27-02-2022, 22:32:58
    #6
    Cycl0ne adlı üyeden alıntı: mesajı görüntüle
    Bu şekilde değilde slugs diye bi tablo oluşturun. Bu tabloya bağlayın tüm tabloları. En doğru yol bu olur.

    Örneğin ;
    pages tablosu:

    slug_id
    title
    contents
    created_at
    updated_at


    Post tablosu:
    slug_id
    title
    contents
    created_at
    updated_at

    products tablosu:

    slug_id
    title
    contents
    created_at
    updated_at

    slugs tablosu:
    id
    slug
    target

    bu şekilde yaparsınız. Tüm trafiği index.php'ye yönlendirirsiniz.

    Ordan routeyi parçalarsınız.

    mesela
    /contact olsun link

    slugs'da contact'ı bulursa target'den pages tablosuna gider verileri gösterirsiniz.

    Ne faydası olacak?

    Tüm linkleriniz için bi prefix kullanmamış olursunuz.

    Güzel bir yapı elde edersiniz.
    Konunun ilk satırlarını okumadınız sanırım. Yinede teşekkür ederiz engin bilgilerinizi bizimle paylaştığınız için.
  • 03-03-2022, 14:13:57
    #7
    Çok güzel konu hocam tebrik ederim.Ammaa velakin o okyanusta köpek balığına rastlamamak için kullanıcıdan aldığın her veriyi süzgeçten geçirmelisin.Yoksa köpek balığı bizi yutabilir .Yararlı konu.