WordPress’te Kullanıcı Yetkilerini Özelleştirme: add_cap ve remove_cap Kullanımı

WordPress’te kullanıcı yetkilendirme sistemi, doğru anlaşıldığında site güvenliğinin ve kullanılabilirliğinin temel taşlarından birini oluşturur. Varsayılan roller çoğu zaman ihtiyacı tam karşılamaz; bir editörün WooCommerce siparişlerine bakmasını istiyorsunuz ama tam yönetici yetkisi vermek istemiyorsunuz, ya da belirli bir kullanıcının sadece belirli eklenti ayarlarına erişmesini sağlamak istiyorsunuz. İşte tam bu noktada add_cap ve remove_cap fonksiyonları devreye giriyor.

WordPress Capability Sistemi Nasıl Çalışır

WordPress, kullanıcı yetkilerini “capability” (yetenek/izin) adı verilen anahtarlar üzerinden yönetir. Her rol, bir dizi capability’den oluşur. Örneğin editor rolü edit_posts, delete_posts, publish_posts gibi yeteneklere sahipken manage_options gibi yönetici yeteneklerine sahip değildir.

Bu sistemi anlamanın en pratik yolu şu soruyu sormak: “Bu kullanıcı bunu yapabilmeli mi?” Eğer cevabınız “evet ama rolünü tamamen değiştirmeden” şeklindeyse, add_cap ve remove_cap tam aradığınız araçtır.

WordPress’teki temel capability örnekleri:

  • manage_options: Genel site ayarlarını yönetme
  • edit_posts: Yazı düzenleme
  • publish_posts: Yazı yayınlama
  • delete_others_posts: Başkalarının yazılarını silme
  • manage_woocommerce: WooCommerce paneline erişim
  • edit_shop_orders: WooCommerce siparişlerini düzenleme
  • install_plugins: Eklenti kurma
  • manage_categories: Kategori yönetimi

add_cap Fonksiyonu

add_cap fonksiyonu, belirli bir kullanıcıya veya role yeni bir yetenek ekler. Bu değişiklik veritabanına kaydedilir, yani kalıcıdır.

Söz dizimi:

$user->add_cap( string $cap, bool $grant = true )

Parametreler:

  • $cap: Eklenecek capability adı (string)
  • $grant: true ise capability verilir, false ise açıkça reddedilir (bool, varsayılan true)

Önemli bir not: add_cap ile eklenen yetenekler veritabanındaki wp_usermeta tablosunda wp_capabilities meta key’i altında saklanır. Bu yüzden bir kez çalıştırmanız yeterlidir, her sayfa yüklemesinde tekrar çalıştırmanıza gerek yoktur.

remove_cap Fonksiyonu

remove_cap ise tam tersi işlemi yapar. Bir kullanıcıdan veya rolden belirli bir capability’yi kaldırır.

Söz dizimi:

$user->remove_cap( string $cap )

Parametreler:

  • $cap: Kaldırılacak capability adı (string)

Temel Kullanım Örnekleri

Belirli Bir Kullanıcıya Yetki Ekleme

En sık karşılaşılan senaryo: Belirli bir kullanıcıya ekstra yetki vermek. Diyelim ki ID’si 42 olan kullanıcınız bir editör ama WooCommerce siparişlerini görmesi gerekiyor.

function add_custom_user_capabilities() {
    $user = get_user_by( 'id', 42 );
    
    if ( $user ) {
        $user->add_cap( 'view_woocommerce_reports' );
        $user->add_cap( 'edit_shop_orders' );
        $user->add_cap( 'manage_woocommerce' );
    }
}
add_action( 'init', 'add_custom_user_capabilities' );

Ancak dikkat edin, bu kodu init hook’una bağlamak her sayfa yüklemesinde çalıştırır. Veritabanı zaten güncel olduğu için zarar vermez ama gereksiz sorgu oluşturur. Daha temiz yaklaşım bir kez çalıştırmak:

function run_once_capability_setup() {
    if ( get_option( 'custom_caps_added' ) ) {
        return;
    }
    
    $user = get_user_by( 'id', 42 );
    
    if ( $user ) {
        $user->add_cap( 'view_woocommerce_reports' );
        $user->add_cap( 'edit_shop_orders' );
        $user->add_cap( 'manage_woocommerce' );
        
        update_option( 'custom_caps_added', true );
    }
}
add_action( 'admin_init', 'run_once_capability_setup' );

