WordPress’te Çerez Ömrünü Uzatma: Beni Hatırla Özelliği
WordPress’te kullanıcı oturumları bazen can sıkıcı olabilir. Bir kullanıcı “Beni Hatırla” kutusunu işaretlediğinde ne bekliyordur? Birkaç gün değil, en azından birkaç hafta boyunca tekrar giriş yapmak zorunda kalmamayı bekler. Ama WordPress’in varsayılan davranışı her zaman bu beklentiyi karşılamaz. Bu yazıda functions.php üzerinden çerez ömrünü nasıl kontrol altına alacağınızı, “Beni Hatırla” mekanizmasını nasıl özelleştireceğinizi ve gerçek dünya senaryolarında nelere dikkat etmeniz gerektiğini ele alacağız.
WordPress Çerez Sistemi Nasıl Çalışır?
WordPress giriş yaptığınızda arka planda iki tür çerez oluşturur: wordpress_logged_in_ ve wordpress_sec_. Bu çerezler, kullanıcının kim olduğunu ve oturumunun geçerli olup olmadığını belirler.
“Beni Hatırla” kutusunu işaretlemediğinizde, oturum çerezleri tarayıcı kapanınca silinir. İşaretlediğinizde ise WordPress varsayılan olarak 14 gün (1.209.600 saniye) süreyle çerez oluşturur. Peki bu 14 günü nasıl değiştirirsiniz?
İşte burada auth_cookie_expiration filtresi devreye girer. WordPress bu filtreyi çerez ömrünü hesaplarken çağırır ve siz bu değeri istediğiniz gibi değiştirebilirsiniz.
auth_cookie_expiration Filtresi
WordPress’in çerez ömrünü belirleyen ana filtre auth_cookie_expiration‘dır. Bu filtre üç parametre alır:
- $expiration: Saniye cinsinden çerez ömrü (varsayılan: 1.209.600 saniye = 14 gün)
- $user_id: Giriş yapan kullanıcının ID’si
- $remember: “Beni Hatırla” kutusunun işaretlenip işaretlenmediğini gösteren boolean değer
En temel kullanım şekliyle başlayalım:
// functions.php
add_filter( 'auth_cookie_expiration', 'oturum_cerez_omrunu_uzat', 10, 3 );
function oturum_cerez_omrunu_uzat( $expiration, $user_id, $remember ) {
// "Beni Hatırla" işaretliyse 30 gün, değilse 1 gün
return $remember ? ( 30 * DAY_IN_SECONDS ) : DAY_IN_SECONDS;
}
WordPress’in zaman sabitleri (DAY_IN_SECONDS, WEEK_IN_SECONDS, MONTH_IN_SECONDS) kullanmak kodu çok daha okunabilir hale getirir. Saniye hesaplamalarıyla boğuşmanıza gerek kalmaz.
Kullanıcı Rolüne Göre Farklı Çerez Ömrü
Gerçek dünya senaryolarında tek tip bir çerez ömrü her zaman mantıklı olmaz. Yöneticilerin çerez ömrünü kısa tutmak güvenlik açısından önemlidir. Öte yandan müşterilerin veya abonelerin sürekli giriş yapması gerekirse bu kullanıcı deneyimini olumsuz etkiler.
// functions.php
add_filter( 'auth_cookie_expiration', 'role_bazli_cerez_omru', 10, 3 );
function role_bazli_cerez_omru( $expiration, $user_id, $remember ) {
$user = get_userdata( $user_id );
if ( ! $user ) {
return $expiration;
}
// Yönetici ve editörler için kısa süre
if ( in_array( 'administrator', $user->roles ) || in_array( 'editor', $user->roles ) ) {
return $remember ? ( 7 * DAY_IN_SECONDS ) : ( 4 * HOUR_IN_SECONDS );
}
// Müşteriler için uzun süre (WooCommerce senaryosu)
if ( in_array( 'customer', $user->roles ) ) {
return $remember ? ( 60 * DAY_IN_SECONDS ) : ( 3 * DAY_IN_SECONDS );
}
// Aboneler için orta süre
if ( in_array( 'subscriber', $user->roles ) ) {
return $remember ? ( 30 * DAY_IN_SECONDS ) : ( 2 * DAY_IN_SECONDS );
}
// Varsayılan
return $expiration;
}
Bu yapıda yöneticiler “Beni Hatırla” işaretlese bile maksimum 7 gün oturum açık kalır. Müşteriler ise 60 güne kadar giriş yapmadan devam edebilir. Güvenlik ile kullanılabilirlik arasındaki dengeyi bu şekilde kurabilirsiniz.
“Beni Hatırla” Kutusunu Varsayılan Olarak İşaretli Getirme
Bazen kullanıcıların bu kutuyu fark etmediğini görürsünüz. Özellikle mobil kullanıcılar hızla giriş yapıp geçer ve sonra neden sürekli oturumunun kapandığını sorgular. Kutuyu varsayılan olarak işaretli hale getirmek bu sorunu çözer:
// functions.php
add_filter( 'login_footer', 'beni_hatirla_varsayilan_isaretli' );
function beni_hatirla_varsayilan_isaretli() {
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
var rememberMe = document.getElementById('rememberme');
if (rememberMe) {
rememberMe.checked = true;
}
});
</script>
<?php
}
Bu yaklaşım tamamen front-end bazlıdır ve kullanıcı hala kutunun işaretini kaldırabilir. Eğer PHP tarafında zorlamak isterseniz farklı bir yol izlemeniz gerekir.
“Beni Hatırla” Kutusunu PHP ile Zorla İşaretleme
Eğer “Beni Hatırla” seçeneğini kullanıcıdan bağımsız olarak her zaman aktif etmek istiyorsanız, giriş işlemini yakalayan bir hook kullanabilirsiniz:
// functions.php
add_action( 'wp_login', 'beni_hatirla_zorla', 10, 2 );
function beni_hatirla_zorla( $user_login, $user ) {
// Oturumu kapatıp "remember" parametresiyle yeniden aç
wp_clear_auth_cookie();
wp_set_auth_cookie( $user->ID, true, is_ssl() );
// Giriş sonrası yönlendirme
$redirect = admin_url();
if ( ! in_array( 'administrator', $user->roles ) && ! in_array( 'editor', $user->roles ) ) {
$redirect = home_url();
}
wp_safe_redirect( $redirect );
exit;
}
Dikkat: Bu yaklaşım her kullanıcı için “Beni Hatırla” davranışını zorla aktif eder. Yöneticiler için bu tercih edilmeyebilir, bu yüzden if bloğu içinde rol kontrolü yapmayı unutmayın.
WooCommerce Senaryosu: Müşteri Oturumlarını Uzatma
WooCommerce projelerinde müşterilerin sepetlerini kaybetmesi veya sürekli yeniden giriş yapmak zorunda kalması dönüşüm oranlarını ciddi ölçüde düşürür. E-ticaret sitelerinde bu konu özellikle kritiktir.
// functions.php
add_filter( 'auth_cookie_expiration', 'woocommerce_musteri_cerez', 10, 3 );
function woocommerce_musteri_cerez( $expiration, $user_id, $remember ) {
// WooCommerce aktif değilse müdahale etme
if ( ! class_exists( 'WooCommerce' ) ) {
return $expiration;
}
$user = get_userdata( $user_id );
if ( ! $user ) {
return $expiration;
}
// Sadece müşteri rolü için
if ( in_array( 'customer', $user->roles ) && $remember ) {
// 90 günlük çerez - sezonluk kampanya dönemlerini kapsasın
return 90 * DAY_IN_SECONDS;
}
return $expiration;
}
// WooCommerce oturum uzunluğunu da ayarla
add_filter( 'woocommerce_session_expiring', 'wc_oturum_uzat' );
add_filter( 'woocommerce_session_expiration', 'wc_oturum_uzat' );
function wc_oturum_uzat() {
return 60 * 60 * 24 * 90; // 90 gün saniye cinsinden
}
WooCommerce’in kendi oturum yönetimi de ayrıca yapılandırılabilir. woocommerce_session_expiring filtresi oturumun “uyarı” süresini, woocommerce_session_expiration ise tam bitiş süresini belirler.
Güvenli Çerez Ayarları ve HTTPS Zorunluluğu
Çerez ömrünü uzatırken güvenlik önlemlerini de ihmal etmemek gerekir. Uzun ömürlü çerezler, MITM saldırılarına karşı daha fazla risk taşır. Bu yüzden HTTPS zorunlu hale getirilmeli ve güvenli çerez bayrakları kullanılmalıdır.
// wp-config.php veya functions.php
// HTTPS üzerinden gelen bağlantılarda güvenli çerez kullan
define( 'COOKIE_DOMAIN', '.siteniz.com' ); // Alt alan adlarını kapsasın
// functions.php içinde
add_filter( 'secure_auth_cookie', 'https_icin_guvenli_cerez' );
function https_icin_guvenli_cerez( $secure ) {
// Site HTTPS kullanıyorsa güvenli çerez zorla
return is_ssl();
}
// Ayrıca HTTPS olmadan gelen istekleri yönlendir
add_action( 'template_redirect', 'https_zorla' );
function https_zorla() {
if ( ! is_ssl() && ! is_admin() ) {
$redirect_url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
wp_redirect( $redirect_url, 301 );
exit;
}
}
Gerçek bir prodüksiyon ortamında HTTPS yönlendirmesini sunucu tarafında (Nginx veya Apache konfigürasyonu) yapmak çok daha verimlidir. PHP katmanında yapmak gereksiz kaynak tüketimine yol açar. Ama test ortamları veya belirli koşullar için PHP çözümü de işe yarar.
Oturum Süresini Kullanıcı Meta’ya Bağlama
Bazı durumlarda her kullanıcıya özel oturum süresi tanımlamak isteyebilirsiniz. Örneğin premium üye olan kullanıcılar için daha uzun çerez süresi sunmak bir özellik olarak pazarlanabilir.
// functions.php
// Kullanıcı meta üzerinden dinamik çerez süresi
add_filter( 'auth_cookie_expiration', 'dinamik_cerez_omru', 10, 3 );
function dinamik_cerez_omru( $expiration, $user_id, $remember ) {
if ( ! $remember ) {
return $expiration;
}
// Kullanıcıya özel süreyi meta'dan oku
$ozel_sure = get_user_meta( $user_id, '_ozel_cerez_suresi', true );
if ( $ozel_sure && is_numeric( $ozel_sure ) ) {
// Meta'da gün cinsinden saklanıyor, saniyeye çevir
return intval( $ozel_sure ) * DAY_IN_SECONDS;
}
// Premium üye mi kontrol et
$premium = get_user_meta( $user_id, '_premium_uye', true );
if ( $premium ) {
return 365 * DAY_IN_SECONDS; // Premium üyelere 1 yıl
}
return 30 * DAY_IN_SECONDS; // Standart 30 gün
}
// Premium üye ataması için yardımcı fonksiyon
function premium_uye_ata( $user_id ) {
update_user_meta( $user_id, '_premium_uye', true );
update_user_meta( $user_id, '_premium_baslangic', current_time( 'timestamp' ) );
}
// Özel süre ataması
function ozel_cerez_suresi_ata( $user_id, $gun ) {
update_user_meta( $user_id, '_ozel_cerez_suresi', absint( $gun ) );
}
Bu yapıda bir kullanıcıyı premium yapmak için WP-CLI veya bir eklenti panelinden premium_uye_ata(123) çağırmanız yeterlidir. Çerez süresi otomatik olarak bir sonraki girişte uygulanır.
“Beni Hatırla” Kutusunu Giriş Formundan Kaldırma
Bazı senaryolarda “Beni Hatırla” kutusunu tamamen kaldırmak ve herkese sabit bir süre uygulamak daha mantıklıdır. Örneğin kiosklarda veya paylaşımlı bilgisayarlarda çalışan uygulamalar için oturumun hiçbir zaman uzun süreli kalmaması gerekir.
// functions.php
// Beni Hatırla kutusunu gizle
add_filter( 'login_form_middle', 'beni_hatirla_kaldir' );
function beni_hatirla_kaldir( $content ) {
return $content;
}
// Daha temiz bir yol: CSS ile gizle ve sabit süre uygula
add_action( 'login_head', 'beni_hatirla_css_gizle' );
function beni_hatirla_css_gizle() {
echo '<style>
.forgetmenot { display: none !important; }
</style>';
}
// Ve herkese sabit süre uygula
add_filter( 'auth_cookie_expiration', 'sabit_cerez_omru', 10, 3 );
function sabit_cerez_omru( $expiration, $user_id, $remember ) {
// Hem "hatırla" hem de "hatırlama" için aynı süre: 8 saat (iş günü)
return 8 * HOUR_IN_SECONDS;
}
CSS ile gizlemek ve PHP ile süreyi kontrol etmek birlikte kullanıldığında, kullanıcı kutuyu görmez ama sistem yine de tanımlı süreyle çalışır.
Hata Ayıklama: Çerez Süresini Doğrulama
Yaptığınız değişikliklerin gerçekten çalışıp çalışmadığını nasıl test edersiniz? Tarayıcı geliştirici araçları ile çerez değerlerini görebilirsiniz, ama daha sistematik bir yaklaşım için WordPress içinde loglama yapabilirsiniz:
// functions.php - Sadece geliştirme ortamında kullanın!
add_action( 'set_auth_cookie', 'cerez_bilgi_logla', 10, 5 );
function cerez_bilgi_logla( $auth_cookie, $expire, $expiration, $user_id, $scheme ) {
if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) {
return;
}
$user = get_userdata( $user_id );
$log_mesaj = sprintf(
'[%s] Kullanıcı: %s (ID: %d) | Bitiş: %s | Şema: %s',
current_time( 'Y-m-d H:i:s' ),
$user->user_login,
$user_id,
date( 'Y-m-d H:i:s', $expire ),
$scheme
);
error_log( $log_mesaj );
}
Bu kod aktifken wp-content/debug.log dosyasına her giriş işleminde çerez bilgisi yazılır. wp-config.php dosyasında WP_DEBUG_LOG sabiti true olmalıdır.
WP-CLI ile de hızlı test yapabilirsiniz:
# Belirli bir kullanıcının oturum bilgilerini kontrol et
wp user get 1 --fields=ID,user_login,user_registered
# Kullanıcı meta verilerini listele
wp user meta list 1 --keys=_premium_uye,_ozel_cerez_suresi
# Test için bir kullanıcıyı premium yap
wp eval "premium_uye_ata(5);"
# Çerez expiration filterinin çalışıp çalışmadığını test et
wp eval "echo apply_filters('auth_cookie_expiration', 1209600, 1, true) / DAY_IN_SECONDS . ' gun';"
Gerçek Dünya Senaryosu: Üyelik Sitesi Yapılandırması
Bir üyelik sitesi düşünün. Ücretsiz üyeler, premium üyeler ve yöneticiler var. Her grup için farklı kurallar uygulamanız gerekiyor. İşte bu senaryonun tam implementasyonu:
// functions.php
add_filter( 'auth_cookie_expiration', 'uyelik_sitesi_cerez_yonetimi', 10, 3 );
function uyelik_sitesi_cerez_yonetimi( $expiration, $user_id, $remember ) {
$user = get_userdata( $user_id );
if ( ! $user || empty( $user->roles ) ) {
return $expiration;
}
$rol = $user->roles[0];
$premium = get_user_meta( $user_id, '_premium_uye', true );
$premium_bitis = get_user_meta( $user_id, '_premium_bitis_tarihi', true );
// Premium üyelik süresi dolmuş mu kontrol et
if ( $premium && $premium_bitis && $premium_bitis < time() ) {
// Süresi dolmuş, meta'yı güncelle
delete_user_meta( $user_id, '_premium_uye' );
$premium = false;
}
switch ( $rol ) {
case 'administrator':
// Yöneticiler için güvenlik öncelikli
return $remember ? ( 3 * DAY_IN_SECONDS ) : ( 8 * HOUR_IN_SECONDS );
case 'editor':
case 'author':
return $remember ? ( 7 * DAY_IN_SECONDS ) : ( 12 * HOUR_IN_SECONDS );
case 'subscriber':
case 'member':
if ( $premium ) {
// Premium üye: uzun süre
return $remember ? ( 90 * DAY_IN_SECONDS ) : ( 7 * DAY_IN_SECONDS );
}
// Ücretsiz üye: orta süre
return $remember ? ( 14 * DAY_IN_SECONDS ) : ( 2 * DAY_IN_SECONDS );
default:
return $remember ? ( 7 * DAY_IN_SECONDS ) : DAY_IN_SECONDS;
}
}
Bu yapıda premium üyeliğin bitiş tarihi de kontrol ediliyor. Böylece abonelik sona erdiğinde otomatik olarak standart çerez süresine düşülüyor.
Dikkat Edilmesi Gereken Noktalar
Çerez süresini uzatırken bazı riskleri göz önünde bulundurmanız gerekir:
- XSS saldırıları: Uzun ömürlü çerezler, sitenizdeki olası bir XSS açığının etkisini uzatır. Input sanitization ve output escaping konularını ihmal etmeyin.
- Paylaşımlı bilgisayarlar: Kullanıcıları uzun süreli oturumlara yönlendirmeden önce, uyarı metni eklemeyi düşünün.
- GDPR uyumu: Çerezler ve saklama süreleri hakkında kullanıcıları bilgilendirmek zorundasınız.
- Session token yönetimi:
auth_cookie_expirationsüreyi değiştirir ama kullanıcı tüm oturumları sonlandırabilir.WP_Session_Tokenssınıfını incelemeye değer. - Çerez boyutu: WordPress auth çerezleri şifrelenmiş veri içerir, boyut sınırı olan ortamlarda sorun yaşayabilirsiniz.
- Cache eklentileri: W3 Total Cache veya WP Rocket kullanıyorsanız giriş yapmış kullanıcılar için cache bypass ayarlarını kontrol edin.
Sonuç
WordPress’te çerez ömrünü yönetmek göründüğünden çok daha esnek bir yapı sunar. auth_cookie_expiration filtresi tek satırlık bir değişimle başlayıp kullanıcı rolü, premium durum, site türü ve güvenlik gereksinimlerine göre karmaşık bir yapıya evrilebilir.
En sık yapılan hata, tüm kullanıcılara aynı çerez süresini uygulamaktır. Yöneticiler için kısa, müşteriler için uzun bir süre hem güvenliği korumanızı hem de kullanıcı deneyimini iyileştirmenizi sağlar. E-ticaret sitelerinde bu ayrımı yapmak, sepet terk oranlarını ve tekrar ziyaret sayılarını doğrudan etkiler.
Kodları functions.php‘ye eklemeden önce bir çocuk tema kullandığınızdan emin olun. WordPress güncellemelerinde ana temanın functions.php dosyası sıfırlanır ve tüm özelleştirmelerinizi kaybedebilirsiniz. Çocuk tema veya özel bir eklenti bu riski ortadan kaldırır.
