web-dev-qa-db-ja.com

特定のユーザーに特定のページ/投稿/カスタム投稿タイプを編集する機能を割り当てる方法

私は比較的単純明快なアイデアのように思えるものを実装しようとしています、基本的に私はカスタム投稿タイプ(この場合は 'プロジェクト')の表示と編集を制御するアクセス制御プラグインを構築しています。

それが機能するように私が意図しているのは、特定の 'プロジェクト'に対して読み取り専用または読み取り/書き込みアクセス権を持っている複数のユーザーがいるということです。

システムには複数のプロジェクトがあり、読み取りアクセスは、サイトのユーザープロファイル設定内の特定のプロジェクトのチェックボックスを有効にすることによって制御されます(下記参照)。

Additional edit options added to User Options

そのため、このインターフェースを介してこれらのプロジェクトへのアクセス権を割り当て、実際の「プロジェクト」ページのコードでは、プロジェクトのIDがチェックされたプロジェクトのIDのいずれとも一致しない場合、コンテンツの表示を制限します。

これで問題はありませんが、編集機能も許可する必要があります。だから私はユーザーが特定のページを読むだけでなくその特定のページを編集できるようにすることができます。私が抱えている問題は、基本的にはすべてのユーザーに同じ役割(基本的には単に購読者役割)を持たせたいだけなので、後に続くことが通常の役割と機能には収まらないようです。しかし、私は特定のページの特定のユーザーに編集機能を追加したいのですが、ロールは一般に「タイプ」のユーザーに機能を追加することを目的としています。

うまく行けば、ここで何をしようとしているのか説明できたのですが、そのための正しいコード/関数を見つけるのに苦労しています。ページなどですが、この場合は明らかに私が構築しているのはプラグインそのものなので、プラグインに頼らないでください。

更新日:私はこれを解決しようとさらに努力してきましたが、今のところまだ特定の各ページのカスタムロール/機能を作成することに頼らずに特定の投稿/ページなどへのアクセスを有効にする方法を見ることができません。少しやり過ぎで、それがうまくいくかどうかさえ私はわかりません。

更新2:うまくいけば誰かを刺激するために今私はこの質問に賞金を追加しました! ;)私はこれをさらに調べましたが、私が必要とするものが可能であるように思われる他のプラグインを見つけたにもかかわらず(私が必要としない他の機能の負荷と共に!)特定の投稿タイプの特定のインスタンスを特定のユーザーに制限するために必要なコード。

10月31日の更新:@alexeyが投稿したコードのおかげで、何かを実行することができました。 IDのリストが2つあります。そのうちの1つは読み取りアクセスを制御し、もう1つは編集アクセスを制御します。私はcurrent_user_can('read_projects')を使用してページコンテンツの表示を制限していますが、実際にコンテンツが制限されるまでに2ページの読み込みが必要になるという問題があります。初めてページをクリックしたときにコンテンツが表示されますが、そのページをリロードするとコンテンツが正しく非表示になります。 user_has_capがトリガーされるタイミングと関係があるようですが、ページコンテンツがレンダリングされる前にトリガーされるべきであると言うことができる限り、私は何も追跡できないようです。これがうまくいかないという単純な理由がないのであれば、この更新ではこれ以上コードを追加しません。その場合は、この質問を続けるよりも新しい質問を投稿したほうがよいでしょう。

6
Rick Curran

私は別の方法を提案することができます。

まず第一に、プロジェクトへのフルアクセスの投稿タイプを許可します( )。

ユーザープロファイルで許可された投稿の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 );
4
Alexey