Ön Hazırlık ve Gereksinimler
Bu uygulamaya başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. WordPress 6.x ve üzeri sürümler, PHP 8.2+ ile tam uyumlu çalışmaktadır. Güvenli bir geliştirme süreci için şu araçlara ihtiyacınız olacak:
- Alt Tema (Child Theme): Kodlarınızı ana tema dosyalarına yazmak yerine, her zaman bir alt tema kullanın. Böylece tema güncellemelerinde yazdığınız kodlar silinmez.
- Kod Editörü: VS Code veya benzeri bir editör ile
functions.phpdosyanıza erişim. - FTP/SFTP Erişimi: Hatalı bir kod bloğunda sitenizin kilitlenmesi ihtimaline karşı sunucu dosyalarına doğrudan erişim.
- Yedekleme: Çalışmaya başlamadan önce mutlaka veritabanı ve dosya yedeği alın.
WordPress Kısıtlama Mantığını Anlamak
WordPress, içerikleri görüntülemeden önce template_redirect kancasını tetikler. Bu kanca, sayfa yüklenmeden hemen önce devreye girdiği için, kullanıcıyı yönlendirmek veya erişimi engellemek için en ideal noktadır. Kısıtlama sistemini kurarken, WordPress'in yerleşik is_user_logged_in() fonksiyonunu temel alacağız.
Aşağıdaki kod örneği, belirli bir kategorideki içerikleri giriş yapmamış kullanıcılara kapatır. Bu kodu alt temanızın functions.php dosyasının en sonuna ekleyebilirsiniz.
function ozel_kullanici_kisitlama_sistemi() {
// Sadece yazı sayfalarında ve belirli bir kategoride çalıştır
if ( is_single() && in_category('ozel-icerik') && !is_user_logged_in() ) {
// Kullanıcıyı giriş sayfasına yönlendir
wp_redirect( wp_login_url( get_permalink() ) );
exit;
}
}
add_action( 'template_redirect', 'ozel_kullanici_kisitlama_sistemi' );
Bu kod bloğunda is_single() ile sadece tekil yazıların kontrol edildiğinden emin olduk. in_category('ozel-icerik') kısmı ise kısıtlamanın uygulanacağı kategori slug'ını belirler. wp_redirect fonksiyonu sayesinde kullanıcı, giriş yaptıktan sonra otomatik olarak kaldığı sayfaya geri dönecektir.
İçerik İçinde Kısayol (Shortcode) Kullanımı
Bazen tüm sayfayı değil, sadece sayfa içindeki belirli bir bölümü kısıtlamak isteyebilirsiniz. Bunun için WordPress shortcode yapısını kullanmak en esnek çözümdür. Aşağıdaki kod, içerik içine eklenen [uye_ozel] etiketleri arasındaki metni korur.
function uye_ozel_icerik_kisa_kod( $atts, $content = null ) {
if ( is_user_logged_in() ) {
return '' . do_shortcode($content) . '';
} else {
return 'Bu içeriği görmek için lütfen giriş yapın.';
}
}
add_shortcode( 'uye_ozel', 'uye_ozel_icerik_kisa_kod' );
Bu yöntem, içeriğin bir kısmını halka açık bırakıp, detaylı teknik bilgileri veya özel dosyaları sadece kayıtlı üyelere göstermek için mükemmeldir. Kullanıcı giriş yapmadıysa, ona bir giriş linki sunarak dönüşüm oranınızı artırabilirsiniz.
Kullanıcı Rolüne Göre Kısıtlama
Sadece kayıtlı kullanıcılar değil, belirli rollere (örneğin "abone" veya "editör") sahip kullanıcılara özel kısıtlamalar yapmanız gerekebilir. WordPress'in current_user_can() fonksiyonu ile yetki kontrolü yapmak oldukça basittir.
function rol_bazli_kisitlama() {
if ( is_page('premium-sayfa') && !current_user_can('subscriber') ) {
wp_die( 'Bu sayfayı görüntülemek için Abone yetkisine sahip olmalısınız.' );
}
}
add_action( 'template_redirect', 'rol_bazli_kisitlama' );
Bu örnekte, wp_die() fonksiyonu kullanılarak kullanıcının sayfayı görmesi tamamen engellenmiş ve bir hata mesajı ile karşılanması sağlanmıştır. Bu yöntem, özellikle üyelik sistemi olan sitelerde "Premium" içerikler için kullanılır.
Kısıtlama Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| template_redirect | Tüm sayfayı korur, SEO dostudur. | Hatalı kodda tüm siteye erişim kesilebilir. |
| Shortcode | İçerik içinde esneklik sağlar. | Sayfanın geri kalanı görünür kalır. |
| Rol Kontrolü | Hiyerarşik erişim yönetimi sağlar. | Kodun her sayfada tek tek tanımlanması gerekir. |
Güvenlik ve Hata Ayıklama İpuçları
Kullanıcı kısıtlama sistemleri geliştirirken en büyük hata, veritabanı sorgularının veya API uç noktalarının (REST API) kısıtlanmamasıdır. WordPress REST API, varsayılan olarak içeriği dışarıya açabilir. Bunu engellemek için aşağıdaki filtreyi kullanmalısınız:
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_forbidden', 'Bu içeriğe erişim izniniz yok.', array( 'status' => 401 ) );
}
return $result;
});
Kritik Güvenlik Uyarısı: Yazdığınız tüm kısıtlama kodları sunucu tarafında (server-side) çalışmalıdır. Sadece CSS iledisplay: nonekullanarak içerik gizlemek, profesyonel bir kısıtlama yöntemi değildir; kullanıcılar "Ögeyi Denetle" ile içeriğe kolayca ulaşabilirler. Ayrıca, veritabanı sorgularında her zaman$wpdb->prepare()kullanarak SQL injection saldırılarına karşı önlem alın.
Sıkça Sorulan Sorular
Kısıtlama kodum çalışmıyor, ne yapmalıyım?
Öncelikle temanızın functions.php dosyasında bir sözdizimi hatası olup olmadığını kontrol edin. Ardından, WordPress'in önbellek (cache) eklentilerini temizleyin; bazen eski sayfalar önbellekten yüklendiği için kısıtlama devreye girmiş gibi görünmeyebilir.
Arama motorları (Google) kısıtlı içeriği nasıl görür?
Google botları genellikle giriş yapmamış kullanıcı gibi davranır. Eğer kısıtlı içeriklerinizin Google tarafından indekslenmesini istemiyorsanız, is_user_logged_in() kontrolü yeterlidir. Ancak içeriğin indekslenmesini istiyorsanız, Google botlarına özel bir izin tanımlamanız gerekir.
Sadece belirli bir yazı tipini değil, tüm yazıları nasıl kısıtlarım?
is_single() koşulunu kullanarak tüm yazıları kısıtlayabilirsiniz. Eğer tüm siteyi (anasayfa dahil) kısıtlamak isterseniz, is_user_logged_in() kontrolünü !is_page('login') gibi bir istisna ile tüm sayfalara uygulayabilirsiniz.
Kullanıcıyı giriş sayfasına yönlendirmek yerine özel bir hata sayfası gösterebilir miyim?
Evet, wp_redirect() yerine wp_safe_redirect(home_url('/erisim-engellendi/')) kullanarak kullanıcıyı kendi oluşturduğunuz özel bir sayfaya yönlendirebilirsiniz.
Bu kodlar sitemi yavaşlatır mı?
Hayır, WordPress kancaları (hooks) çok düşük bir maliyetle çalışır. Ancak karmaşık veritabanı sorguları içeren bir kısıtlama mantığı yazarsanız, sayfa yüklenme süresi etkilenebilir.
İleri Seviye: Dinamik Kısıtlama Kuralları ve Veritabanı Entegrasyonu
Basit rol bazlı kısıtlamaların ötesine geçmek istediğinizde, kısıtlama kurallarını veritabanında saklamak ve her kullanıcı için özelleştirilmiş erişim süreleri tanımlamak gerekebilir. Bu yaklaşım, özellikle abonelik tabanlı içerik platformları için idealdir.
Kullanıcı Bazlı Erişim Süresi Tanımlama
Kullanıcının bir içeriğe erişim süresini user_meta tablosunda tutarak, bu sürenin dolup dolmadığını kontrol eden bir fonksiyon yazabiliriz. Aşağıdaki kod bloğu, kullanıcının erişim izninin geçerlilik tarihini kontrol eder:
function check_user_subscription_expiry() {
if (is_single()) {
$user_id = get_current_user_id();
$expiry_date = get_user_meta($user_id, 'subscription_expiry', true);
if ($expiry_date && strtotime($expiry_date) < time()) {
wp_die('Aboneliğinizin süresi dolmuştur. Lütfen profil sayfanızdan yenileyin.');
}
}
}
add_action('template_redirect', 'check_user_subscription_expiry');
Kısıtlama Sistemlerinde Performans Optimizasyonu
Kısıtlama mantığınız büyüdükçe, her sayfa yüklenmesinde veritabanına giden sorgu sayısı artabilir. Bu durumu engellemek için WordPress'in Transient API özelliğini kullanmanız önerilir. Transient API, sorgu sonuçlarını geçici bir süreliğine önbelleğe alarak veritabanı yükünü minimize eder.
Transient Kullanımı ile Sorgu Yükünü Azaltma
Aşağıdaki örnekte, kullanıcının yetki durumu 1 saat boyunca önbelleğe alınır:
function get_cached_user_access($user_id) {
$transient_key = 'user_access_level_' . $user_id;
$access_level = get_transient($transient_key);
if (false === $access_level) {
// Veritabanı sorgusu burada yapılır
$access_level = get_user_meta($user_id, 'access_level', true);
set_transient($transient_key, $access_level, HOUR_IN_SECONDS);
}
return $access_level;
}
Performans İçin İpuçları
- Sorguları Optimize Edin:
get_user_metayerine doğrudanwp_get_current_user()nesnesini kullanarak mevcut kullanıcı verilerine erişin. - Koşullu Yükleme: Kısıtlama fonksiyonlarını sadece gerekli sayfalarda (
is_page,is_single) çalıştırın. Tüm sitenizde global olarak çalıştırmaktan kaçının. - Object Cache: Eğer sunucunuz destekliyorsa Redis veya Memcached kullanarak WordPress nesne önbelleklemesini aktif edin.
Kısıtlama Sistemini Test Etme ve Deployment
Yazdığınız kısıtlama kodlarını canlıya almadan önce mutlaka bir staging (test) ortamında denemelisiniz. Özellikle wp_die() veya wp_redirect() gibi fonksiyonlar, yanlış yapılandırıldığında sitenizin bir "redirect loop" (yönlendirme döngüsü) içine girmesine neden olabilir.
| Test Senaryosu | Beklenen Sonuç |
|---|---|
| Giriş yapmamış kullanıcı | Kısıtlı sayfaya erişememeli ve giriş sayfasına yönlendirilmeli. |
| Yetkili kullanıcı | İçeriği sorunsuz görüntüleyebilmeli. |
| Süresi dolmuş kullanıcı | Hata mesajı almalı veya ödeme sayfasına yönlendirilmeli. |
Dikkat: Kodlarınızı canlı ortama alırken WP_DEBUG modunu kapatmayı unutmayın. Hata ayıklama modunun açık kalması, kısıtlama mantığınızın bir parçası olan veritabanı yollarını veya dosya dizinlerini ziyaretçilere ifşa edebilir.
Sonuç
WordPress ile özel bir kullanıcı kısıtlama sistemi oluşturmak, sitenizin içerik yönetimini profesyonel bir seviyeye taşımanızı sağlar. Bu rehberde öğrendiğiniz template_redirect, shortcode ve rol bazlı yetkilendirme yöntemleri, çoğu senaryo için yeterli olacaktır. Bir sonraki adım olarak, bu kısıtlamaları bir veritabanı tablosu ile dinamik hale getiren veya kullanıcıların belirli bir süre sonra erişimini otomatik kesen bir eklenti yapısını inceleyebilirsiniz. Güvenli kodlama pratiklerini her zaman ön planda tutarak, kullanıcı deneyimini iyileştirmeye devam edin.


Yorumlar (0)
Yorum Yaz