Role Yetki Ekleme ve Kaldırma

Bireysel kullanıcı yerine tüm bir role yetki eklemek isteyebilirsiniz. Bu durumda get_role() fonksiyonunu kullanırsınız.

function customize_editor_capabilities() {
    $editor_role = get_role( 'editor' );
    
    if ( ! $editor_role ) {
        return;
    }
    
    // Editörlere yeni yetkiler ekle
    $editor_role->add_cap( 'manage_categories' );
    $editor_role->add_cap( 'upload_files' );
    $editor_role->add_cap( 'manage_links' );
    
    // Editörlerden bazı tehlikeli yetkileri kaldır
    $editor_role->remove_cap( 'delete_published_posts' );
    $editor_role->remove_cap( 'delete_others_posts' );
}
add_action( 'init', 'customize_editor_capabilities' );

Önemli uyarı: Rol tabanlı değişiklikler de veritabanına kaydedilir (wp_options tablosunda wp_user_roles key’i altında). Yani bu kodu theme’den kaldırsanız bile değişiklikler kalır. Bu hem avantaj hem de dezavantajdır; temkinli olun.

Gerçek Dünya Senaryoları

Senaryo 1: Muhasebe Personeli için WooCommerce Erişimi

Bir e-ticaret sitesinde muhasebe departmanından biri siparişleri ve raporları görmesi gerekiyor ama ürünleri değiştirme, ayarları karıştırma yetkisi olmamalı.

function setup_accounting_capabilities() {
    // Muhasebe kullanıcılarını e-posta ile bul
    $accounting_users = array(
        '[email protected]',
        '[email protected]'
    );
    
    foreach ( $accounting_users as $email ) {
        $user = get_user_by( 'email', $email );
        
        if ( ! $user ) {
            continue;
        }
        
        // Sipariş görüntüleme ve raporlama yetkileri ekle
        $user->add_cap( 'view_woocommerce_reports' );
        $user->add_cap( 'edit_shop_orders' );
        $user->add_cap( 'read_shop_order' );
        
        // Ürün düzenleme yetkisi varsa kaldır
        $user->remove_cap( 'edit_products' );
        $user->remove_cap( 'publish_products' );
        $user->remove_cap( 'delete_products' );
    }
}
register_activation_hook( __FILE__, 'setup_accounting_capabilities' );

Senaryo 2: İçerik Moderatörü Rolü

Sitenizde kullanıcı yorumlarını onaylayan, spam temizleyen ama yazı yayınlama yetkisi olmayan bir moderatöre ihtiyacınız var.

function create_moderator_capabilities() {
    // Subscriber rolündeki moderatör kullanıcısını bul
    $moderator = get_user_by( 'login', 'moderator_ali' );
    
    if ( ! $moderator ) {
        return;
    }
    
    // Yorum yönetim yetkileri
    $moderator->add_cap( 'moderate_comments' );
    $moderator->add_cap( 'edit_comment' );
    $moderator->add_cap( 'delete_comment' );
    
    // Yazı okuma yetkileri (onaylamak için görmesi lazım)
    $moderator->add_cap( 'read' );
    $moderator->add_cap( 'edit_posts' );
    
    // Ama yayınlama ve silme yapamamalı
    $moderator->remove_cap( 'publish_posts' );
    $moderator->remove_cap( 'delete_posts' );
}
add_action( 'admin_init', 'create_moderator_capabilities' );

Senaryo 3: SEO Editörü – Sadece Meta Bilgileri Düzenleyebilsin

Yoast SEO veya Rank Math kullanan sitelerde, SEO uzmanlarının sadece meta başlıkları ve açıklamaları düzenlemesine izin vermek ama site yapısına dokunmamasını sağlamak isteyebilirsiniz.

function setup_seo_editor_capabilities() {
    $seo_users = get_users( array(
        'meta_key'   => 'job_position',
        'meta_value' => 'seo_specialist',
    ) );
    
    foreach ( $seo_users as $user ) {
        // Temel yazı düzenleme
        $user->add_cap( 'edit_posts' );
        $user->add_cap( 'edit_others_posts' );
        $user->add_cap( 'read' );
        
        // Kategori ve etiket yönetimi (SEO için gerekli)
        $user->add_cap( 'manage_categories' );
        
        // Tema ve eklenti erişimi kesinlikle olmamalı
        $user->remove_cap( 'edit_themes' );
        $user->remove_cap( 'install_plugins' );
        $user->remove_cap( 'activate_plugins' );
        $user->remove_cap( 'manage_options' );
    }
}
add_action( 'admin_init', 'setup_seo_editor_capabilities' );

