Source: templates/profile.php

<?php
/**
 * Template for the profile page
 *
 * This template can be overridden by copying it to your-theme/ultimate-member/templates/profile.php
 *
 * Page: "Profile"
 *
 * @version 2.10.0
 *
 * @var string $mode
 * @var int    $form_id
 * @var array  $args
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}
$description_key = UM()->profile()->get_show_bio_key( $args );
?>
<div class="um <?php echo esc_attr( $this->get_class( $mode ) ); ?> um-<?php echo esc_attr( $form_id ); ?> um-role-<?php echo esc_attr( um_user( 'role' ) ); ?>">
	<div class="um-form" data-mode="<?php echo esc_attr( $mode ); ?>" data-form_id="<?php echo esc_attr( $form_id ); ?>">
		<?php
		/**
		 * Fires before User Profile header.
		 * It's the first hook at User Profile wrapper.
		 *
		 * Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
		 * 10 - `um_profile_completeness_show_notice()` displays Profile Completeness notices.
		 *
		 * @param {array} $args User Profile data.
		 *
		 * @since 1.3.x
		 * @hook  um_profile_before_header
		 *
		 * @example <caption>Display some content before User Profile.</caption>
		 * function my_um_profile_before_header( $args ) {
		 *     // your code here
		 *     echo $notice;
		 * }
		 * add_action( 'um_profile_before_header', 'my_um_profile_before_header' );
		 */
		do_action( 'um_profile_before_header', $args );

		if ( um_is_on_edit_profile() ) {
			?>
			<form method="post" action="" data-description_key="<?php echo esc_attr( $description_key ); ?>">
			<?php
		}
		/**
		 * Fires for displaying User Profile cover area.
		 *
		 * Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
		 * 9 - `um_profile_header_cover_area()` displays User Profile cover photo.
		 *
		 * @param {array} $args User Profile data.
		 *
		 * @since 1.3.x
		 * @hook  um_profile_header_cover_area
		 *
		 * @example <caption>Display some content before or after User Profile cover.</caption>
		 * function my_um_profile_header_cover_area( $args ) {
		 *     // your code here
		 *     echo $content;
		 * }
		 * add_action( 'um_profile_header_cover_area', 'my_um_profile_header_cover_area' );
		 */
		do_action( 'um_profile_header_cover_area', $args );
		/**
		 * Fires for displaying User Profile header.
		 *
		 * Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
		 * 9 - `um_profile_header()` displays User Profile header.
		 *
		 * @param {array} $args User Profile data.
		 *
		 * @since 1.3.x
		 * @hook  um_profile_header
		 *
		 * @example <caption>Display some content before or after User Profile header.</caption>
		 * function my_um_profile_header( $args ) {
		 *     // your code here
		 *     echo $content;
		 * }
		 * add_action( 'um_profile_header', 'my_um_profile_header' );
		 */
		do_action( 'um_profile_header', $args );
		/**
		 * Filters classes of the User Profile navigation bar.
		 *
		 * Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
		 * 10 - `um_followers_profile_navbar_classes()` from Followers extension class.
		 * 10 - `profile_navbar_classes()` from Messaging extension class.
		 *
		 * @param {string} $classes User Profile navigation bar classes.
		 *
		 * @since 2.0
		 * @hook  um_profile_navbar_classes
		 *
		 * @return {string} User Profile navigation bar classes.
		 *
		 * @example <caption>Adds `my_custom_class` class to the navigation bar on the User Profile page.</caption>
		 * function my_um_profile_navbar_classes( $classes ) {
		 *     // your code here
		 *     $classes .= ' my_custom_class';
		 *     echo $classes;
		 * }
		 * add_filter( 'um_profile_navbar_classes', 'my_um_profile_navbar_classes' );
		 */
		$classes = apply_filters( 'um_profile_navbar_classes', '' );
		?>

		<div class="um-profile-navbar <?php echo esc_attr( $classes ); ?>">
			<?php
			/**
			 * Fires for displaying User Profile navigation bar.
			 *
			 * Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
			 * 4 - `um_followers_add_profile_bar()` displays Followers button.
			 * 5 - `add_profile_bar()` displays Messaging button.
			 *
			 * @param {array} $args User Profile data.
			 *
			 * @since 1.3.x
			 * @hook  um_profile_navbar
			 *
			 * @example <caption>Display some content before or after User Profile navigation bar.</caption>
			 * function my_um_profile_navbar( $args ) {
			 *     // your code here
			 *     echo $content;
			 * }
			 * add_action( 'um_profile_navbar', 'my_um_profile_navbar' );
			 */
			do_action( 'um_profile_navbar', $args );
			?>
			<div class="um-clear"></div>
		</div>

		<?php
		/**
		 * Fires for displaying User Profile menu.
		 *
		 * Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
		 * 9 - `um_profile_menu()` displays User Profile menu.
		 *
		 * @param {array} $args User Profile data.
		 *
		 * @since 2.0
		 * @hook  um_profile_menu
		 *
		 * @example <caption>Display some content before or after User Profile menu.</caption>
		 * function my_um_profile_menu( $args ) {
		 *     // your code here
		 *     echo $content;
		 * }
		 * add_action( 'um_profile_menu', 'my_um_profile_menu' );
		 */
		do_action( 'um_profile_menu', $args );

		if ( um_is_on_edit_profile() || UM()->user()->preview ) {
			$nav    = 'main';
			$subnav = UM()->profile()->active_subnav();
			$subnav = ! empty( $subnav ) ? $subnav : 'default';
			?>
			<div class="um-profile-body <?php echo esc_attr( $nav . ' ' . $nav . '-' . $subnav ); ?>">
				<?php
				/**
				 * Fires for adding content in User Profile nav menu content tab.
				 * $nav profile menu tab key.
				 *
				 * Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
				 * 10 - `um_profile_content_main()` displays `About` menu tab's content (v2).
				 * 10 - `UM()->frontend()->profile()->about()` displays `About` menu tab's content (v3).
				 * 10 - `um_profile_content_followers()` displays `Followers` menu tab's content.
				 * 10 - `um_profile_content_following()` displays `Following` menu tab's content.
				 * 10 - `um_profile_content_groups_list()` displays `User Groups List` menu tab's content.
				 * 10 - `profile_tab_content()` displays `My Jobs` menu tab's content.
				 * 10 - `profile_tab_dashboard_content()` displays `My Jobs Dashboard` menu tab's content.
				 * 10 - `content_messages()` displays `Messages` menu tab's content.
				 * 10 - `um_profile_content_private_content()` displays `Private Content` menu tab's content.
				 * 10 - `um_profile_content_{$tab['tabid']}` displays custom Profile Tabs content.
				 * 10 - `um_profile_content_reviews()` displays `Reviews` menu tab's content.
				 * 10 - `show_wall()` displays `Activity` menu tab's content.
				 *
				 * @param {array} $args User Profile data.
				 *
				 * @since 1.3.x
				 * @hook  um_profile_content_{$nav}
				 *
				 * @example <caption>Display some content in User Profile `main` nav content tab.</caption>
				 * function my_profile_content_main( $args ) {
				 *     // your code here
				 *     echo $content;
				 * }
				 * add_action( 'um_profile_content_main', 'my_profile_content_main' );
				 */
				do_action( "um_profile_content_$nav", $args );
				/**
				 * Fires for adding content in User Profile nav > subnav menu content tab.
				 * $nav profile menu tab key.
				 * $subnav profile sub-menu tab key.
				 *
				 * Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
				 * 10 - `um_bbpress_user_topics()` displays `Topics` submenu of bbPress tab's content.
				 * 10 - `um_bbpress_user_replies()` displays `Replies` submenu of bbPress tab's content.
				 * 10 - `um_bbpress_user_favorites()` displays `Favorites` submenu of bbPress tab's content.
				 * 10 - `um_bbpress_user_subscriptions()` displays `Subscriptions` submenu of bbPress tab's content.
				 * 10 - `profile_content_forums_topics()` displays `Topics` submenu of ForumWP tab's content.
				 * 10 - `profile_content_forums_replies()` displays `Replies` submenu of ForumWP tab's content.
				 * 10 - `profile_content_subscriptions()` displays `Subscriptions` submenu of ForumWP tab's content.
				 * 10 - `profile_content_bookmarks()` displays `Bookmarks` submenu of ForumWP tab's content.
				 * 10 - `profile_content_likes()` displays `Likes` submenu of ForumWP tab's content.
				 * 10 - `um_profile_content_friends_myfriends()` displays `My Friends` submenu of Friends tab's content.
				 * 10 - `um_profile_content_friends_friendreqs()` displays `Friends Requests` submenu of Friends tab's content.
				 * 10 - `um_profile_content_friends_sentreqs()` displays `Send Friends Requests` submenu of Friends tab's content.
				 * 10 - `um_profile_content_badges_my_badges()` displays `My badges` submenu of myCRED tab's content.
				 * 10 - `um_profile_content_badges_all_badges()` displays `All badges` submenu of myCRED tab's content.
				 * 10 - `get_bookmarks_content()` displays `All bookmarks with folders` submenu of User Bookmarks tab's content.
				 * 10 - `get_bookmarks_content_all()` displays `All bookmarks` submenu of User Bookmarks tab's content.
				 * 10 - `get_bookmarks_content_users()` displays `All bookmarked users` submenu of User Bookmarks tab's content.
				 * 10 - `user_notes_profile_tab()` displays `View Notes` submenu of User Notes tab's content.
				 * 10 - `get_add_note_form()` displays `Add Note` submenu of User Notes tab's content.
				 * 10 - `get_gallery_content()` displays `Albums` submenu of User Photos tab's content.
				 * 10 - `get_gallery_photos_content()` displays `Photos` submenu of User Photos tab's content.
				 * 10 - `um_profile_content_purchases()` displays `Purchases` submenu of Woocommerce tab's content.
				 * 10 - `um_profile_content_product_reviews()` displays `Product Reviews` submenu of Woocommerce tab's content.
				 *
				 * @param {array} $args User Profile data.
				 *
				 * @since 1.3.x
				 * @hook  um_profile_content_{$nav}_{$subnav}
				 *
				 * @example <caption>Display some content in User Profile `main` nav and `step2` subnav content tab.</caption>
				 * function my_profile_content_main_step2( $args ) {
				 *     // your code here
				 *     echo $content;
				 * }
				 * add_action( 'um_profile_content_main_step2', 'my_profile_content_main_step2' );
				 */
				do_action( "um_profile_content_{$nav}_$subnav", $args );
				?>
				<div class="clear"></div>
			</div>

			<?php if ( ! UM()->user()->preview ) { ?>

			</form>

				<?php
			}
		} else {
			$menu_enabled = UM()->options()->get( 'profile_menu' );
			$profile_tabs = UM()->profile()->tabs_active();

			$nav    = UM()->profile()->active_tab();
			$subnav = UM()->profile()->active_subnav();
			$subnav = ! empty( $subnav ) ? $subnav : 'default';

			if ( $menu_enabled || ! empty( $profile_tabs[ $nav ]['hidden'] ) ) {
				?>
				<div class="um-profile-body <?php echo esc_attr( $nav . ' ' . $nav . '-' . $subnav ); ?>">

					<?php
					// Custom hook to display tabbed content
					/** This action is documented in ultimate-member/templates/profile.php */
					do_action( "um_profile_content_$nav", $args );
					/** This action is documented in ultimate-member/templates/profile.php */
					do_action( "um_profile_content_{$nav}_$subnav", $args );
					?>
					<div class="clear"></div>
				</div>
				<?php
			}
		}
		/**
		 * Fires for adding content below User Profile menu.
		 *
		 * Internal Ultimate Member callbacks (Priority -> Callback name -> Excerpt):
		 * 99 - `profile_footer_login_form()` displays User Login form related to messaging extension.
		 *
		 * @param {array} $args User Profile data.
		 *
		 * @since 2.0
		 * @hook  um_profile_footer
		 *
		 * @example <caption>Display some content in User Profile footer.</caption>
		 * function my_um_profile_footer( $args ) {
		 *     // your code here
		 *     echo $content;
		 * }
		 * add_action( 'um_profile_footer', 'my_um_profile_footer' );
		 */
		do_action( 'um_profile_footer', $args );
		?>
	</div>
</div>