it-swarm.com.de

Lassen Sie die neue Benutzerrolle auf 'edit_others_posts' einer anderen Benutzerrolle und nicht auf einen eigenen Typ

In meinem System mache ich zwei neue Rollen:

  • Drittanbieter (TP) (geringere Berechtigungen)
  • Dateneingabeoperator (DEO) (mächtig gegenüber Drittanbietern - aber nicht seiner eigenen Gruppe)

Der CPT-Parameter "Capabilities" wird mithilfe von 'map_meta_cap' => true wie folgt überarbeitet:

...
'capabilities' => array ( 'read' => 'read_cpt', 'edit_posts' => 'edit_cpt' ),
'map_meta_cap' => true
...

Szenario ist: TP kann ihren Inhalt frei hinzufügen, aber nicht veröffentlichen. DEOs können ihren Inhalt auch frei hinzufügen, und zusätzlich können DEOs den Inhalt von TP bearbeiten/modifizieren und schließlich veröffentlichen. Aber sie (DEOs) können die Beiträge ihrer eigenen Rolle nicht berühren. Angenommen, 'X als DEO' hat einen Artikel hinzugefügt, 'Y als DEO' kann ihn nicht berühren. X und Y können jedoch Beiträge von "Z als TP" einzeln berühren.

Beim Hinzufügen einer neuen Rolle mache ich Folgendes:

$tp = add_role(
       'third_party',
       __('Third Party'),
       array(
           'read_cpt' => true,
           'edit_cpt' => true,
           //'edit_others_cpt => false //by default not assigned
       )
);

$deo = add_role(
       'data_entry_operator',
       __('Data Entry Operator'),
       array(
           'read_cpt' => true,
           'edit_cpt' => true,
           'edit_others_cpt => true
       )
);

Sie wissen, dass edit_others_cpt darauf zugreift, um die Posts von TP zu bearbeiten, aber sie nicht darauf beschränkt, Posts ihrer eigenen Benutzerrolle (DEO) zu bearbeiten.

Wie kann ich DEO 'edit_others_posts' nur von TP rollen lassen, nicht von DEO?

2
Mayeenul Islam

Fügen Sie zunächst den Rollen wie folgt Funktionen hinzu

add_action( 'after_setup_theme', 'add_caps_to_custom_roles' );
function add_caps_to_custom_roles() {
  $caps = array(
    'read_cpt',
    'edit_cpt',
    'edit_others_cpt',
  );
  $roles = array(
    get_role( 'third_party' ),
    get_role( 'data_entry_operator' ),
  );
  foreach ($roles as $role) {
    foreach ($caps as $cap) {
      $role->add_cap( $cap );
    }
  }
}

DANN

/**
 * Helper function getting roles that the user is allowed to create/edit/delete 'TP' post.
 *
 * @param   WP_User $user
 * @return  array
 */
function allowed_roles_to_edit_TP_post( $user ) {
    $allowed = array();

    if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles post
        $allowed = array_keys( $GLOBALS['wp_roles']->roles );
    } else ( in_array( 'data_entry_operator', $user->roles ) ) {                
        $allowed[] = 'third_party';
    }

    return $allowed;
}

/**
 * Remove roles that are not allowed for the current user role.
 */
function editable_roles( $roles ) {
    if ( $user = wp_get_current_user() ) {
        $allowed = allowed_roles_to_edit_TP_post( $user );

        foreach ( $roles as $role => $caps ) {
            if ( ! in_array( $role, $allowed ) )
                unset( $roles[ $role ] );
        }
    }

    return $roles;
}
add_filter( 'editable_roles', 'editable_roles' );

/**
 * Prevent users deleting/editing users with a role outside their allowance.
 */
function controll_map_meta_cap( $caps, $cap, $user_ID, $args ) {
    if ( ( $cap === 'read_cpt' || $cap === 'edit_cpt' || $cap === 'edit_others_cpt' ) && $args ) {
        $the_user = get_userdata( $user_ID ); // The user performing the task
        $user     = get_userdata( $args[0] ); // The user being edited/deleted

        if ( $the_user && $user ) {
            $allowed = allowed_roles_to_edit_TP_post( $the_user );

            if ( array_diff( $user->roles, $allowed ) ) {
                // Target user has roles outside of our limits
                $caps[] = 'not_allowed';
            }
        }
    }

    return $caps;
}
add_filter( 'map_meta_cap', 'controll_map_meta_cap', 10, 4 );
1
Riffaz Starr