Senaryo 4: Özel Capability ile Menü Erişimi Kısıtlama

Kendi oluşturduğunuz özel bir capability ile admin menü erişimini kontrol edebilirsiniz. Bu, kurumsal sitelerde çok işe yarar.

// Önce özel capability'yi tanımla ve kullanıcıya ekle
function register_custom_capabilities() {
    $admin_user = get_user_by( 'id', 1 );
    
    if ( $admin_user ) {
        // Özel capability'leri oluştur
        $admin_user->add_cap( 'manage_company_settings' );
        $admin_user->add_cap( 'view_internal_reports' );
        $admin_user->add_cap( 'export_customer_data' );
    }
}
add_action( 'init', 'register_custom_capabilities' );

// Sonra bu capability'yi admin menüsünde kullan
function add_custom_admin_menu() {
    add_menu_page(
        'Şirket Ayarları',
        'Şirket Ayarları',
        'manage_company_settings', // Capability kontrolü burada
        'company-settings',
        'render_company_settings_page',
        'dashicons-building',
        30
    );
    
    add_submenu_page(
        'company-settings',
        'İç Raporlar',
        'İç Raporlar',
        'view_internal_reports',
        'internal-reports',
        'render_internal_reports_page'
    );
}
add_action( 'admin_menu', 'add_custom_admin_menu' );

Senaryo 5: WooCommerce Mağaza Yöneticisi Kısıtlama

WooCommerce’in shop_manager rolü bazen çok fazla yetki içerir. Aşağıdaki örnek, mağaza yöneticisinin WordPress’in genel ayarlarına erişimini kısıtlar.

function restrict_shop_manager_capabilities() {
    $shop_manager_role = get_role( 'shop_manager' );
    
    if ( ! $shop_manager_role ) {
        return;
    }
    
    // WordPress çekirdek ayarlarına erişimi kaldır
    $shop_manager_role->remove_cap( 'manage_options' );
    $shop_manager_role->remove_cap( 'edit_theme_options' );
    $shop_manager_role->remove_cap( 'install_plugins' );
    $shop_manager_role->remove_cap( 'activate_plugins' );
    $shop_manager_role->remove_cap( 'delete_plugins' );
    $shop_manager_role->remove_cap( 'install_themes' );
    
    // WooCommerce spesifik yetkileri koru
    $shop_manager_role->add_cap( 'manage_woocommerce' );
    $shop_manager_role->add_cap( 'view_woocommerce_reports' );
    $shop_manager_role->add_cap( 'edit_shop_orders' );
    $shop_manager_role->add_cap( 'publish_shop_orders' );
}

// Bu işlem bir kez yeterli, eklenti aktifleştirildiğinde çalıştır
register_activation_hook( __FILE__, 'restrict_shop_manager_capabilities' );

Yetki Değişikliklerini Geri Alma

Bir rolden yetki kaldırdığınızda ve bunu geri almak istediğinizde, remove_cap ile kaldırılan yetkileri add_cap ile tekrar eklemeniz gerekir. Plugin deactivation hook’u bu iş için idealdir.

function restore_shop_manager_capabilities() {
    $shop_manager_role = get_role( 'shop_manager' );
    
    if ( ! $shop_manager_role ) {
        return;
    }
    
    // Kaldırılan yetkileri geri yükle
    $shop_manager_role->add_cap( 'manage_options' );
    $shop_manager_role->add_cap( 'install_plugins' );
    $shop_manager_role->add_cap( 'activate_plugins' );
}
register_deactivation_hook( __FILE__, 'restore_shop_manager_capabilities' );

current_user_can ile Yetki Kontrolü

Eklediğiniz özel capability’leri kod içinde kontrol etmek için current_user_can() fonksiyonunu kullanırsınız.

function show_custom_dashboard_widget() {
    // Sadece özel capability'si olan kullanıcılara göster
    if ( ! current_user_can( 'view_internal_reports' ) ) {
        return;
    }
    
    wp_add_dashboard_widget(
        'internal_reports_widget',
        'İç Raporlar',
        'render_internal_reports_widget'
    );
}
add_action( 'wp_dashboard_setup', 'show_custom_dashboard_widget' );

