/**
 * Filter `edit_user` capability and allow if user is parent
 *
 * @since 0.1.0
 *
 * @param  array   $caps
 * @param  string  $cap
 * @param  int     $user_id
 * @param  array   $args
 */
function wp_user_parents_map_meta_cap($caps = array(), $cap = '', $user_id = 0, $args = array())
{
    // Copy the caps array so a pristene one can be passed below
    $new_caps = $caps;
    // Modify core caps, and check for newly mapped ones
    switch ($cap) {
        // Parent management
        case 'edit_user':
            // Break if editing self
            if ($user_id === $args[0]) {
                break;
            }
            // Grant cap if parent
            if (wp_is_user_parent_of_user($args[0], $user_id)) {
                $new_caps = array('read');
            }
            break;
            // Have
        // Have
        case 'have_user_parents':
        case 'have_user_children':
            $new_caps = array('exist');
            break;
            // View
        // View
        case 'view_user_parents':
        case 'view_user_children':
            $new_caps = array('exist');
            break;
            // Edit
        // Edit
        case 'edit_user_parents':
        case 'edit_user_children':
            $new_caps = array($cap);
            break;
    }
    // Return possibly modified capabilities array
    return apply_filters('wp_user_parents_map_meta_cap', $new_caps, $caps, $cap, $user_id, $args);
}
Example #2
0
/**
 * Update user parents
 *
 * @since 0.1.0
 */
function wp_user_parents_save_meta_data($user_id = 0)
{
    // Bail if no page
    if (empty($_GET['page'])) {
        return;
    }
    // Bail if not saving the 'account' section
    if (sanitize_key($_GET['page']) !== 'account') {
        return;
    }
    /** Parents ***************************************************************/
    // Attempt to save parents
    $posted_parent_ids = !empty($_POST['wp_user_parents']) ? wp_parse_id_list($_POST['wp_user_parents']) : array();
    // Delete user parents
    delete_user_meta($user_id, 'user_parent');
    // Add user metas
    foreach ($posted_parent_ids as $id) {
        if (!wp_is_user_parent_of_user($id, $user_id)) {
            add_user_meta($user_id, 'user_parent', $id, false);
        }
    }
    /** Children **************************************************************/
    // Attempt to save parents
    $posted_children_ids = !empty($_POST['wp_user_children']) ? wp_parse_id_list($_POST['wp_user_children']) : array();
    // Get parent user IDs
    $children_ids = wp_get_user_children($user_id);
    foreach ($children_ids as $child_id) {
        delete_user_meta($child_id, 'user_parent', $user_id);
    }
    // Add user metas
    foreach ($posted_children_ids as $id) {
        if (!wp_is_user_child_of_user($user_id, $id)) {
            add_user_meta($id, 'user_parent', $user_id, false);
        }
    }
}