Kullanıcı Rolüne Göre Yönlendirme: Login Sonrası
WordPress ile bir üyelik sitesi, e-ticaret platformu veya çok katmanlı bir içerik sitesi yönetiyorsanız, büyük ihtimalle şu soruyla karşılaşmışsınızdır: “Kullanıcı giriş yaptıktan sonra nereye gitmeli?” Varsayılan WordPress davranışı herkesi aynı yere, genellikle /wp-admin veya ana sayfaya gönderir. Oysa bir müşteri, bir editör ve bir yönetici çok farklı yerlere yönlendirilmelidir. Bu yazıda functions.php dosyasını kullanarak login sonrası yönlendirmeyi kullanıcı rolüne göre nasıl özelleştireceğinizi, gerçek dünya senaryolarıyla birlikte ele alacağım.
Neden Özel Yönlendirme Gerekli?
Standart WordPress kurulumunda tüm kullanıcılar giriş yaptıktan sonra aynı sayfaya düşer. Bu, kullanıcı deneyimi açısından ciddi bir sorun yaratır. Düşünün: WooCommerce mağazanızda alışveriş yapan bir müşteri, giriş yaptıktan sonra kendini wp-admin panelinde buluyor. Panikleyen kullanıcı siteyi terk ediyor ve siz potansiyel bir satış kaybediyorsunuz.
Öte yandan bir içerik editörünün doğrudan yazı listesine, bir WooCommerce satıcısının kendi mağaza paneline, bir aboneyse üyelik içeriklerine yönlendirilmesi hem profesyonel bir görünüm sağlar hem de kullanıcının gereksiz yere dolaşmasını engeller.
WordPress bu işlem için login_redirect adında bir filtre hook’u sunar. Bu hook sayesinde giriş sonrası yönlendirmeyi tamamen kontrol altına alabilirsiniz.
Temel Yapı: login_redirect Hook’u
Her şeye temel yapıyı anlayarak başlayalım. login_redirect filtresi üç parametre alır:
- $redirect_to: Varsayılan yönlendirme URL’si
- $requested_redirect_to: Kullanıcının talep ettiği yönlendirme URL’si (örneğin login formuna
?redirect_to=parametresiyle gelindiyse) - $user: Giriş yapan kullanıcının WP_User nesnesi
// functions.php - Temel login_redirect yapisi
add_filter( 'login_redirect', 'custom_login_redirect', 10, 3 );
function custom_login_redirect( $redirect_to, $requested_redirect_to, $user ) {
// $user nesnesinin gecerli olup olmadigini kontrol et
if ( ! isset( $user->roles ) || ! is_array( $user->roles ) ) {
return $redirect_to;
}
// Kullanici rolune gore yonlendir
if ( in_array( 'administrator', $user->roles ) ) {
return admin_url();
}
// Diger roller icin ana sayfa
return home_url();
}
Bu basit yapı bile varsayılan davranıştan çok daha iyidir. Şimdi bunu gerçek dünya senaryolarına göre genişletelim.
Senaryo 1: WooCommerce Mağazası Rol Yönlendirmesi
Bir WooCommerce mağazası işletiyorsanız genellikle şu roller mevcuttur: müşteriler (customer), mağaza yöneticileri (shop_manager) ve normal yöneticiler (administrator). Her birinin farklı bir yere gitmesi mantıklıdır.
// WooCommerce icin gelismis rol yonlendirmesi
add_filter( 'login_redirect', 'woocommerce_role_based_redirect', 10, 3 );
function woocommerce_role_based_redirect( $redirect_to, $requested_redirect_to, $user ) {
if ( ! isset( $user->roles ) || ! is_array( $user->roles ) ) {
return $redirect_to;
}
// Yonetici: wp-admin ana sayfasina
if ( in_array( 'administrator', $user->roles ) ) {
return admin_url( 'index.php' );
}
// Magaza yoneticisi: WooCommerce siparis listesine
if ( in_array( 'shop_manager', $user->roles ) ) {
return admin_url( 'edit.php?post_type=shop_order' );
}
// Musteri: Hesabim sayfasina (WooCommerce my-account)
if ( in_array( 'customer', $user->roles ) ) {
return wc_get_page_permalink( 'myaccount' );
}
// Varsayilan: Ana sayfa
return home_url();
}
Bu yapıda mağaza yöneticisi giriş yapar yapmaz sipariş listesini görür, müşteri ise hesap sayfasına düşer. Kullanıcı deneyimi açısından çok daha pürüzsüz bir akış elde edersiniz.
Senaryo 2: Üyelik Sitesi için Çok Katmanlı Yönlendirme
Üyelik sitelerinde genellikle farklı abonelik seviyeleri bulunur. MemberPress, Paid Memberships Pro veya benzeri eklentiler kullananlar için şu yapı işe yarar:
// Uyelik sitesi icin katmanli yonlendirme
add_filter( 'login_redirect', 'membership_role_redirect', 10, 3 );
function membership_role_redirect( $redirect_to, $requested_redirect_to, $user ) {
if ( ! isset( $user->roles ) || ! is_array( $user->roles ) ) {
return $redirect_to;
}
// Eger kullanici belirli bir sayfaya yonlendirilmek istiyorsa buna saygi goster
if ( ! empty( $requested_redirect_to ) ) {
return $requested_redirect_to;
}
// Yonetici
if ( in_array( 'administrator', $user->roles ) ) {
return admin_url();
}
// Icerik editoru
if ( in_array( 'editor', $user->roles ) ) {
return admin_url( 'edit.php' );
}
// Premium uye (ornek ozel rol)
if ( in_array( 'premium_member', $user->roles ) ) {
return home_url( '/premium-icerikler/' );
}
// Standart uye
if ( in_array( 'subscriber', $user->roles ) ) {
return home_url( '/uye-icerikleri/' );
}
// Beklemedeki uye
if ( in_array( 'pending_member', $user->roles ) ) {
return home_url( '/uyelik-onay-bekleniyor/' );
}
return home_url();
}
Buradaki kritik nokta, $requested_redirect_to kontrolüdür. Eğer kullanıcı korumalı bir içeriğe erişmeye çalışırken login sayfasına yönlendirildiyse, giriş sonrası o içeriğe gönderilmesi beklenir. Bu kontrolü eklemezseniz kullanıcı deneyimini bozarsınız.
Senaryo 3: Hata Ayıklama ve Rol Doğrulama
Bazen bir kullanıcının birden fazla rolü olabilir ya da beklenmedik durumlarla karşılaşabilirsiniz. Bu gibi durumlar için daha sağlam bir kontrol mekanizması şöyle kurulabilir:
// Gelismis rol kontrolu ve hata ayiklama
add_filter( 'login_redirect', 'advanced_role_redirect', 10, 3 );
function advanced_role_redirect( $redirect_to, $requested_redirect_to, $user ) {
// WP_Error kontrolu - yanlis sifre girislerinde $user WP_Error olabilir
if ( is_wp_error( $user ) ) {
return $redirect_to;
}
if ( ! isset( $user->roles ) || empty( $user->roles ) ) {
return home_url();
}
// Kullanicinin birden fazla rolu varsa once onemli rolleri kontrol et
$priority_roles = array(
'administrator' => admin_url(),
'editor' => admin_url( 'edit.php' ),
'author' => admin_url( 'edit.php?author=' . $user->ID ),
'shop_manager' => admin_url( 'edit.php?post_type=shop_order' ),
'contributor' => admin_url( 'edit.php' ),
);
foreach ( $priority_roles as $role => $url ) {
if ( in_array( $role, $user->roles ) ) {
return $url;
}
}
// On yuz rolleri
$frontend_roles = array(
'premium_member' => home_url( '/premium/' ),
'customer' => wc_get_page_permalink( 'myaccount' ),
'subscriber' => home_url( '/icerikler/' ),
);
foreach ( $frontend_roles as $role => $url ) {
if ( in_array( $role, $user->roles ) ) {
return $url;
}
}
return home_url();
}
Bu yapıda öncelik sıralaması çok önemlidir. Bir kullanıcı hem editor hem customer rolüne sahipse, editor rolü önce kontrol edildiği için yönetim paneline yönlendirilir.
Kullanıcı Metaverisi ile Dinamik Yönlendirme
Bazen rol bazlı yönlendirme yeterli değildir. Kullanıcıya özel meta verilere göre yönlendirme yapmanız gerekebilir. Örneğin, bir kullanıcının ilk girişinde profil tamamlama sayfasına göndermek isteyebilirsiniz:
// Meta veriye dayali dinamik yonlendirme
add_filter( 'login_redirect', 'meta_based_login_redirect', 10, 3 );
function meta_based_login_redirect( $redirect_to, $requested_redirect_to, $user ) {
if ( is_wp_error( $user ) || ! isset( $user->roles ) ) {
return $redirect_to;
}
// Yonetici ve editor rolleri icin standart davranis
if ( in_array( 'administrator', $user->roles ) || in_array( 'editor', $user->roles ) ) {
return admin_url();
}
// Kullanicinin profili tamamlanmis mi kontrol et
$profile_completed = get_user_meta( $user->ID, 'profile_completed', true );
if ( empty( $profile_completed ) ) {
// Ilk giris: Profil tamamlama sayfasina yonlendir
return home_url( '/profil-tamamla/' );
}
// Son giris tarihini kaydet
update_user_meta( $user->ID, 'last_login', current_time( 'mysql' ) );
// Giris sayacini artir
$login_count = (int) get_user_meta( $user->ID, 'login_count', true );
update_user_meta( $user->ID, 'login_count', $login_count + 1 );
// Ilk 3 giris icin hos geldin sayfasi goster
if ( $login_count < 3 ) {
return home_url( '/hos-geldiniz/' );
}
// Musteri icin hesabim sayfasi
if ( in_array( 'customer', $user->roles ) ) {
return wc_get_page_permalink( 'myaccount' );
}
return home_url();
}
Bu senaryoda kullanıcının profilini tamamlayıp tamamlamadığını kontrol ediyoruz. Eğer tamamlamamışsa profil sayfasına, ilk 3 girişindeyse hoş geldiniz sayfasına gönderiyoruz. Böyle bir mekanizma özellikle onboarding süreçleri için oldukça değerlidir.
Çıkış Sonrası Yönlendirme
Login yönlendirmesini ele aldıktan sonra logout yönlendirmesini de ihmal etmemek gerekir. Çıkış yapan kullanıcıyı da uygun bir sayfaya göndermek kullanıcı deneyimini tamamlar:
// Cikis sonrasi yonlendirme
add_action( 'wp_logout', 'custom_logout_redirect' );
function custom_logout_redirect() {
// Cikis yapan kullanicinin bilgilerini almak icin mevcut kullanici yok
// Bu yuzden oturum bilgisinden veya diger yontemlerden faydalanmak gerekir
wp_redirect( home_url( '/giris/?logged_out=true' ) );
exit;
}
// Alternatif: logout_redirect filtresi kullanmak (WordPress 5.5+)
add_filter( 'logout_redirect', 'custom_logout_page', 10, 3 );
function custom_logout_page( $redirect_to, $requested_redirect_to, $user ) {
// Yonetici cikis yaparsa ana sayfaya don
if ( isset( $user->roles ) && in_array( 'administrator', $user->roles ) ) {
return home_url();
}
// Diger kullanicilar login sayfasina
return home_url( '/giris/' );
}
logout_redirect filtresi WordPress 5.5 ile geldi. Daha eski sürümler için wp_logout action hook’u kullanmanız gerekir.
Güvenlik Notları ve En İyi Pratikler
Yönlendirme işlemleri görünürde basit gibi görünse de güvenlik açısından dikkat edilmesi gereken noktalar vardır.
Açık Yönlendirme Açıkları: Kullanıcıdan gelen redirect_to parametresini doğrulamadan kullanmak, saldırganların kullanıcıları zararlı sitelere yönlendirmesine neden olabilir. WordPress bunu kısmen engeller ancak siz de ek kontrol eklemelisiniz.
// Guvenli yonlendirme URL dogrulama
add_filter( 'login_redirect', 'secure_login_redirect', 10, 3 );
function secure_login_redirect( $redirect_to, $requested_redirect_to, $user ) {
if ( is_wp_error( $user ) || ! isset( $user->roles ) ) {
return $redirect_to;
}
// Dis URL'lere yonlendirmeyi engelle
if ( ! empty( $requested_redirect_to ) ) {
$parsed = wp_parse_url( $requested_redirect_to );
$site = wp_parse_url( home_url() );
// Sadece kendi site URL'lerine izin ver
if ( empty( $parsed['host'] ) || $parsed['host'] === $site['host'] ) {
return $requested_redirect_to;
}
}
// Guvenli yonlendirme URL'si dogrulama
$safe_urls = array(
home_url( '/hesabim/' ),
home_url( '/panel/' ),
home_url( '/icerikler/' ),
admin_url(),
);
// Yonetici
if ( in_array( 'administrator', $user->roles ) ) {
return admin_url();
}
// Musteri
if ( in_array( 'customer', $user->roles ) ) {
return home_url( '/hesabim/' );
}
return home_url();
}
Yönlendirme Testleri ve Debug
Geliştirme sırasında yönlendirmelerin doğru çalışıp çalışmadığını test etmek için basit bir loglama mekanizması eklemek hayat kurtarır:
// Gelistirme ortaminda yonlendirme loglama
add_filter( 'login_redirect', 'debug_login_redirect', 10, 3 );
function debug_login_redirect( $redirect_to, $requested_redirect_to, $user ) {
// Sadece WP_DEBUG aktifken calis
if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) {
return $redirect_to;
}
if ( is_wp_error( $user ) || ! isset( $user->roles ) ) {
error_log( 'Login Redirect DEBUG: Gecersiz kullanici nesnesi' );
return $redirect_to;
}
$roles = implode( ', ', $user->roles );
$log_msg = sprintf(
'Login Redirect - Kullanici: %s | Roller: %s | Yonlendirme: %s',
$user->user_login,
$roles,
$redirect_to
);
error_log( $log_msg );
return $redirect_to;
}
Bu logu aktifleştirdikten sonra wp-content/debug.log dosyasını takip ederek her girişte kimin nereye yönlendirildiğini görebilirsiniz. wp-config.php dosyanızda define( 'WP_DEBUG_LOG', true ); satırının aktif olması gerekir.
Tüm Parçaları Bir Araya Getirmek
Gerçek bir projede kullanabileceğiniz, tüm senaryoları kapsayan kapsamlı bir versiyon şu şekilde görünür:
// Kapsamli, production-ready yonlendirme sistemi
// functions.php dosyasina ekleyin
add_filter( 'login_redirect', 'comprehensive_login_redirect', 10, 3 );
function comprehensive_login_redirect( $redirect_to, $requested_redirect_to, $user ) {
// Hata kontrolu
if ( is_wp_error( $user ) ) {
return $redirect_to;
}
if ( ! isset( $user->roles ) || ! is_array( $user->roles ) ) {
return home_url();
}
// 1. Guvenli ic yonlendirme talebi varsa ona saygi goster
if ( ! empty( $requested_redirect_to ) ) {
$parsed_request = wp_parse_url( $requested_redirect_to );
$parsed_home = wp_parse_url( home_url() );
if (
empty( $parsed_request['host'] ) ||
$parsed_request['host'] === $parsed_home['host']
) {
return $requested_redirect_to;
}
}
// 2. Profil tamamlanma kontrolu (yonetici rolleri haric)
$admin_roles = array( 'administrator', 'editor', 'author', 'contributor', 'shop_manager' );
$is_admin_role = array_intersect( $admin_roles, $user->roles );
if ( empty( $is_admin_role ) ) {
$profile_done = get_user_meta( $user->ID, 'profile_completed', true );
if ( empty( $profile_done ) ) {
return home_url( '/profil-tamamla/' );
}
}
// 3. Rol bazli yonlendirme
if ( in_array( 'administrator', $user->roles ) ) {
return admin_url( 'index.php' );
}
if ( in_array( 'shop_manager', $user->roles ) ) {
return admin_url( 'edit.php?post_type=shop_order' );
}
if ( in_array( 'editor', $user->roles ) ) {
return admin_url( 'edit.php' );
}
if ( in_array( 'author', $user->roles ) ) {
return admin_url( 'edit.php?author=' . $user->ID );
}
if ( in_array( 'contributor', $user->roles ) ) {
return admin_url( 'edit.php' );
}
if ( in_array( 'premium_member', $user->roles ) ) {
return home_url( '/premium-icerikler/' );
}
if ( function_exists( 'wc_get_page_permalink' ) && in_array( 'customer', $user->roles ) ) {
return wc_get_page_permalink( 'myaccount' );
}
if ( in_array( 'subscriber', $user->roles ) ) {
return home_url( '/uye-icerikleri/' );
}
// 4. Hicbir rol eslesmezse
return home_url();
}
// Cikis yonlendirmesi
add_filter( 'logout_redirect', 'comprehensive_logout_redirect', 10, 3 );
function comprehensive_logout_redirect( $redirect_to, $requested_redirect_to, $user ) {
return home_url( '/giris/?mesaj=cikis-yapildi' );
}
Sık Yapılan Hatalar
Yönlendirme kodunu yazarken karşılaşılan en yaygın hatalar şunlardır:
- $user nesnesini kontrol etmemek: Başarısız login denemelerinde
$userbirWP_Errornesnesi olur. Bunu kontrol etmeden$user->roles‘a erişmeye çalışmak PHP hatası verir.
- WooCommerce fonksiyonlarını koşulsuz kullanmak:
wc_get_page_permalink()gibi fonksiyonlar WooCommerce aktif değilse çalışmaz.function_exists()ile kontrol edin.
- Sonsuz döngü oluşturmak: Eğer yönlendirme hedefi login gerektiriyorsa ve kullanıcı oraya erişemiyorsa sonsuz bir yönlendirme döngüsü oluşur. Hedef URL’lerin erişilebilir olduğundan emin olun.
- Önbellek sorunları: Bazı önbellek eklentileri yönlendirmeleri önbelleğe alır. WP Rocket, LiteSpeed Cache gibi eklentilerde login sayfası ve hesap sayfaları için önbellek istisnası tanımlamanız gerekir.
- Multisite ortamında hata: Multisite kurulumunda
admin_url()farklı davranır. Gerekirseget_admin_url( get_current_blog_id() )kullanın.
Sonuç
Login sonrası kullanıcı yönlendirmesi, küçük ama etkisi büyük bir özelliktir. Doğru yapılandırıldığında kullanıcı deneyimini önemli ölçüde iyileştirir, destek taleplerini azaltır ve sitenizin profesyonelliğini artırır. Müşteriniz artık giriş yaptığında kendini wp-admin’de bulmayacak, editörünüz doğrudan yazı listesine ulaşacak, premium üyeniz hemen özel içeriklere erişecek.
login_redirect hook’u bu işin tam ortasında duruyor. Temel yapıyı kavradıktan sonra meta veri kontrolleri, güvenlik doğrulamaları ve WooCommerce entegrasyonu gibi katmanları üstüne ekleyebilirsiniz. Üretim ortamına almadan önce farklı rol kombinasyonlarını mutlaka test edin ve WP_DEBUG_LOG ile birkaç günlük izleme yapın. Böylece gözden kaçan edge case’leri üretim öncesinde yakalamış olursunuz.
