WordPress’te Kullanıcı Kayıt Olduktan Sonra Otomatik Giriş Yapma
WordPress ile bir e-ticaret sitesi ya da üyelik platformu kurduğunuzda, kullanıcı deneyimini iyileştirmenin en kolay yollarından biri kayıt işleminin ardından otomatik giriş sağlamaktır. Kullanıcı formunu dolduruyor, “Kayıt Ol” butonuna basıyor ve sonra tekrar giriş ekranıyla karşılaşıyor. Bu gereksiz bir adım ve kullanıcıların bir kısmını kaybetmenizin nedeni olabilir. Bu yazıda WordPress ve WooCommerce ortamlarında bu sorunu functions.php üzerinden nasıl çözeceğinizi adım adım ele alacağız.
Neden Otomatik Giriş Önemli?
Kullanıcı davranışları üzerine yapılan araştırmalar, kayıt sürecindeki her ekstra adımın dönüşüm oranını düşürdüğünü gösteriyor. WooCommerce mağazanızda bir müşteri hesap açıyor, sonra tekrar giriş yapması gerekiyor ve bu arada belki sepetine eklediği ürünleri unutuyor ya da sayfayı kapatıyor. Otomatik giriş bu sürtünmeyi ortadan kaldırıyor.
Teknik açıdan bakıldığında da bu özellik oldukça temiz bir çözüm. WordPress zaten kullanıcı oluşturulduktan hemen sonra tetiklenen hook’lar sunuyor. Bu hook’lara takılarak oturum açma işlemini programatik olarak gerçekleştirebilirsiniz.
Temel Yapı: WordPress Native Kayıt
Önce standart WordPress kayıt formunu kullananlar için basit bir çözümle başlayalım. WordPress’te kullanıcı kaydedildiğinde user_register hook’u tetiklenir. Bu hook’a bağlanarak yeni kullanıcıyı otomatik olarak sisteme dahil edebilirsiniz.
// functions.php
function otomatik_giris_kayit_sonrasi( $user_id ) {
// Eğer kullanıcı zaten giriş yapmışsa tekrar giriş ettirme
if ( is_user_logged_in() ) {
return;
}
// Kullanıcı verisini çek
$user = get_user_by( 'id', $user_id );
if ( $user ) {
// Oturum başlat
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id );
do_action( 'wp_login', $user->user_login, $user );
}
}
add_action( 'user_register', 'otomatik_giris_kayit_sonrasi' );
Bu kod son derece sade ama birkaç önemli noktayı kapsıyor. wp_set_current_user mevcut oturumu yeni kullanıcıyla güncelliyor, wp_set_auth_cookie tarayıcıya oturum çerezi yazıyor ve do_action( 'wp_login' ) ile diğer eklentilerin giriş olayından haberdar olmasını sağlıyoruz. Üçüncü satır özellikle önemli; bazı güvenlik eklentileri ve analitik araçlar bu aksiyona bağlı çalışır.
WooCommerce Kayıt Formu İçin Özel Çözüm
WooCommerce kendi kayıt akışını kullanır ve bazen user_register hook’u yeterli olmayabilir. WooCommerce müşteri kaydı için woocommerce_created_customer hook’u daha güvenilir bir seçenek.
// functions.php - WooCommerce için özel otomatik giriş
function wc_otomatik_giris_yeni_musteri( $customer_id, $new_customer_data, $password_generated ) {
// Şifre otomatik oluşturulduysa ve admin panelinden kayıt değilse devam et
if ( is_admin() ) {
return;
}
if ( ! is_user_logged_in() ) {
$user = get_user_by( 'id', $customer_id );
if ( $user ) {
wp_set_current_user( $customer_id, $user->user_login );
wp_set_auth_cookie( $customer_id, true ); // true = beni hatırla
do_action( 'wp_login', $user->user_login, $user );
}
}
}
add_action( 'woocommerce_created_customer', 'wc_otomatik_giris_yeni_musteri', 10, 3 );
Burada is_admin() kontrolü kritik. Admin panelinden toplu kullanıcı oluşturduğunuzda ya da bir eklenti arka planda kayıt işlemi yaptığında bu fonksiyonun tetiklenmesini istemezsiniz. Ayrıca wp_set_auth_cookie fonksiyonuna true parametresi geçerek “beni hatırla” özelliğini aktif hale getiriyoruz; bu sayede kullanıcı tarayıcıyı kapattığında oturumu düşmüyor.
Yönlendirme ile Birlikte Kullanmak
Otomatik giriş tek başına yeterli olmayabilir. Kullanıcıyı giriş yaptıktan sonra doğru sayfaya yönlendirmeniz gerekiyor. WooCommerce’de genellikle “Hesabım” sayfasına ya da önceki sayfaya yönlendirmek mantıklı.
// functions.php - Otomatik giriş ve yönlendirme
function otomatik_giris_ve_yonlendir( $user_id ) {
if ( is_admin() || is_user_logged_in() ) {
return;
}
$user = get_user_by( 'id', $user_id );
if ( ! $user ) {
return;
}
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id );
do_action( 'wp_login', $user->user_login, $user );
// Yönlendirme hedefini belirle
$redirect_url = apply_filters( 'otomatik_giris_yonlendirme', '' );
if ( empty( $redirect_url ) ) {
// WooCommerce varsa hesabım sayfasına, yoksa ana sayfaya
if ( function_exists( 'wc_get_page_permalink' ) ) {
$redirect_url = wc_get_page_permalink( 'myaccount' );
} else {
$redirect_url = home_url( '/' );
}
}
wp_safe_redirect( $redirect_url );
exit;
}
add_action( 'user_register', 'otomatik_giris_ve_yonlendir', 10, 1 );
wp_safe_redirect kullanmak önemli. wp_redirect ile herhangi bir URL’e yönlendirme yapabilirsiniz ama bu bir güvenlik açığı oluşturabilir. wp_safe_redirect sadece aynı domain içindeki adreslere ya da izin listenizdeki harici adreslere yönlendirme yapar. apply_filters ile de diğer eklentilerin yönlendirme adresini değiştirmesine olanak tanıyorsunuz; bu mimarik açıdan temiz bir yaklaşım.
Checkout Sonrası Otomatik Giriş
WooCommerce’de kullanıcılar bazen sipariş tamamlarken hesap oluşturuyor. Bu durumda woocommerce_checkout_order_processed hook’u devreye giriyor. Checkout akışında kullanıcı oluşturulup oluşturulmadığını kontrol etmeniz gerekiyor.
// functions.php - Checkout sırasında yeni hesap açıldığında otomatik giriş
function checkout_sonrasi_otomatik_giris( $order_id, $posted_data, $order ) {
// Kullanıcı zaten giriş yapmışsa atla
if ( is_user_logged_in() ) {
return;
}
// Sipariş sahibini al
$customer_id = $order->get_customer_id();
if ( ! $customer_id ) {
return;
}
$user = get_user_by( 'id', $customer_id );
if ( $user ) {
wp_set_current_user( $customer_id, $user->user_login );
wp_set_auth_cookie( $customer_id );
do_action( 'wp_login', $user->user_login, $user );
// Log tutalım - gerçek ortamda bu tür işlemleri izlemek iyi pratik
error_log( sprintf(
'Otomatik giriş: Kullanıcı %d sipariş %d sonrası otomatik giriş yaptı.',
$customer_id,
$order_id
) );
}
}
add_action( 'woocommerce_checkout_order_processed', 'checkout_sonrasi_otomatik_giris', 10, 3 );
Burada error_log ile basit bir kayıt tutuyoruz. Prodüksiyon ortamında bu tür işlemleri izlemek her zaman faydalı. Özellikle müşteri şikayet ettiğinde “sistem gerçekten giriş yaptırdı mı?” sorusunu yanıtlayabilmek için log kayıtları hayat kurtarır.
Güvenlik Kontrolleri ve Nonce Doğrulama
Otomatik giriş özelliği eklerken güvenliği göz ardı etmemek gerekiyor. Özellikle AJAX ile çalışan kayıt formlarında nonce doğrulaması şart.
// functions.php - Nonce doğrulamalı güvenli otomatik giriş
function guvenli_otomatik_giris( $user_id ) {
// Admin panelinden gelen istekleri atla
if ( is_admin() ) {
return;
}
// REST API isteği mi kontrol et
if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) {
// REST API üzerinden kayıt için farklı güvenlik katmanı gerekebilir
// Şimdilik atlıyoruz
return;
}
// Bot koruması: Kayıt çok hızlı mı gerçekleşti?
$registration_time = get_user_meta( $user_id, 'registration_timestamp', true );
if ( $registration_time && ( time() - $registration_time ) < 3 ) {
// 3 saniyeden hızlı kayıt şüpheli, logla
error_log( 'Şüpheli hızlı kayıt: Kullanıcı ' . $user_id );
return;
}
if ( ! is_user_logged_in() ) {
$user = get_user_by( 'id', $user_id );
if ( $user && ! in_array( 'administrator', (array) $user->roles ) ) {
// Administratörleri otomatik giriş sistemiyle dahil etme
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id );
do_action( 'wp_login', $user->user_login, $user );
}
}
}
add_action( 'user_register', 'guvenli_otomatik_giris', 10, 1 );
// Kayıt zamanını kaydet (form gönderilmeden önce)
function kayit_zamani_kaydet() {
if ( isset( $_POST['user_login'] ) || isset( $_POST['email'] ) ) {
// Geçici olarak session'a yaz
if ( ! session_id() ) {
session_start();
}
$_SESSION['reg_start_time'] = time();
}
}
add_action( 'register_form', 'kayit_zamani_kaydet' );
Administrator rolündeki kullanıcıları bu sistemin dışında tutmak önemli bir güvenlik önlemi. Birisi admin hesabı oluşturmayı başarırsa (ki bu başlı başına bir güvenlik açığı anlamına gelir) en azından otomatik giriş sisteminiz bu hesabı hemen aktif etmemiş olur.
Çok Adımlı Kayıt Formları ile Entegrasyon
Bazı üyelik siteleri çok adımlı kayıt formları kullanır. Bu durumlarda son adım tamamlandığında otomatik giriş yapılmalı. Gravity Forms veya WPForms gibi eklentilerle entegrasyon örneği:
// functions.php - Gravity Forms entegrasyonu ile otomatik giriş
function gravity_forms_kayit_sonrasi_giris( $entry, $form ) {
// Sadece belirli bir form için çalış (form ID'nizi girin)
$hedef_form_id = 5; // Kayıt formunuzun ID'si
if ( (int) $form['id'] !== $hedef_form_id ) {
return;
}
// Gravity Forms User Registration eklentisi kullanıcı oluşturduysa
$user_id = gform_get_meta( $entry['id'], 'created_by_user_registration' );
if ( ! $user_id ) {
// Alternatif: E-posta ile kullanıcıyı bul
$email_field_id = 3; // E-posta alanınızın ID'si
$email = rgar( $entry, $email_field_id );
if ( $email ) {
$user = get_user_by( 'email', $email );
$user_id = $user ? $user->ID : null;
}
}
if ( $user_id && ! is_user_logged_in() ) {
$user = get_user_by( 'id', $user_id );
if ( $user ) {
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id );
do_action( 'wp_login', $user->user_login, $user );
// Giriş sonrası sayfaya meta bilgi ekle (JS ile kullanabilirsiniz)
add_filter( 'gform_confirmation', function( $confirmation ) {
$confirmation .= '<script>window.userAutoLoggedIn = true;</script>';
return $confirmation;
});
}
}
}
add_action( 'gform_after_submission', 'gravity_forms_kayit_sonrasi_giris', 10, 2 );
Kullanıcı Rolüne Göre Farklı Yönlendirme
Farklı üyelik planlarınız varsa her kullanıcı tipini farklı bir sayfaya yönlendirmek isteyebilirsiniz. WooCommerce Memberships veya özel roller kullananlar için:
// functions.php - Role göre akıllı yönlendirme
function role_bazli_yonlendirme_ile_otomatik_giris( $user_id ) {
if ( is_admin() || is_user_logged_in() ) {
return;
}
$user = get_user_by( 'id', $user_id );
if ( ! $user ) {
return;
}
// Otomatik giriş yap
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id );
do_action( 'wp_login', $user->user_login, $user );
// Kullanıcı rollerini al
$user_roles = (array) $user->roles;
$redirect_url = home_url( '/' ); // Varsayılan
// Role göre yönlendirme tablosu
$rol_yonlendirme = array(
'premium_uye' => '/premium-icerikler/',
'bayi' => '/bayi-paneli/',
'moderator' => '/moderasyon/',
'subscriber' => '/hesabim/',
'customer' => wc_get_page_permalink( 'myaccount' ),
);
foreach ( $rol_yonlendirme as $rol => $sayfa ) {
if ( in_array( $rol, $user_roles ) ) {
$redirect_url = home_url( $sayfa );
break; // İlk eşleşen rolü kullan
}
}
// Yönlendirmeden önce diğer eklentilerin müdahale etmesine izin ver
$redirect_url = apply_filters(
'otomatik_giris_yonlendirme_url',
$redirect_url,
$user,
$user_roles
);
wp_safe_redirect( esc_url_raw( $redirect_url ) );
exit;
}
add_action( 'user_register', 'role_bazli_yonlendirme_ile_otomatik_giris', 20, 1 );
esc_url_raw kullanımı burada önemli. wp_safe_redirect zaten URL doğrulaması yapıyor ama ek bir sanitize katmanı eklemek her zaman iyi pratik. Ayrıca hook önceliğini 20 olarak belirledik, bu sayede diğer eklentiler kullanıcı oluştuktan sonra rol atamalarını yapabilir (genellikle 10 önceliğiyle çalışırlar) ve bizim fonksiyonumuz güncellenmiş rolleri görebilir.
Hata Ayıklama ve Sorun Giderme
Gerçek dünyada bu tür özellikler her zaman beklendiği gibi çalışmıyor. İşte sık karşılaşılan sorunlar ve çözümleri:
Çerez yazılamıyor: Bu genellikle başka bir kod bloğunun headers_sent() durumuna yol açmasından kaynaklanır. wp_set_auth_cookie fonksiyonu header gönderilmeden önce çalışmalı.
// functions.php - Güvenli header kontrolü ile
function guvenli_cookie_yazma( $user_id ) {
if ( headers_sent( $dosya, $satir ) ) {
error_log( sprintf(
'Otomatik giriş başarısız: Header zaten gönderildi. Dosya: %s, Satır: %d',
$dosya,
$satir
) );
return false;
}
$user = get_user_by( 'id', $user_id );
if ( ! $user ) {
error_log( 'Otomatik giriş başarısız: Kullanıcı bulunamadı. ID: ' . $user_id );
return false;
}
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id );
do_action( 'wp_login', $user->user_login, $user );
return true;
}
Önbellek sorunu: WP Super Cache, W3 Total Cache veya Cloudflare gibi önbellekleme çözümleri kullanıyorsanız oturum açmış kullanıcılar için önbelleği bypass ettiğinizden emin olun. Bu ayar genellikle önbellek eklentisinin kendi panelinde bulunur.
AJAX ile çalışmıyor: AJAX isteklerinde otomatik giriş yapmak istiyorsanız, yeni bir oturum için wp_create_nonce ile doğrulama yapmalısınız. Ayrıca AJAX response’unuzda kullanıcının yeni oturumunu tanımlayan bilgiyi geri dönmeniz gerekebilir.
Multisite Kurulumlar İçin Ek Dikkat
WordPress Multisite kullanıyorsanız wp_set_auth_cookie fonksiyonu ağ genelinde çalışmaz. Her alt site kendi çerezini kullanır.
// functions.php - Multisite için otomatik giriş
function multisite_otomatik_giris( $user_id ) {
if ( is_admin() || is_user_logged_in() ) {
return;
}
// Kullanıcıyı mevcut siteye ekle (eğer eklenmemişse)
if ( ! is_user_member_of_blog( $user_id, get_current_blog_id() ) ) {
add_user_to_blog( get_current_blog_id(), $user_id, 'subscriber' );
}
$user = get_user_by( 'id', $user_id );
if ( $user ) {
wp_set_current_user( $user_id, $user->user_login );
// Multisite'ta false = sadece mevcut site için çerez
wp_set_auth_cookie( $user_id, false, is_ssl() );
do_action( 'wp_login', $user->user_login, $user );
}
}
add_action( 'user_register', 'multisite_otomatik_giris', 10, 1 );
is_ssl() kontrolü ile HTTPS ortamında güvenli çerez yazıyorsunuz. Prodüksiyon sitelerinde SSL zorunlu olmalı zaten ama bu kontrolü eklemek kodunuzu daha taşınabilir yapıyor.
Hangi Hook’u Kullanmalısınız?
Duruma göre doğru hook’u seçmek önemli:
user_register: Standart WordPress kayıt formu için. En genel hook.woocommerce_created_customer: WooCommerce’in kendi kayıt akışı için. Ek parametreler içeriyor.woocommerce_checkout_order_processed: Checkout sırasında hesap açıldığında.gform_after_submission: Gravity Forms entegrasyonu için.wpmu_new_user: Multisite ağına yeni kullanıcı eklendiğinde.
Performans Açısından Değerlendirme
Bu tür kod eklemelerinin performans etkisi minimum düzeyde. wp_set_current_user ve wp_set_auth_cookie WordPress çekirdeğinin temel fonksiyonları ve oldukça optimize edilmiş durumda. Asıl dikkat etmeniz gereken şey, hook’larınızı gereksiz sorgular çalıştırmadan tutmak. Örneğin get_user_by fonksiyonu kullanıcı verisini WordPress’in obje önbelleğinden çekiyor; bu yüzden veritabanı üzerinde ekstra yük oluşturmuyor.
Sonuç
Kullanıcı kaydının ardından otomatik giriş, hem kullanıcı deneyimini hem de dönüşüm oranlarını doğrudan etkileyen basit ama etkili bir özellik. functions.php üzerinden birkaç satır kodla bu sorunu tamamen çözebilirsiniz.
Önemli hatırlatmalar:
- Her zaman
is_admin()kontrolü yapın. Arka plan işlemleri bu sistemden etkilenmesin. is_user_logged_in()ile çift giriş kontrolü yapın. Özellikle AJAX çağrılarında aynı hook birden fazla tetiklenebilir.wp_safe_redirectkullanın. Açık yönlendirme güvenlik açıklarından kaçının.- SSL ortamında çalışın. Çerez güvenliği için HTTPS şart.
- Log tutun. Prodüksiyon ortamında ne olduğunu görmek için basit error_log satırları bile çok işe yarıyor.
Kodu doğrudan functions.php yerine çocuk temanızın functions.php dosyasına eklemenizi öneririm. Tema güncellemelerinde ana temanın functions.php dosyası sıfırlanır ve emeğiniz çöpe gider. Daha iyi bir yaklaşım bu tür özelleştirmeleri küçük bir site-specific eklentiye taşımak, ama bu ayrı bir yazının konusu.
