WordPress – Sayfalama Yapımı

18 Kasım 2019 tarihinde Emre Can ÖZTAŞ tarafından paylaşıldı.

Paylaştığınız içeriklerin tümünü aynı sayfada yayınlamak hem site hızını düşürecek hem de kullanıcı deneyini açısından pekte hoş olmayan sonuçlar doğuracaktır. Bunun yerine; içeriklerinizi sayfalara bölmek daha mantıklı ve isabetli bir seçim olacaktır.

WordPress ortamında, sayfalama yapımı için gayet başarılı eklentiler mevcut. Bunlardan en popüler olanı: WP-PageNavi eklentisi. Kullanımı oldukça basit ve etkili olan bir eklenti. Bu eklenti yardımı ile kolaylıkla sayfalama işlemlerinizi gerçekleştirebilirsiniz.

Az çok sayfamı takip ediyorsanız; eklentiler konusunda pekte sıcak bir yaklaşım sergilediğim söylenemez. Çünkü; WordPress ortamında oldukça başarılı ve ilgi çekici eklentiler var. Onu da ekleyip bu da iyiymiş bunu da ekleyeyim derseniz bu işin sonu oldukça hantal bir web site ile biter ve daha sonra da performans sorunlarıyla uğraşırsınız. Dolayısıyla; ben eklenti kullanımına pek sıcak bakmıyorum. Bunun yerine; zorunlu olmadıkça gerekli olan problem ve iyileştirmeleri kendim yazıyorum. Yazdığım bu kodları da blogumda paylaşıyorum. İşte bu yazı da böyle bir durumda ortaya çıkan yazılardan birisi.

Öncelikli olarak; paylaşımlarımızın her sayfada kaç adet yer alacağını belirlememiz gerekiyor. Bu işlemi farklı yollarla yapabilirsiniz ama en basit yol:

Ayarlar > Okuma

yolu takip edilerek, açılan sayfadan; “En fazla gösterilecek blog sayfası adedi” değerini belirlemektir. 5 – 10 arasında gösterim her zaman iyidir.

Yukarıdaki ekran alıntısında da görüldüğü üzere; bir sayfada yayınlanacak paylaşım adedini 5 olarak ayarladık.

Şimdi artık kodlarımıza geçebiliriz. Aşağıdaki kodlarımızı functions.php dosyasına ekleyelim ve daha sonra açıklamasını yapalım.

if (!function_exists('create_pagination')) {
    function create_pagination()
    {
        global $wp_query;
        
        $total_page = $wp_query->max_num_pages;
        $end_number = 99999999;

        $args = array(
            'base'               => str_replace($end_number, '%#%', esc_url(get_pagenum_link($end_number))),
            'format'             => '?page=%#%',
            'total'              => $total_page,
            'current'            => max(1, get_query_var('paged')),
            'show_all'           => false,
            'end_size'           => 1,
            'mid_size'           => 2,
            'prev_next'          => true,
            'prev_text'          => 'Önceki',
            'next_text'          => 'Sonraki',
            'type'               => 'plain',
            'add_args'           => false,
            'add_fragment'       => '',
            'before_page_number' => '',
            'after_page_number'  => ''
        );

        if ($total_page > 1) {
            echo(paginate_links($args));
        }
    }
}

Yukarıdaki kodlarımızda öncelikli olarak; $wp_query global nesnesini çağırdık. $wp_query, WP_Query sınıfına ait olan bir nesne. Bu nesne ile çeşitli sorgulama işlemlerini gerçekleştirebilirsiniz. Örneğin; herhangi bir sayfada herhangi bir post’u veya post’ları çağırabilirsiniz. Biz de bu nesneyi; standart sorgulamada kaç adet paylaşım olduğunu öğrenmek için çağırdık. Kaldı ki $total_page değişkeni de kaç adet paylaşım olduğunu tutan bir değişken olarak tanımladık. WP_Query sınıfını detaylı olarak buradan inceleyebilirsiniz. $end_number ise; sayfalamanın sınırını belirliyor. Burada; olabildiğince büyük bir sayı vermemiz doğru olacaktır.

Şimdi gelelim $args dizi değişkenine.

$args dizi değişkeninde sayfalamaya ilişkin çeşitli kurallar tanımlamamız gerekiyor. Bu kuralların tam listesi ve açıklaması aşağıdaki gibidir.

base: (isteğe bağlı) Sayfalandırılmış bağlantıları oluşturmak için kullanılacak URL’ye başvurmak için kullanılır. Default olarak; ‘%_%’ değerine sahiptir.

format: (isteğe bağlı) Sayfalandırma yapısı için kullanılır. Default olarak; ‘?page=%#%’ değerine sahiptir.

total: (isteğe bağlı) Toplam paylaşım miktarıdır. Default olarak; 1 değerine sahiptir.

current: (isteğe bağlı) Şimdi yani aktif sayfa numarasıdır. Default olarak; 0 değerine sahiptir.

show_all: (isteğe bağlı) Geçerli sayfanın yakınındaki sayfaların kısa bir listesi ya da tüm sayfaların mı gösterileceğini belirler. Default olarak; false değerine sahiptir.

