問題描述
所以我一直在通過自定義角色進行處理。我會嘗試儘可能的描述,以突出我的問題。在任何人提及之前 – 我想避免使用插件,因為對我來説,我認為是一個簡單的問題是過分的。
我想要的:3 角色 – 管理員,較小的管理員,用户
我最初嘗試的是:我刪除了兩個角色 Author& 貢獻者,離開管理員,編輯和訂閲者。這沒有問題。我有下一個問題 – 重命名剩下的角色。
我本來只是做了最常見的建議
global $wp_roles;
$wp_roles->roles['editor']['name'] = 'Lesser Admin';
$wp_roles->role_names['editor'] = 'Lesser Admin';
對於最後兩個角色 (我保持管理相同,因為它足夠近) 。但這沒有辦法。不管我附加了什麼鈎子 (我把它放在 add_action('init',...)下,但沒有工作。
所以我試圖想起來,寫了我自己的代碼來處理這個問題。
function permissionsModification(){
$blogs = wp_get_sites();
$current_blog = get_current_blog_id();
foreach($blogs as $blog):
switch_to_blog($blog['blog_id']);
if(get_role('author') !== null)
remove_role('author');
if(get_role('contributor') !== null)
remove_role('contributor');
$toChange = array(
'editor' => array('lesser', 'Lesser Admin'),
'subscriber' => array('user', 'User')
);
foreach($toChange as $old => $new):
$role = get_role($old);
if($role !== null):
if(get_role($new[0]) === null)
add_role($new[0], $new[1], $role->capabilities);
$users = get_users(array('role'=>$old));
foreach($users as $user):
$user->remove_role($old);
$user->add_role($new[0]);
endforeach;
$opt = get_option('default_role');
if($opt === $old)
set_option('default_role', 'administrator');
remove_role($old);
endif;
endforeach;
endforeach;
switch_to_blog($current_blog);
}
add_action('init','permissionsModification');
好消息:它確實成功地重命名了角色,老角色已經消失了。
壞消息:發生了一個非常奇怪的錯誤。我在 Capabilities.php 到處都有 「Undefined Index:Name」 錯誤。我搜索數據庫 (有 phpMyAdmin 訪問),並發現在其中一個站點 – 訂户角色仍然存在!我認為這可能與默認角色有關,因此,由於註冊被禁止,我將其設置為管理員進行測試,但仍然沒有骰子 (儘管它確實將其設置為默認角色) 。
查看網絡管理員用户面板顯示一個”empty” 空間,角色應該在哪裏,如果您檢查該元素,則該值具有值訂閲者。所以我很確定用户角色的名字被刪除,這是錯誤來自哪裏。
現在,有趣的部分 – 我隨身穿過這個代碼,print_r 隨處可見,用户角色確實被刪除了。但是我不知道它是如何被添加回來的。我不知道這是否與這個多站點 wordpress 的事實有關,因為用户角色只存在於一個表中。但是我仍然有點迷失如何解決它。
任何意見將不勝感激。
最佳解決方案
所以,感謝凱撒,我得到了解。我不得不做兩件事來做這個工作。
首先,我注意到禁用 WP 用户頭像插件導致錯誤消失。我看到並意識到已經檢查了一個設置,「允許訂閲者和貢獻者編輯他們的化身」 。取消選中並保存每個站點,使錯誤消失。
我必須做的另一件事是,改變不會傳遞到其他網站 (即使錯誤消失),所以我將整個功能從主題轉移到 mu-plugins 文件夾中的插件。這使得它一直運行 (對於每個站點),所以所有的更改都是無錯誤地發生。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。