Wordpress İle Özel Bir Kullanıcı Kademeli Abonelik Sistemi Nasıl Yapılır?

Wordpress İle Özel Bir Kullanıcı Kademeli Abonelik Sistemi Nasıl Yapılır?
Wordpress İle Özel Bir Kullanıcı Kademeli Abonelik Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu sistemi başarıyla uygulamak için bir geliştirme ortamına ve aşağıdaki temel bileşenlere ihtiyacınız vardır:

  • WordPress 6.5 veya üzeri bir sürüm.
  • PHP 8.2 veya üzeri (güncel güvenlik standartları için zorunludur).
  • Temanızın functions.php dosyasına erişim veya tercihen özel bir "Site Fonksiyonları" eklentisi.
  • Temel düzeyde PHP ve WordPress kanca (hook) bilgisi.

Çalışmalarınıza başlamadan önce mutlaka bir veritabanı yedeği almalı ve işlemleri yerel (localhost) ortamınızda test etmelisiniz. Üretim ortamında doğrudan değişiklik yapmak veri kaybına yol açabilir.

Adım 1: Özel Kullanıcı Rollerini Tanımlama

İlk adım olarak, WordPress'in varsayılan rollerinin (Abone, Yazar, Editör vb.) dışında kendi abonelik seviyelerimizi oluşturmamız gerekir. Bu işlem, kullanıcıları kategorize etmemizi sağlar.


// Özel abonelik rollerini tanımlayan fonksiyon
function ozel_abonelik_rollerini_ekle() {
    add_role('bronz_uye', 'Bronz Üye', array('read' => true));
    add_role('gumus_uye', 'Gümüş Üye', array('read' => true));
    add_role('altin_uye', 'Altın Üye', array('read' => true));
}
add_action('init', 'ozel_abonelik_rollerini_ekle');

Yukarıdaki kod bloğu, WordPress başlatıldığında add_role fonksiyonunu kullanarak üç farklı seviyede kullanıcı rolü oluşturur. Bu roller, kullanıcıların sisteme giriş yapabilmesi için gerekli olan 'read' (okuma) yetkisine sahiptir.

Adım 2: İçerik Kısıtlama Mantığını Kurma

Rolleri oluşturduktan sonra, içeriği kısıtlamak için bir "kısa kod" (shortcode) yapısı kurmalıyız. Bu yapı, içeriğin etrafına sarılarak sadece yetkili kişilerin görmesini sağlar.


