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_reportsgibi prefix kullanın- Küçük harf ve alt çizgi kullanın
- Anlamlı isimler seçin,
perm1,perm2gibi 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.
