Ön Hazırlık: Geliştirme Ortamı ve Gereksinimler
Bu projeye başlamadan önce bir yerel geliştirme ortamına (LocalWP, XAMPP veya Docker gibi) sahip olmalısınız. Ayrıca, kodlarınızı temanızın functions.php dosyasında veya tercihen bir "Site Özel Eklentisi" içerisinde tutmanız, temanızı güncellerken kodlarınızın kaybolmaması için kritik öneme sahiptir.
- PHP Sürümü: 8.2 veya üzeri.
- WordPress Sürümü: 6.5 veya üzeri.
- Editör: VS Code gibi hata ayıklama desteği olan bir IDE.
- Bilgi Seviyesi: Temel PHP sözdizimi ve WordPress "Action/Filter" yapısı bilgisi.
Adım 1: Özel Bir Kullanıcı Rolü Oluşturma
İçerik kısıtlaması yapmadan önce, kısıtlamayı uygulayacağımız özel bir rol tanımlamalıyız. Örneğin, "Premium Abone" adında bir rol oluşturalım. Bu işlem, WordPress veritabanına yeni bir yetki kümesi ekler.
function ozel_rol_ekle_fonksiyonu() {
add_role(
'premium_abone',
'Premium Abone',
array(
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
)
);
}
add_action('init', 'ozel_rol_ekle_fonksiyonu');
Bu kod, WordPress başlatıldığında add_role fonksiyonunu çalıştırarak veritabanına yeni rolü kaydeder. init kancası, WordPress'in temel işlevlerinin yüklendiği en uygun noktadır.
Adım 2: İçerik Kısıtlama Mantığını Oluşturma
Şimdi, içeriği filtrelemek için the_content filtresini kullanacağız. Bu filtre, yazı veya sayfa içeriği ekrana basılmadan hemen önce devreye girer. Eğer kullanıcı "premium_abone" rolüne sahip değilse, içeriği gizleyip bir mesaj göstereceğiz.
function icerik_kisitlama_filtresi($content) {
if (is_singular() && in_category('premium-icerik')) {
if (!current_user_can('premium_abone')) {
return 'Bu içeriği görmek için Premium Abone olmalısınız.
';
}
}
return $content;
}
add_filter('the_content', 'icerik_kisitlama_filtresi');
Burada is_singular() ile sadece tekil sayfalarda işlem yapmasını sağlıyoruz. current_user_can() fonksiyonu ise kullanıcının yetkisini kontrol etmek için kullanılan en güvenli WordPress yöntemidir.
Adım 3: Kısa Kod (Shortcode) ile Esnek Kısıtlama
Bazen tüm içeriği değil, sadece bir paragrafı veya bir bloğu kısıtlamak isteyebilirsiniz. Bunun için WordPress kısa kodlarını kullanmak en profesyonel yaklaşımdır.
function premium_kisa_kod($atts, $content = null) {
if (current_user_can('premium_abone')) {
return '' . do_shortcode($content) . '';
} else {
return 'Bu bölümü görmek için giriş yapın.
';
}
}
add_shortcode('premium_icerik', 'premium_kisa_kod');
Bu kodu sitenize ekledikten sonra yazı editöründe [premium_icerik] Gizli İçerik [/premium_icerik] şeklinde kullanarak istediğiniz metni kolayca kilitleyebilirsiniz.
Adım 4: Güvenlik ve Performans Karşılaştırması
İçerik kısıtlama sistemleri kurarken farklı yöntemlerin avantaj ve dezavantajlarını bilmek gerekir. Aşağıdaki tablo, geliştirme stratejinizi belirlemenize yardımcı olacaktır.
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Filtre (the_content) | Otomatik ve hızlıdır. | Tüm içeriği etkiler. |
| Kısa Kod | Esnektir, kısmi kısıtlama sağlar. | Editörde manuel işlem gerektirir. |
| Sayfa Şablonu | Tam kontrol sağlar. | Bakımı zordur. |
Adım 5: Gelişmiş Kullanıcı Deneyimi ve Yönlendirme
Kullanıcı kısıtlı bir içeriğe erişmeye çalıştığında, ona sadece bir mesaj göstermek yerine, üyelik sayfasına yönlendirmek dönüşüm oranlarını artırır. Aşağıdaki örnek, kısıtlı sayfaya giren yetkisiz kullanıcıları otomatik olarak "Üyelik" sayfasına yönlendirir.
function kısıtlı_sayfa_yonlendirme() {
if (is_singular() && in_category('premium-icerik') && !current_user_can('premium_abone')) {
wp_redirect(home_url('/uyelik-sayfasi/'));
exit;
}
}
add_action('template_redirect', 'kısıtlı_sayfa_yonlendirme');
template_redirect kancası, WordPress sayfa şablonunu yüklemeden hemen önce çalışır. Bu, yönlendirme işlemleri için en doğru yerdir. exit komutu, sunucunun yönlendirme sonrası kodları çalıştırmasını durdurur.
Kritik Güvenlik Uyarısı: PHP kodlarınızı her zaman güvenli bir şekilde yazın. current_user_can() fonksiyonunu kullanırken kullanıcı yetkilerini asla doğrudan veritabanından manipüle etmeyin. Ayrıca, üretim ortamında (production) hata raporlamayı (WP_DEBUG) her zaman kapalı tutun.
Adım 6: Hata Ayıklama ve Test Etme
Sistemin çalıştığından emin olmak için farklı tarayıcı oturumları kullanın. Bir tarayıcıda yönetici, diğerinde "Premium Abone" ve gizli sekmede ise giriş yapmamış bir kullanıcı olarak testi gerçekleştirin.
// Test için basit bir hata ayıklama logu
function test_rol_kontrolu() {
$user = wp_get_current_user();
error_log('Mevcut Kullanıcı Rolü: ' . implode(', ', $user->roles));
}
add_action('wp_footer', 'test_rol_kontrolu');
Bu kod, sitenizin en altına mevcut kullanıcının rolünü yazdırır. Geliştirme aşamasında hangi rolün aktif olduğunu anlamanıza yardımcı olur. Canlıya almadan önce bu kodu kaldırmayı unutmayın.
Sıkça Sorulan Sorular
Kısıtlı içerik Google tarafından indekslenir mi?
Evet, eğer içeriği sadece PHP ile gizlerseniz, arama motorları içeriği görebilir. SEO için "kısmi içerik" (teaser) göstermek ve geri kalanını kısıtlamak daha sağlıklı bir yaklaşımdır.
Birden fazla rol için kısıtlama yapabilir miyim?
Tabii ki. current_user_can() fonksiyonu yerine $user->roles dizisini kontrol eden bir in_array() yapısı kurarak birden fazla rolü yetkilendirebilirsiniz.
Bu yöntem veritabanını yorar mı?
Hayır, WordPress'in yerleşik kullanıcı ve yetki sistemi oldukça optimize edilmiştir. Bu işlemler ek sorgu oluşturmaz, sadece mevcut kullanıcı nesnesini kontrol eder.
Eklenti kullanmadan yapmak neden daha iyidir?
Eklentiler sitenize ek yük getirir ve güvenlik açığı riskini artırır. Kendi kodunuzu yazmak, sitenizin hızını korur ve tam kontrol sağlar.
Kullanıcı giriş yapmadıysa ne olur?
Yukarıdaki kodlarda !current_user_can('premium_abone') kontrolü, giriş yapmamış kullanıcıları otomatik olarak "yetkisiz" saydığı için sistem güvenli çalışır.
Ölçeklenebilir İçerik Kısıtlama İçin İleri İpuçları ve Optimizasyon
Sisteminizi geliştirdikten sonra, özellikle yüksek trafikli sitelerde performans kaybı yaşamamak için bazı ileri düzey teknikleri uygulamanız gerekir. WordPress'in transient API'sini kullanarak, her sayfa yüklenmesinde veritabanına sorgu atmak yerine kullanıcı yetki durumunu önbelleğe alabilirsiniz.
Transient API ile Yetki Önbellekleme
Aşağıdaki kod, kullanıcının yetki kontrolünü 12 saatlik bir süreliğine önbelleğe alarak veritabanı yükünü minimize eder:
function is_user_premium_cached($user_id) {
$transient_key = 'user_premium_status_' . $user_id;
$status = get_transient($transient_key);
if (false === $status) {
$user = get_userdata($user_id);
$status = ($user && in_array('premium_abone', $user->roles)) ? 'yes' : 'no';
set_transient($transient_key, $status, 12 * HOUR_IN_SECONDS);
}
return ($status === 'yes');
}
Deployment ve Yayına Alma Süreçleri
Geliştirdiğiniz kısıtlama sistemini canlı ortama taşırken, kodunuzun sürüm kontrolü (Git) ile yönetilmesi ve test ortamında doğrulanması kritik öneme sahiptir. Canlı sitenizde kod değişiklikleri yaparken şu adımları izleyin:
- Staging Ortamı: Değişiklikleri önce sitenizin bir kopyasında (staging) test edin.
- Kod İncelemesi:
functions.phpdosyanızı şişirmek yerine, kısıtlama mantığını ayrı bir eklenti dosyasına taşıyarak modüler bir yapı kurun. - Hata Logları:
wp-config.phpdosyanızdaWP_DEBUGmodunu aktif ederek, kısıtlama sırasında oluşan PHP uyarılarını takip edin.
Hata Ayıklama (Debugging) Stratejileri
Sistemin düzgün çalışıp çalışmadığını anlamak için, belirli bir kullanıcı rolüne sahip olup olmadığınızı test eden bir "debug" fonksiyonu kullanabilirsiniz. Bu fonksiyon, giriş yapmış yetkili kullanıcılara sayfa üzerinde gizli bir bildirim gösterir:
add_action('wp_footer', 'debug_user_role_status');
function debug_user_role_status() {
if (current_user_can('administrator')) {
$user = wp_get_current_user();
echo '';
echo 'Aktif Rol: ' . implode(', ', $user->roles);
echo '';
}
}
Bu yöntem, özellikle önbellekleme eklentileri (WP Rocket, W3 Total Cache gibi) kullandığınızda, kısıtlamanın doğru tetiklenip tetiklenmediğini görmenizi sağlar. Eğer içerik kısıtlaması önbellek nedeniyle hatalı çalışıyorsa, ilgili sayfaları DONOTCACHEPAGE sabiti ile önbellek dışı bırakmayı unutmayın.
Sonuç
WordPress ile özel kullanıcı rolüne göre içerik kısıtlama sistemi kurmak, sitenizin profesyonelliğini artırır ve içeriklerinizi koruma altına alır. Bu rehberde öğrendiğiniz kancalar ve mantıksal kontroller, daha karmaşık üyelik sistemleri geliştirmeniz için temel oluşturacaktır. Bir sonraki adım olarak, bu sisteme "Ödeme Entegrasyonu" ekleyerek, kullanıcıların otomatik olarak bu rollere atanmasını sağlayacak bir yapı üzerine çalışabilirsiniz.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Kodları canlı sitenizde uygulamadan önce mutlaka veritabanı yedeği alınız. Hatalı kod uygulamaları sitenizin erişilebilirliğini etkileyebilir.


Yorumlar (0)
Yorum Yaz