2010-09-14 55 views
2

我使用WordPress讓我的用戶創建自己的網站/博客。我有一個設置,我用一些特殊的用戶角色和標準插件克隆給所有用戶。最簡單的方法來隱藏(一些)來自用戶的WordPress插件?

但是,一些插件不應該被用戶更改或禁用。

他們有什麼方法可以選擇允許哪些插件使用不同的用戶角色?或者簡單的方法來隱藏插件頁面中的一些插件,但仍然可以正常工作?

也許有一些插件可以幫助我做到這一點?

+0

應該移到superuser.com或wordpress.stackexchange.com。 – joschi 2010-09-14 08:33:10

+0

嘗試谷歌搜索畝插件。這應該解決你的問題 – ChelseaStats 2013-01-04 14:13:06

回答

7

你可以編寫一個插件,使用「all_plugins」過濾器鉤子從數組插件中刪除你不想顯示給某個用戶的插件。類似這樣的:

$plugin_credentials = array(
    'bob' => array(
      'Hello Dolly' => 1 
    ), 
    'jim' => array(
      'Akismet' => 1, 
      'Hello Dolly' => 1, 
    ), 
    'admin' => "**ALL**" 
); 

function plugin_permissions($plugins) 
{ 
     global $current_user, $plugin_credentials; 

     $username = $current_user->user_login; 

     if ($plugin_credentials[$username] == "**ALL**") 
       return $plugins; 

     $viewable_plugins = array(); 

     foreach ($plugins as $plugin) { 
       if (isset($plugin_credentials[$username]) && 
         isset($plugin_credentials[$username][$plugin['Name']]) && 
         $plugin_credentials[$username][$plugin['Name']] == 1) { 

         array_push($viewable_plugins, $plugin); 
       } 
     } 
     return $viewable_plugins; 
} 

add_filter('all_plugins', 'plugin_permissions'); 

管理插件本身的用戶權限並不理想,但它可能是最簡單的。你可以擴展這個想法來創建管理頁面來管理數據庫表中的用戶及其可見插件。

+0

這幾乎是我所需要的,但不幸的是我遇到了一些奇怪的錯誤。 我改變了它,以便plugin_credentials數組包含用戶角色和我不希望用戶角色看到的插件。它隱藏了插件,因爲它應該。但它表示,一些非活動插件處於活動狀態,並且無法激活/停用插件,現在akismet的非活動鏈接爲:plugins.php?action = deactivate&plugin = 0&plugin_status = all&paged = 1 而不是plugins.php?action =取消激活&插件= akismet%2Fakismet.php&plugin_status =所有&paged = 1在管理員用戶 – Volmar 2010-09-15 07:49:48

+0

確認!我不知道這是否與wordpress的插件列表緩存有關。你可以嘗試在return語句之前添加一個wp_cache_delete('plugins','plugins')。但我不確定它是否會有所幫助。 – spuriousdata 2010-09-15 18:20:04

+0

我發現了這個問題(以及它的一個解決方案)。 原始的$ plugin-array具有作爲數組鍵的插件文件的路徑。但是$ viewable_plugins-array使用了第一個關鍵字1作爲下一個廣告0的array_push函數,依此類推。這段代碼的訣竅是: $ keys = array_keys($ plugins); $ num = 0; \t \t的foreach($插件爲$插件){ 如果(isset($ plugin_credentials [$的UserRole])&& $ plugin_credentials [$的UserRole] [$插件[ '名稱']]!= 1){ \t \t \t \t \t \t $ viewable_plugins [$ keys [$ num]] = $ plugin; } \t \t \t $ num ++; } return $ viewable_plugins; – Volmar 2010-09-16 11:46:41

1

每個插件通常會指定他們自己的角色/權限,如果您查看其add_submenu_page()或此類函數調用,您可以看到它們。您可以爲這些插件創建新角色並替換作者指定的角色,但是如果升級插件,它也會中斷更改。

+0

這解決了一半的問題,我可以讓它不出現在菜單中。但插件在插件頁面上仍然可見,並且可以由用戶分發。 (我必須讓他們激活/不激活插件,因爲還有其他插件需要啓用或停用。 – Volmar 2010-09-14 09:49:57

+0

權限管理是WordPress的一個弱點,編輯插件的能力也是其中一項權限。建議給予你的所有特殊成員一個新的角色,排除編輯插件的權利,如果每個插件都是個案的話,恐怕WP並不是爲了處理它而設計的,希望我錯了!想看看WordPress MU。 – Extrakun 2010-09-14 11:32:42

0

你應該分層的用戶。確保管理員用戶是可信的,並且知道不要弄亂他們不明白的東西。其他人應該限於他們的角色。作者,編輯等。例如,如果他們只是寫文章的網站的一部分,那麼他們不需要看到其餘部分。讓他們成爲一名作家並完成它。

這是客戶端教育的一部分。如果它是一個分層角色較小的小客戶,那麼將他們分爲兩個賬戶。告訴他們「這是你管理網站的帳戶,你很少使用這個帳戶,這是你大部分時間用來編寫和編輯的帳戶,你可以在這裏完成你所有的日常任務,很可能永遠不需要管理員帳戶「。你不會總是有這種方法的運氣,但它更少的時間和精力投入廢話,你不應該浪費時間。

0

我已經做了基於@spuriousdata的新版本答案。這一個使用插件slu 012(文件名減去擴展名)來構建限制列表。這種方式更容易,因爲我們可以使用第一級$key s的陣列unset

代碼本身的配置說明。

<?php 
/** 
* Plugin Name: Limit Plugins by User 
* Plugin URI: http://stackoverflow.com/q/14340131/1287812 
* Description: Show selected plugins for specific users. 
* Based on the code by spuriousdata, http://stackoverflow.com/a/3713985. 
* Author: brasofilo 
* Author URI: http://wordpress.stackexchange.com/users/12615/brasofilo 
* Version: 1.0 
* License: GPLv2 or later 
*/ 

add_filter('all_plugins', 'plugin_permissions_so_3707134'); 

/** 
* Filter the list of plugins according to user_login 
* 
* Usage: configure the variable $plugin_credentials, which holds a list of users and their plugins. 
* To give full access, put a simple string "ALL" 
* To grant only for some plugins, create an array with the Plugin Slug, 
* which is the file name without extension (akismet.php, hello.php) 
* 
* @return array List of plugins 
*/ 
function plugin_permissions_so_3707134($plugins) 
{ 
    // Config 
    $plugin_credentials = array(
     'admin' => "ALL", 
     'other-admin' => array(
      'akismet', 
     ), 
     'another-admin' => array(
      'akismet', 
      'hello', 
     ), 
    ); 

    // Current user 
    global $current_user; 
    $username = $current_user->user_login; 

    // Super admin, return everything 
    if ("ALL" == $plugin_credentials[ $username ]) 
     return $plugins; 

    // Filter the plugins of the user 
    foreach ($plugins as $key => $value) 
    { 
     // Get the file name minus extension 
     $plugin_slug = basename($key, '.php'); 

     // If not in the list of allowed plugins, remove from array 
     if(!in_array($plugin_slug, $plugin_credentials[ $username ])) 
      unset($plugins[ $key ]); 
    } 

    return $plugins; 
} 
相關問題