// İçerik kısıtlama kısa kodu
function abonelik_kisitlama_shortcode($atts, $content = null) {
    $a = shortcode_atts(array('rol' => 'altin_uye'), $atts);
    $user = wp_get_current_user();

    if (in_array($a['rol'], (array) $user->roles)) {
        return do_shortcode($content);
    } else {
        return '

Bu içeriği görmek için ' . esc_html($a['rol']) . ' seviyesinde aboneliğiniz olmalıdır.

'; } } add_shortcode('uyelik_kisitla', 'abonelik_kisitlama_shortcode');

Bu fonksiyon, [uyelik_kisitla rol="altin_uye"]İçerik[/uyelik_kisitla] şeklinde kullanıldığında, kullanıcının rolünü kontrol eder. Eğer kullanıcı belirtilen role sahipse içeriği gösterir, aksi takdirde bir uyarı mesajı döner.

Adım 3: Abonelik Seviyeleri Karşılaştırma Tablosu

Aşağıdaki tablo, oluşturduğumuz abonelik seviyelerinin sistemdeki temel yetkilendirme mantığını özetlemektedir:

Rol Erişim Seviyesi Avantaj
Bronz Üye Temel Blog yazılarını okuma
Gümüş Üye Orta Eğitim videoları
Altın Üye Tam Canlı destek ve özel dosyalar

Adım 4: Kullanıcı Kayıt Sürecini Özelleştirme

Kullanıcıların kayıt olurken belirli bir abonelik seviyesini seçebilmeleri için kayıt formuna bir alan eklememiz gerekir. Bu, kullanıcı deneyimi açısından kritiktir.


// Kayıt formuna rol seçimi ekleme
add_action('register_form', 'ozel_kayit_formu_alani');
function ozel_kayit_formu_alani() {
    echo '

Abonelik Seviyesi
Bronz Gümüş

'; } // Kayıt sonrası rolü atama add_action('user_register', 'kayit_sonrasi_rol_ata'); function kayit_sonrasi_rol_ata($user_id) { if (isset($_POST['abonelik_seviyesi'])) { $user = new WP_User($user_id); $user->set_role(sanitize_text_field($_POST['abonelik_seviyesi'])); } }

Burada user_register kancasını kullanarak, kullanıcı veritabanına kaydedildiği anda seçtiği rolün atanmasını sağlıyoruz. sanitize_text_field kullanımı, XSS (Cross-Site Scripting) saldırılarını engellemek için hayati önem taşır.

Adım 5: Güvenlik ve Hata Ayıklama

Kritik Uyarı: Yazılım geliştirme sürecinde, kullanıcı girişlerini asla doğrudan veritabanına kaydetmeyin. Her zaman sanitize_, esc_html veya wp_kses fonksiyonlarını kullanarak veriyi temizleyin. Üretim ortamında hata ayıklama modunu (WP_DEBUG) kapalı tutun.

Kodunuzun düzgün çalışıp çalışmadığını test etmek için şu adımları izleyin:

  1. Farklı yetkilerde test kullanıcıları oluşturun.
  2. Kısıtlı içeriği, ilgili yetkiye sahip olmayan bir kullanıcı ile görüntülemeye çalışın.
  3. Tarayıcı konsolunda (F12) herhangi bir PHP hata uyarısı olup olmadığını kontrol edin.

Adım 6: Dinamik İçerik Filtreleme

Sadece kısa kodlar değil, belirli yazı tiplerini (custom post types) de rol bazlı kısıtlayabilirsiniz.


// Belirli bir yazı tipini kısıtlama
function abonelik_icerik_filtresi($query) {
    if (!is_admin() && $query->is_main_query() && is_post_type_archive('ozel_egitim')) {
        $user = wp_get_current_user();
        if (!in_array('altin_uye', (array) $user->roles)) {
            $query->set('post__in', array(0)); // İçeriği gizle
        }
    }
}
add_action('pre_get_posts', 'abonelik_icerik_filtresi');

Bu örnek, pre_get_posts kancasını kullanarak, veritabanı sorgusu henüz çalışmadan önce yetkisiz kullanıcıların "ozel_egitim" yazı tipini görmesini engeller. Bu, performans açısından en verimli yöntemdir.

Sıkça Sorulan Sorular

Özel rollerim neden görünmüyor?

Roller veritabanına bir kez yazılır. Eğer kod değişikliği yaptıysanız, eklentiyi devre dışı bırakıp tekrar etkinleştirerek init kancasının tetiklenmesini sağlayın.

Kullanıcı rolünü nasıl manuel değiştirebilirim?

WordPress yönetim panelinde "Kullanıcılar" kısmına giderek, ilgili kullanıcının profil düzenleme ekranından "Rol" kısmını güncelleyebilirsiniz.

Ödeme sistemi ile nasıl entegre ederim?

Bu sistem sadece rol yönetimini yapar. Ödeme entegrasyonu için Stripe veya Iyzico API'lerini kullanarak, ödeme başarılı olduğunda wp_update_user fonksiyonu ile kullanıcının rolünü yükseltmeniz gerekir.

Kısıtlı içerik mesajını nasıl özelleştirebilirim?

Kısa kod fonksiyonu içerisindeki dönüş metnini (return) HTML ile istediğiniz gibi düzenleyebilir veya CSS ile stil verebilirsiniz.

Güvenlik açığı oluşturur mu?

Verileri temizlediğiniz (sanitize) ve yetki kontrollerini (current_user_can) doğru yaptığınız sürece bu yöntem oldukça güvenlidir.

Sistem Performansını Optimize Etme ve Önbellekleme Stratejileri

Kademeli abonelik sistemlerinde, özellikle içerik kısıtlama mantığı her sayfa yüklemesinde veritabanı sorgusu tetiklediği için performans darboğazları oluşabilir. WordPress'in varsayılan önbellekleme mekanizmaları, kullanıcı bazlı içerik gösterimlerinde bazen çakışma yaratabilir. Bu sorunu aşmak için "Transient API" kullanarak kullanıcı yetki verilerini geçici olarak belleğe almanız önerilir.

Aşağıdaki kod örneği, kullanıcının abonelik seviyesini her defasında veritabanından sorgulamak yerine, 1 saatlik bir süre boyunca önbellekten çekerek sunucu yükünü azaltır:

function get_user_subscription_level_cached($user_id) {
    $cache_key = 'user_sub_level_' . $user_id;
    $level = get_transient($cache_key);

    if (false === $level) {
        $user = get_userdata($user_id);
        $level = !empty($user->roles) ? $user->roles[0] : 'subscriber';
        set_transient($cache_key, $level, HOUR_IN_SECONDS);
    }

    return $level;
}

Bu yaklaşımı uygularken dikkat etmeniz gereken en önemli nokta, kullanıcı rolü değiştiğinde (örneğin ödeme yapıldığında) mevcut önbelleği temizlemektir. delete_transient('user_sub_level_' . $user_id); fonksiyonunu, rol güncelleme işleminizin hemen ardından tetikleyerek verinin güncel kalmasını sağlayabilirsiniz.

İleri Seviye Senaryo: Abonelik Süresi Dolduğunda Otomatik Rol Düşürme

Kullanıcıların abonelikleri bittiğinde manuel işlem yapmadan otomatik olarak "ücretsiz" veya "pasif" role geçirilmesi, profesyonel bir sistemin olmazsa olmazıdır. Bunun için WordPress'in wp_cron özelliğini kullanarak günlük bir zamanlanmış görev oluşturabilirsiniz.

Aşağıdaki örnek, abonelik bitiş tarihi geçmiş olan kullanıcıları tespit eder ve rollerini günceller:

if (!wp_next_scheduled('check_subscription_expiry_event')) {
    wp_schedule_event(time(), 'daily', 'check_subscription_expiry_event');
}

add_action('check_subscription_expiry_event', 'process_subscription_expiry');

function process_subscription_expiry() {
    $args = array(
        'meta_query' => array(
            array(
                'key' => 'subscription_expiry_date',
                'value' => date('Y-m-d'),
                'compare' => '


Sonuç

WordPress ile özel bir kullanıcı kademeli abonelik sistemi kurmak, sitenizin gelir modelini doğrudan kontrol etmenizi sağlar. Yukarıdaki adımları takip ederek, kullanıcı rollerini yönetebilir, içeriklerinizi güvenli bir şekilde kısıtlayabilir ve esnek bir üyelik yapısı oluşturabilirsiniz. Bir sonraki adım olarak, bu sisteme bir ödeme geçidi entegre ederek abonelikleri otomatize etmeyi düşünebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kullanıcı odaklı rehberler hazırlama konusunda uzmanım. Adım adım anlatımlarla karmaşık süreçleri herkes için anlaşılır kılıyorum.

Yorumlar (0)

Yorum Yaz