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.phpdosyası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_htmlveyawp_ksesfonksiyonları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:
- Farklı yetkilerde test kullanıcıları oluşturun.
- Kısıtlı içeriği, ilgili yetkiye sahip olmayan bir kullanıcı ile görüntülemeye çalışın.
- 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.


Yorumlar (0)
Yorum Yaz