問題描述
我正在嘗試實現一個相對直觀的想法,基本上我正在構建一個訪問控制外掛來控制自定義帖子型別 (在這種情況下是’Projects’) 的檢視和編輯。
我打算如何工作是有多個使用者可以訪問或訪問特定’Projects’ 的 read-only 。
系統中有多個專案,並且透過在站點上的使用者配置檔案設定中啟用特定專案的核取方塊來控制讀取訪問許可權 (如下所示):
因此,您可以透過此介面分配對這些專案的訪問許可權,如果專案的 ID 與所選專案的任何 ID 不匹配,則實際 「專案」 頁面上的程式碼將限制內容的檢視。
這一切都正常,但是,我也需要以同樣的方式允許編輯功能。所以我可以讓使用者閱讀特定頁面,但也可以編輯該特定的頁面。我所遇到的問題是,我之後似乎並不適合常規角色和功能,因為我只是希望所有使用者擁有相同的角色 (基本上只是訂閱者角色) 。但是,我想為特定頁面的特定使用者新增編輯功能,而角色通常是將功能新增到使用者的’type’ 。
希望我已經設法解釋了我在這裡的嘗試,我正在努力尋找正確的程式碼/功能,儘管我確信這是可能的,因為有外掛可以使訪問具體頁面等,但顯然在這種情況下,我不想依賴一個外掛,因為我正在構建一個外掛本身!
更新:我堅持進一步嘗試解決這個問題,但到目前為止,我仍然看不到如何啟用訪問特定的帖子/頁面等,而無需為每個特定頁面建立 custom-role /功能,但這似乎有點過度我甚至不確定會奏效。
更新 2:我現在已經在這個問題上新增了一個賞金,希望可以啟發一個人! ;) 我已經進一步看這個,但即使我發現其他似乎能夠滿足我所需要的外掛 (以及其他不需要的其他功能的載入),我還沒有設法弄清楚需要什麼程式碼來將特定使用者的釋出型別的例項限制為特定使用者。
更新 10 月 31 日:由於 @alexey 釋出的程式碼,我已經能夠得到一些執行。我現在有兩個 ID 列表,其中一個控制 Read 訪問,另一個用於編輯訪問。我使用 current_user_can('read_projects')來限制頁面內容的檢視,但是我有一個問題需要兩頁的載入才能實際限制內容。我第一次點選內容顯示的頁面,但是如果我重新載入頁面,那麼內容被隱藏正確。這似乎是與 user_has_cap 被觸發的時機有關,但我似乎無法跟蹤任何事情,只要我能告訴這個應該在頁面內容呈現之前被觸發。我不會在這個更新中釋出任何進一步的程式碼,好像沒有簡單的理由為什麼這不工作,那麼我會更好地釋出一個新的問題,而不是繼續這個。
最佳解決方案
我可以建議另一種方法。
首先:授予完全訪問專案的帖子型別 (Example) 。
在使用者配置檔案中新增允許的帖子 ID 。
然後使用下面的過濾器來限制訪問,如果不允許釋出 ID 。
function allow_user_to_edit_cpt_filter( $capauser, $capask, $param){
global $wpdb;
$allowed_posts_id_for_current_user = array( '29', '30' ); // you need to get these ids yourself
$post = get_post( $param[2] );
// If current post isn't allowed then delete edit and delete capabilities
if( !in_array( $post->ID, $allowed_post_type_ids ) ){
if( ( $param[0] == "edit_projects") || ( $param[0] == "delete_projects" ) ) { // Change to yours capabilities
foreach( (array) $capask as $capasuppr) {
if ( array_key_exists($capasuppr, $capauser) ) {
$capauser[$capasuppr] = 0;
}
}
}
}
return $capauser;
}
add_filter('user_has_cap', 'allow_user_to_edit_cpt_filter', 100, 3 );
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。