function render_internal_reports_widget() {
    if ( ! current_user_can( 'view_internal_reports' ) ) {
        echo '<p>Bu raporu görüntüleme yetkiniz yok.</p>';
        return;
    }
    
    // Rapor içeriği buraya
    echo '<p>Aylık satış verileriniz hazır...</p>';
}

Dikkat Edilmesi Gereken Noktalar

Performans Meselesi

add_cap ve remove_cap veritabanı yazan işlemlerdir. Her sayfa yüklemesinde çalıştırırsanız gereksiz veritabanı yükü oluşturur. Bunu önlemek için:

  • register_activation_hook: Plugin aktifleştirildiğinde bir kez çalıştır
  • after_switch_theme: Tema değiştirildiğinde çalıştır
  • get_option / update_option: Manuel bir flag ile bir kez çalıştır

Süper Admin Sorunu

WordPress Multisite kurulumlarında süper admin yetkileri farklı çalışır. Süper adminlerin bazı capability kontrolleri bypass eder, bu yüzden multisite ortamında is_super_admin() kontrolü eklemenizi öneririm.

Theme vs Plugin

Yetki değişikliklerini functions.php‘ye koyuyorsanız, tema değiştirildiğinde bu değişiklikler uygulanmaz. Kalıcı yetki yönetimi için küçük bir must-use plugin tercih edin. Ama eğer sadece aktif temaya özel bir davranış istiyorsanız after_switch_theme hook’u ile bunu düzenleyebilirsiniz.

Yetki Adlandırma Konvansiyonu

Özel capability isimleri için tutarlı bir adlandırma standardı belirleyin:

  • filankesSirket_manage_reports gibi prefix kullanın
  • Küçük harf ve alt çizgi kullanın
  • Anlamlı isimler seçin, perm1, perm2 gibi isimlerden kaçının

Debug: Kullanıcının Hangi Yetkileri Var

Geliştirme aşamasında bir kullanıcının tüm yetkilerini görmek için:

function debug_user_capabilities( $user_id = null ) {
    if ( ! WP_DEBUG ) {
        return;
    }
    
    if ( ! $user_id ) {
        $user_id = get_current_user_id();
    }
    
    $user = get_user_by( 'id', $user_id );
    
    if ( $user ) {
        $caps = $user->allcaps;
        arsort( $caps );
        
        echo '<pre>';
        echo '<strong>Kullanıcı: ' . $user->user_login . '</strong>' . PHP_EOL;
        echo '<strong>Aktif Yetkiler:</strong>' . PHP_EOL;
        
        foreach ( $caps as $cap => $granted ) {
            if ( $granted ) {
                echo '+ ' . $cap . PHP_EOL;
            }
        }
        
        echo '<strong>Reddedilen Yetkiler:</strong>' . PHP_EOL;
        
        foreach ( $caps as $cap => $granted ) {
            if ( ! $granted ) {
                echo '- ' . $cap . PHP_EOL;
            }
        }
        
        echo '</pre>';
    }
}
// Geliştirme sırasında: add_action( 'admin_notices', 'debug_user_capabilities' );

Sonuç

add_cap ve remove_cap fonksiyonları, WordPress’in kullanıcı yetkilendirme sistemine ince ayar yapmanın en temiz yoludur. Hazır rollerin sınırlarını aşmadan, kullanıcı bazında veya rol bazında yetkiler ekleyip çıkarabilirsiniz.

Pratik özet olarak şunları aklınızda tutun: Bireysel kullanıcı için get_user_by() ile kullanıcı nesnesini alın, rol için get_role() kullanın. Değişiklikler veritabanına yazıldığı için bir kez çalıştırmanız yeterli, her sayfa yüklemesinde tekrar etmeyin. Özel capability’lerinizi current_user_can() ile kontrol edin ve admin menüleri, kısıtlı içerikler gibi noktalarda bu kontrolü uygulayın.

WooCommerce entegrasyonunda özellikle mağaza yöneticisi rolünü denetim altında tutmak, müşteri verilerini ve ödeme bilgilerini korumak adına kritik önem taşır. Hangi kullanıcının neye erişebildiğini bilmek, hem güvenlik hem de operasyonel verimlilik açısından sysadmin’in temel sorumluluklarından biridir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir