diff --git a/includes/admin/core/class-admin-menu.php b/includes/admin/core/class-admin-menu.php index d7bb773f..eb8a14c0 100644 --- a/includes/admin/core/class-admin-menu.php +++ b/includes/admin/core/class-admin-menu.php @@ -16,18 +16,16 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) { */ class Admin_Menu { - /** * @var string */ var $pagehook; var $slug = 'ultimatemember'; - /** * Admin_Menu constructor. */ - function __construct() { + public function __construct() { add_action( 'admin_menu', array( &$this, 'primary_admin_menu' ), 0 ); add_action( 'admin_menu', array( &$this, 'secondary_menu_items' ), 1000 ); add_action( 'admin_menu', array( &$this, 'extension_menu' ), 9999 ); @@ -35,8 +33,46 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) { add_action( 'admin_head', array( $this, 'menu_order_count' ) ); add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ), 1000 ); + + add_action( 'load-ultimate-member_page_um_options', array( &$this, 'maybe_settings_redirect' ) ); } + /** + * Trigger redirect on the Settings screen if there is a wrong tab or section. + * + * @since 2.8.2 + */ + public function maybe_settings_redirect() { + $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] ); + $current_subtab = empty( $_GET['section'] ) ? '' : sanitize_key( $_GET['section'] ); + + $settings_struct = UM()->admin_settings()->settings_structure[ $current_tab ]; + + // Remove not option hidden fields. + if ( ! empty( $settings_struct['fields'] ) ) { + foreach ( $settings_struct['fields'] as $field_key => $field_options ) { + if ( isset( $field_options['is_option'] ) && false === $field_options['is_option'] ) { + unset( $settings_struct['fields'][ $field_key ] ); + } + } + } + + if ( empty( $settings_struct['fields'] ) && empty( $settings_struct['sections'] ) ) { + wp_safe_redirect( add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ) ); + exit; + } + + if ( ! empty( $settings_struct['sections'] ) ) { + if ( empty( $settings_struct['sections'][ $current_subtab ] ) ) { + $args = array( 'page' => 'um_options' ); + if ( ! empty( $current_tab ) ) { + $args['tab'] = $current_tab; + } + wp_safe_redirect( add_query_arg( $args, admin_url( 'admin.php' ) ) ); + exit; + } + } + } /** * Change the admin footer text on UM admin pages @@ -143,8 +179,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) { /** * Setup admin menu */ - function primary_admin_menu() { - $this->pagehook = add_menu_page( __( 'Ultimate Member', 'ultimate-member' ), __( 'Ultimate Member', 'ultimate-member' ), 'manage_options', $this->slug, array( &$this, 'admin_page' ), 'dashicons-admin-users', '42.78578'); + public function primary_admin_menu() { + $this->pagehook = add_menu_page( __( 'Ultimate Member', 'ultimate-member' ), __( 'Ultimate Member', 'ultimate-member' ), 'manage_options', $this->slug, array( &$this, 'admin_page' ), 'dashicons-admin-users', '42.78578' ); add_action( 'load-' . $this->pagehook, array( &$this, 'on_load_page' ) ); @@ -155,7 +191,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) { /** * Secondary admin menu (after settings) */ - function secondary_menu_items() { + public function secondary_menu_items() { + add_submenu_page( $this->slug, __( 'Settings', 'ultimate-member' ), __( 'Settings', 'ultimate-member' ), 'manage_options', 'um_options', array( UM()->admin_settings(), 'settings_page' ) ); + add_submenu_page( $this->slug, __( 'Forms', 'ultimate-member' ), __( 'Forms', 'ultimate-member' ), 'manage_options', 'edit.php?post_type=um_form', '' ); add_submenu_page( $this->slug, __( 'User Roles', 'ultimate-member' ), __( 'User Roles', 'ultimate-member' ), 'manage_options', 'um_roles', array( &$this, 'um_roles_pages' ) ); diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index 6c6842a3..7df53ec9 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -42,9 +42,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { //init settings structure add_action( 'admin_init', array( &$this, 'init_variables' ), 9 ); - //admin menu - add_action( 'admin_menu', array( &$this, 'primary_admin_menu' ), 0 ); - //settings structure handlers add_action( 'um_settings_page_before_email__content', array( $this, 'settings_before_email_tab' ) ); add_filter( 'um_settings_section_email__content', array( $this, 'settings_email_tab' ), 10, 1 ); @@ -1967,14 +1964,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { return array(); } - - /** - * Setup admin menu - */ - function primary_admin_menu() { - add_submenu_page( 'ultimatemember', __( 'Settings', 'ultimate-member' ), __( 'Settings', 'ultimate-member' ), 'manage_options', 'um_options', array( &$this, 'settings_page' ) ); - } - /** * Settings page callback. */ @@ -1982,27 +1971,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] ); $current_subtab = empty( $_GET['section'] ) ? '' : sanitize_key( $_GET['section'] ); - $settings_struct = $this->settings_structure[ $current_tab ]; - - // Remove not option hidden fields - if ( ! empty( $settings_struct['fields'] ) ) { - foreach ( $settings_struct['fields'] as $field_key => $field_options ) { - if ( isset( $field_options['is_option'] ) && false === $field_options['is_option'] ) { - unset( $settings_struct['fields'][ $field_key ] ); - } - } - } - - if ( empty( $settings_struct['fields'] ) && empty( $settings_struct['sections'] ) ) { - um_js_redirect( add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ) ); - } - - if ( ! empty( $settings_struct['sections'] ) ) { - if ( empty( $settings_struct['sections'][ $current_subtab ] ) ) { - um_js_redirect( add_query_arg( array( 'page' => 'um_options', 'tab' => $current_tab ), admin_url( 'admin.php' ) ) ); - } - } - echo '

' . esc_html__( 'Ultimate Member - Settings', 'ultimate-member' ) . '

'; echo $this->generate_tabs_menu() . $this->generate_subtabs_menu( $current_tab ); @@ -2142,24 +2110,22 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { '; - switch( $page ) { + switch ( $page ) { case 'settings': $menu_tabs = array(); foreach ( $this->settings_structure as $slug => $tab ) { if ( ! empty( $tab['fields'] ) ) { foreach ( $tab['fields'] as $field_key => $field_options ) { - if ( isset( $field_options['is_option'] ) && $field_options['is_option'] === false ) { + if ( isset( $field_options['is_option'] ) && false === $field_options['is_option'] ) { unset( $tab['fields'][ $field_key ] ); } } @@ -2172,10 +2138,14 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] ); foreach ( $menu_tabs as $name => $label ) { - $active = ( $current_tab == $name ) ? 'nav-tab-active' : ''; - $tabs .= '' . - $label . - ''; + $active = $current_tab === $name ? 'nav-tab-active' : ''; + + $args = array( 'page' => 'um_options' ); + if ( ! empty( $name ) ) { + $args['tab'] = $name; + } + $tab_url = add_query_arg( $args, admin_url( 'admin.php' ) ); + $tabs .= '' . esc_html( $label ) . ''; } break; @@ -2207,36 +2177,46 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { return $tabs . ''; } - /** * @param string $tab * * @return string */ - function generate_subtabs_menu( $tab = '' ) { + private function generate_subtabs_menu( $tab = '' ) { if ( empty( $this->settings_structure[ $tab ]['sections'] ) ) { return ''; } + $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] ); + $current_subtab = empty( $_GET['section'] ) ? '' : sanitize_key( $_GET['section'] ); + $menu_subtabs = array(); foreach ( $this->settings_structure[ $tab ]['sections'] as $slug => $subtab ) { $menu_subtabs[ $slug ] = $subtab['title']; } - $subtabs = '
'; - } + if ( empty( $subtabs ) ) { + return ''; + } + return '
'; + } /** * Handler for settings forms @@ -2667,20 +2647,18 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { } } - /** * */ - function settings_before_email_tab() { + public function settings_before_email_tab() { $email_key = empty( $_GET['email'] ) ? '' : sanitize_key( $_GET['email'] ); - $emails = UM()->config()->email_notifications; + $emails = UM()->config()->email_notifications; if ( empty( $email_key ) || empty( $emails[ $email_key ] ) ) { include_once UM_PATH . 'includes/admin/core/list-tables/emails-list-table.php'; } } - /** * @param $section *