end_size: (isteğe bağlı) Başlangıç ve bitiş listesi kenarlarında kaç sayı yer alacağını belirler. Default olarak; 1 değerine sahiptir.

mid_size: (isteğe bağlı) Aktif sayfa dışında, aktif sayfanın her iki yanına kaç kaç sayfa numarası geleceğini belirler. Default olarak; 2 değerine sahiptir.

prev_text: (isteğe bağlı) Bir önceki sayfanın metnidir. Default olarak; __(‘« Previous’) değerine sahiptir.

next_text: (isteğe bağlı) Bir sonraki sayfanın metnidir. Default olarak; __(‘Next »’) değerine sahiptir.

type: (isteğe bağlı) Sayfalama çıktısının ne tipte olacağını belirler. Plain, Array ve List şeklinde 3 farklı değer alabilir. Default olarak; plain değerine sahiptir.

add_args: (isteğe bağlı) Bir sorgu dizisi eklemek için kullanılır. Default olarak; false değerine sahiptir.

add_fragment: (isteğe bağlı) Her bağlantıya bir dize eklemek için kullanılır. Default olarak; boştur.

before_page_number: (isteğe bağlı) Sayfa numarasından önce görünecek olan bir dizeyi belirtir. Default olarak; boştur.

after_page_number: (isteğe bağlı) Sayfa numarasından sonra görünecek olan bir dizeyi belirtir. Default olarak; boştur.

Sonra olarakta sayfa sayısı 1’den büyük ise; paginate_links($args) fonksiyonu ile sayfalama işlemini tamamladık.

Peki bu sayfalamayı işlemini sayfamızda nasıl yapacağız? Çözümü basit. Paylaşımlarımızın olduğu ekranda;

create_pagination();

çağıracağız.

Sonuç aşağıdaki gibi olacaktır.

Yukarıdaki ekran alıntısında da görüldüğü üzere sayfalama işlemimizi tamamladık. Ben örnek olması açısından 6 adet yazı girdim. Sonraki veya 2’nci sayfaya tıkladığımda da diğer sayfadaki içerik gelecektir.

Şimdi burada dikkatinizi çekmek istediğim bir konu var. Bu konudan bahsetmeden önce bir de link yapısına bakalım.

Link yapımız aynen şu şekilde:

http://127.0.0.1/wordpress/page/2/

Yani sayfalamada “page” ifadesi default olarak kullanılıyor. Türkçe bir site için bu çok kötü bir yaklaşım açıkçası. Ama hiç farketmez bunun da bir çözümü elbette var.

Öncelikli olarak aşağıdaki kodlarımızı functions.php içerisine yerleştirelim.

add_action('init', 'change_rewrite_rules');

if (!function_exists('change_rewrite_rules')) {
    function change_rewrite_rules() {
        global $wp_rewrite;
        $wp_rewrite->author_base        = 'yazar';
        $wp_rewrite->search_base        = 'arama-sonucu';
        $wp_rewrite->comments_base      = 'yorum';
        $wp_rewrite->pagination_base    = 'sayfa';

        $wp_rewrite->flush_rules();
    }
}

Şimdi kodlarımıza bakalım. $wp_rewrite global nesnesi, WP_Rewrite sınıfına ait olan bir nesne. WP_Rewrite sınıfı doğrudan .htaccess üzerinde işlem yapar. Bu sınıfın amacı; çeşitli server kaynaklı parametreleri değiştirmektir. Örneğin; index.php dosyasını bile değiştirebilirsiniz. WordPress default olarak bazı parametrelere sahiptir. Yukarıdaki yaptığımız sayfalama işleminde, URL’ye “page” yazmak gibi. Biz bu ifadeyi değiştirmek için de WP_Rewrite sınıfını kullanmak zorundayız. WP_Rewrite sınıfı hakkında detaylı bilgiye buradan ulaşabilirsiniz.

Yukarıdaki kodlarımızda sırasıyla; sayfa temellerini değiştirdik. Mesela artık; sayfalamada “page” yerine “sayfa” olarak URL’ye yazılması gibi. Diğer ifadeleri ben ekstra olarak yazdım. Bu ifadeler de tahmin edebileceğiniz gibi; “author” yerine “yazar”, “search” yerine “arama-sonucu”, “comment” yerine “yorum” yazılması gibi. Bu ifadeleri istediğiniz şekilde değiştirebilirsiniz. Hatta $wp_rewrite nesnesini ekrana yazdırarak ne gibi özelliklere sahip olduğuna bakabilirsiniz.

Son olarak add_action() hook’u ile bu değişiklikleri sistemimize yansıttık. Yukarıdaki işlemimizden sonra URL yapımız aşağıdaki gibi olacaktır.

Görüldüğü gibi artık URL yapımız aşağıdaki gibi oldu.

http://127.0.0.1/wordpress/sayfa/2/

Kategoriler: [WordPress] Etiketler: #wordpress #wp-pagination #wp-sayfalama

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

*
*

This site uses Akismet to reduce spam. Learn how your comment data is processed.