問題描述

我正在嘗試實現一個相對直觀的想法,基本上我正在構建一個訪問控制插件來控制自定義帖子類型 (在這種情況下是’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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。