/**
 * Remove capabilities from an existing role
 *
 * Usage: wpcom_vip_remove_role_caps( 'author', array( 'publish_posts' ) );
 *
 * @param string $role Role name
 * @param array $caps Capabilities to remove from the role
 */
function wpcom_vip_remove_role_caps($role, $caps)
{
    $filtered_caps = array();
    foreach ((array) $caps as $cap) {
        $filtered_caps[$cap] = false;
    }
    wpcom_vip_merge_role_caps($role, $filtered_caps);
}
/**
 * Add new or change existing capabilities for a given role
 *
 * Usage: merge_role_caps( 'author', array( 'publish_posts' => false ) );
 *
 * @param string $role Role name
 * @param array $caps Key/value array of capabilities for this role
 */
function merge_role_caps($role, $caps)
{
    if (function_exists('wpcom_vip_merge_role_caps')) {
        wpcom_vip_merge_role_caps($role, $caps);
    } else {
        global $wp_user_roles;
        $role_obj = get_role($role);
        if (!$role_obj) {
            return;
        }
        $current_caps = (array) get_role_caps($role);
        $new_caps = array_merge($current_caps, (array) $caps);
        foreach ($new_caps as $cap => $role_can) {
            if ($role_can) {
                $role_obj->add_cap($cap);
            } else {
                $role_obj->remove_cap($cap);
            }
        }
        if (isset($wp_user_roles[$role])) {
            $wp_user_roles[$role]['capabilities'] = array_merge($current_caps, (array) $caps);
        }
    }
}