/** * Output the profile component slug. * * @since 2.4.0 * * @uses bp_get_profile_slug() */ function bp_profile_slug() { echo bp_get_profile_slug(); }
/** * Set up fall-back component navigation if XProfile is inactive. * * @since 1.5.0 * * @see BP_Component::setup_nav() for a description of arguments. * * @param array $main_nav Optional. See BP_Component::setup_nav() for * description. * @param array $sub_nav Optional. See BP_Component::setup_nav() for * description. */ public function setup_nav($main_nav = array(), $sub_nav = array()) { // Bail if XProfile component is active. if (bp_is_active('xprofile')) { return; } // Don't set up navigation if there's no member. if (!is_user_logged_in() && !bp_is_user()) { return; } // Determine user to use. if (bp_displayed_user_domain()) { $user_domain = bp_displayed_user_domain(); } elseif (bp_loggedin_user_domain()) { $user_domain = bp_loggedin_user_domain(); } else { return; } $slug = bp_get_profile_slug(); $profile_link = trailingslashit($user_domain . $slug); // Setup the main navigation. $main_nav = array('name' => _x('Profile', 'Member profile main navigation', 'buddypress'), 'slug' => $slug, 'position' => 20, 'screen_function' => 'bp_members_screen_display_profile', 'default_subnav_slug' => 'public', 'item_css_id' => buddypress()->profile->id); // Setup the subnav items for the member profile. $sub_nav[] = array('name' => _x('View', 'Member profile view', 'buddypress'), 'slug' => 'public', 'parent_url' => $profile_link, 'parent_slug' => $slug, 'screen_function' => 'bp_members_screen_display_profile', 'position' => 10); parent::setup_nav($main_nav, $sub_nav); }
/** * Set up the Toolbar */ public function setup_admin_bar($wp_admin_nav = array()) { // Menus for logged in user if (is_user_logged_in()) { // Profile link $profile_link = trailingslashit(bp_loggedin_user_domain() . bp_get_profile_slug()); // Add the "Profile" sub menu $wp_admin_nav[] = array('parent' => buddypress()->my_account_menu_id, 'id' => 'my-account-' . $this->id, 'title' => _x('Profile', 'My Account Profile', 'buddypress'), 'href' => $profile_link); // View Profile $wp_admin_nav[] = array('parent' => 'my-account-' . $this->id, 'id' => 'my-account-' . $this->id . '-public', 'title' => _x('View', 'My Account Profile sub nav', 'buddypress'), 'href' => $profile_link); // Edit Profile $wp_admin_nav[] = array('parent' => 'my-account-' . $this->id, 'id' => 'my-account-' . $this->id . '-edit', 'title' => _x('Edit', 'My Account Profile sub nav', 'buddypress'), 'href' => trailingslashit($profile_link . 'edit')); // Edit Avatar if (buddypress()->avatar->show_avatars) { $wp_admin_nav[] = array('parent' => 'my-account-' . $this->id, 'id' => 'my-account-' . $this->id . '-change-avatar', 'title' => _x('Change Profile Photo', 'My Account Profile sub nav', 'buddypress'), 'href' => trailingslashit($profile_link . 'change-avatar')); } } parent::setup_admin_bar($wp_admin_nav); }
/** * Add an activity item when a user has updated his profile. * * @since 2.0.0 * * @param int $user_id ID of the user who has updated his profile. * @param array $field_ids IDs of the fields submitted. * @param bool $errors True if validation or saving errors occurred, otherwise false. * @param array $old_values Pre-save xprofile field values and visibility levels. * @param array $new_values Post-save xprofile field values and visibility levels. * * @return bool True on success, false on failure. */ function bp_xprofile_updated_profile_activity($user_id, $field_ids = array(), $errors = false, $old_values = array(), $new_values = array()) { // If there were errors, don't post. if (!empty($errors)) { return false; } // Bail if activity component is not active. if (!bp_is_active('activity')) { return false; } // Don't post if there have been no changes, or if the changes are // related solely to non-public fields. $public_changes = false; foreach ($new_values as $field_id => $new_value) { $old_value = isset($old_values[$field_id]) ? $old_values[$field_id] : ''; // Don't register changes to private fields. if (empty($new_value['visibility']) || 'public' !== $new_value['visibility']) { continue; } // Don't register if there have been no changes. if ($new_value === $old_value) { continue; } // Looks like we have public changes - no need to keep checking. $public_changes = true; break; } // Bail if no public changes. if (empty($public_changes)) { return false; } // Throttle to one activity of this type per 2 hours. $existing = bp_activity_get(array('max' => 1, 'filter' => array('user_id' => $user_id, 'object' => buddypress()->profile->id, 'action' => 'updated_profile'))); // Default throttle time is 2 hours. Filter to change (in seconds). if (!empty($existing['activities'])) { /** * Filters the throttle time, in seconds, used to prevent excessive activity posting. * * @since 2.0.0 * * @param int $value Throttle time, in seconds. */ $throttle_period = apply_filters('bp_xprofile_updated_profile_activity_throttle_time', HOUR_IN_SECONDS * 2); $then = strtotime($existing['activities'][0]->date_recorded); $now = strtotime(bp_core_current_time()); // Bail if throttled. if ($now - $then < $throttle_period) { return false; } } // If we've reached this point, assemble and post the activity item. $profile_link = trailingslashit(bp_core_get_user_domain($user_id) . bp_get_profile_slug()); return (bool) xprofile_record_activity(array('user_id' => $user_id, 'primary_link' => $profile_link, 'component' => buddypress()->profile->id, 'type' => 'updated_profile')); }
/** * @group activity_action * @group bp_xprofile_format_activity_action_updated_profile */ public function test_bp_xprofile_format_activity_action_updated_profile() { $u = $this->factory->user->create(); $a = $this->factory->activity->create(array('component' => buddypress()->profile->id, 'type' => 'updated_profile', 'user_id' => $u)); $expected = sprintf(__('%s’s profile was updated', 'buddypress'), '<a href="' . bp_core_get_user_domain($u) . bp_get_profile_slug() . '/">' . bp_core_get_user_displayname($u) . '</a>'); $a_obj = new BP_Activity_Activity($a); $this->assertSame($expected, $a_obj->action); }
/** * Render an edit profile button. * * @since 1.0.0 */ function bp_edit_profile_button() { bp_button(array('id' => 'edit_profile', 'component' => 'xprofile', 'must_be_logged_in' => true, 'block_self' => true, 'link_href' => trailingslashit(bp_displayed_user_domain() . bp_get_profile_slug() . '/edit'), 'link_class' => 'edit', 'link_text' => __('Edit Profile', 'buddypress'))); }
/** * Handles the display of the profile edit page by loading the correct template file. * Also checks to make sure this can only be accessed for the logged in users profile. * * @package BuddyPress XProfile * @uses bp_is_my_profile() Checks to make sure the current user being viewed equals the logged in user * @uses bp_core_load_template() Looks for and loads a template file within the current member theme (folder/filename) */ function xprofile_screen_edit_profile() { if (!bp_is_my_profile() && !bp_current_user_can('bp_moderate')) { return false; } // Make sure a group is set. if (!bp_action_variable(1)) { bp_core_redirect(trailingslashit(bp_displayed_user_domain() . bp_get_profile_slug() . '/edit/group/1')); } // Check the field group exists if (!bp_is_action_variable('group') || !xprofile_get_field_group(bp_action_variable(1))) { bp_do_404(); return; } // No errors $errors = false; // Check to see if any new information has been submitted if (isset($_POST['field_ids'])) { // Check the nonce check_admin_referer('bp_xprofile_edit'); // Check we have field ID's if (empty($_POST['field_ids'])) { bp_core_redirect(trailingslashit(bp_displayed_user_domain() . bp_get_profile_slug() . '/edit/group/' . bp_action_variable(1))); } // Explode the posted field IDs into an array so we know which // fields have been submitted $posted_field_ids = wp_parse_id_list($_POST['field_ids']); $is_required = array(); // Loop through the posted fields formatting any datebox values // then validate the field foreach ((array) $posted_field_ids as $field_id) { if (!isset($_POST['field_' . $field_id])) { if (!empty($_POST['field_' . $field_id . '_day']) && !empty($_POST['field_' . $field_id . '_month']) && !empty($_POST['field_' . $field_id . '_year'])) { // Concatenate the values $date_value = $_POST['field_' . $field_id . '_day'] . ' ' . $_POST['field_' . $field_id . '_month'] . ' ' . $_POST['field_' . $field_id . '_year']; // Turn the concatenated value into a timestamp $_POST['field_' . $field_id] = date('Y-m-d H:i:s', strtotime($date_value)); } } $is_required[$field_id] = xprofile_check_is_required_field($field_id); if ($is_required[$field_id] && empty($_POST['field_' . $field_id])) { $errors = true; } } // There are errors if (!empty($errors)) { bp_core_add_message(__('Please make sure you fill in all required fields in this profile field group before saving.', 'buddypress'), 'error'); // No errors } else { // Reset the errors var $errors = false; // Now we've checked for required fields, lets save the values. $old_values = $new_values = array(); foreach ((array) $posted_field_ids as $field_id) { // Certain types of fields (checkboxes, multiselects) may come through empty. Save them as an empty array so that they don't get overwritten by the default on the next edit. $value = isset($_POST['field_' . $field_id]) ? $_POST['field_' . $field_id] : ''; $visibility_level = !empty($_POST['field_' . $field_id . '_visibility']) ? $_POST['field_' . $field_id . '_visibility'] : 'public'; // Save the old and new values. They will be // passed to the filter and used to determine // whether an activity item should be posted $old_values[$field_id] = array('value' => xprofile_get_field_data($field_id, bp_displayed_user_id()), 'visibility' => xprofile_get_field_visibility_level($field_id, bp_displayed_user_id())); // Update the field data and visibility level xprofile_set_field_visibility_level($field_id, bp_displayed_user_id(), $visibility_level); $field_updated = xprofile_set_field_data($field_id, bp_displayed_user_id(), $value, $is_required[$field_id]); $value = xprofile_get_field_data($field_id, bp_displayed_user_id()); $new_values[$field_id] = array('value' => $value, 'visibility' => xprofile_get_field_visibility_level($field_id, bp_displayed_user_id())); if (!$field_updated) { $errors = true; } else { /** * Fires on each iteration of an XProfile field being saved with no error. * * @since BuddyPress (1.1.0) * * @param int $field_id ID of the field that was saved. * @param string $value Value that was saved to the field. */ do_action('xprofile_profile_field_data_updated', $field_id, $value); } } /** * Fires after all XProfile fields have been saved for the current profile. * * @since BuddyPress (1.0.0) * * @param int $value Displayed user ID. * @param array $posted_field_ids Array of field IDs that were edited. * @param bool $errors Whether or not any errors occurred. * @param array $old_values Array of original values before updated. * @param array $new_values Array of newly saved values after update. */ do_action('xprofile_updated_profile', bp_displayed_user_id(), $posted_field_ids, $errors, $old_values, $new_values); // Set the feedback messages if (!empty($errors)) { bp_core_add_message(__('There was a problem updating some of your profile information. Please try again.', 'buddypress'), 'error'); } else { bp_core_add_message(__('Changes saved.', 'buddypress')); } // Redirect back to the edit screen to display the updates and message bp_core_redirect(trailingslashit(bp_displayed_user_domain() . bp_get_profile_slug() . '/edit/group/' . bp_action_variable(1))); } } /** * Fires right before the loading of the XProfile edit screen template file. * * @since BuddyPress (1.0.0) */ do_action('xprofile_screen_edit_profile'); /** * Filters the template to load for the XProfile edit screen. * * @since BuddyPress (1.0.0) * * @param string $template Path to the XProfile edit template to load. */ bp_core_load_template(apply_filters('xprofile_template_edit_profile', 'members/single/home')); }
function amt_bp_get_profile_slug() { if (function_exists('bp_get_profile_slug')) { return bp_get_profile_slug(); } return 'profile'; }
/** * Set up fall-back component navigation if XProfile is inactive. * * @since 1.5.0 * * @see BP_Component::setup_nav() for a description of arguments. * * @param array $main_nav Optional. See BP_Component::setup_nav() for * description. * @param array $sub_nav Optional. See BP_Component::setup_nav() for * description. */ public function setup_nav($main_nav = array(), $sub_nav = array()) { // Don't set up navigation if there's no member. if (!is_user_logged_in() && !bp_is_user()) { return; } $is_xprofile_active = bp_is_active('xprofile'); // Bail if XProfile component is active and there's no custom front page for the user. if (!bp_displayed_user_has_front_template() && $is_xprofile_active) { return; } // Determine user to use. if (bp_displayed_user_domain()) { $user_domain = bp_displayed_user_domain(); } elseif (bp_loggedin_user_domain()) { $user_domain = bp_loggedin_user_domain(); } else { return; } // Set slug to profile in case the xProfile component is not active $slug = bp_get_profile_slug(); // Defaults to empty navs $this->main_nav = array(); $this->sub_nav = array(); if (!$is_xprofile_active) { $this->main_nav = array('name' => _x('Profile', 'Member profile main navigation', 'buddypress'), 'slug' => $slug, 'position' => 20, 'screen_function' => 'bp_members_screen_display_profile', 'default_subnav_slug' => 'public', 'item_css_id' => buddypress()->profile->id); } /** * Setup the subnav items for the member profile. * * This is required in case there's a custom front or in case the xprofile component * is not active. */ $this->sub_nav = array('name' => _x('View', 'Member profile view', 'buddypress'), 'slug' => 'public', 'parent_url' => trailingslashit($user_domain . $slug), 'parent_slug' => $slug, 'screen_function' => 'bp_members_screen_display_profile', 'position' => 10); /** * If there's a front template the members component nav * will be there to display the user's front page. */ if (bp_displayed_user_has_front_template()) { $main_nav = array('name' => _x('Home', 'Member Home page', 'buddypress'), 'slug' => 'front', 'position' => 5, 'screen_function' => 'bp_members_screen_display_profile', 'default_subnav_slug' => 'public'); // We need a dummy subnav for the front page to load. $front_subnav = $this->sub_nav; $front_subnav['parent_slug'] = 'front'; // In case the subnav is displayed in the front template $front_subnav['parent_url'] = trailingslashit($user_domain . 'front'); // Set the subnav $sub_nav[] = $front_subnav; /** * If the profile component is not active, we need to create a new * nav to display the WordPress profile. */ if (!$is_xprofile_active) { add_action('bp_members_setup_nav', array($this, 'setup_profile_nav')); } /** * If there's no front template and xProfile is not active, the members * component nav will be there to display the WordPress profile */ } else { $main_nav = $this->main_nav; $sub_nav[] = $this->sub_nav; } parent::setup_nav($main_nav, $sub_nav); }
/** * Filter the user profile URL to point to BuddyPress profile edit. * * @since 1.6.0 * * @param string $url WP profile edit URL. * @param int $user_id ID of the user. * @param string $scheme * * @return string */ function bp_members_edit_profile_url($url, $user_id, $scheme = 'admin') { // If xprofile is active, use profile domain link if (!is_admin() && bp_is_active('xprofile')) { $profile_link = trailingslashit(bp_core_get_user_domain($user_id) . bp_get_profile_slug() . '/edit'); // Default to $url } else { $profile_link = $url; } /** * Filters the user profile URL to point to BuddyPress profile edit. * * @since 1.5.2 * * @param string $url WP profile edit URL. * @param int $user_id ID of the user. * @param string $scheme Scheme to use. */ return apply_filters('bp_members_edit_profile_url', $profile_link, $url, $user_id, $scheme); }
function test_member_profile_change_avatar() { $this->go_to(bp_core_get_user_domain(bp_loggedin_user_id()) . bp_get_profile_slug() . '/change-avatar'); $this->assertTrue(bp_is_user_change_avatar()); }