/** * 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); }
/** * 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); } } }