hook_suffixes['dashboard'] = add_menu_page( __( 'REST DevTools', 'advanced-rest-api-devtools' ), __( 'REST DevTools', 'advanced-rest-api-devtools' ), 'manage_options', 'advanced-rest-api-devtools', array( $this, 'render_dashboard' ), 'dashicons-rest-api', 30 ); $this->hook_suffixes['logs'] = add_submenu_page( 'advanced-rest-api-devtools', __( 'REST Logs', 'advanced-rest-api-devtools' ), __( 'REST Logs', 'advanced-rest-api-devtools' ), 'manage_options', 'advanced-rest-api-devtools-logs', array( $this, 'render_logs' ) ); $this->hook_suffixes['environments'] = add_submenu_page( 'advanced-rest-api-devtools', __( 'Environments', 'advanced-rest-api-devtools' ), __( 'Environments', 'advanced-rest-api-devtools' ), 'manage_options', 'advanced-rest-api-devtools-environments', array( $this, 'render_environments' ) ); $this->hook_suffixes['collections'] = add_submenu_page( 'advanced-rest-api-devtools', __( 'Collections', 'advanced-rest-api-devtools' ), __( 'Collections', 'advanced-rest-api-devtools' ), 'manage_options', 'advanced-rest-api-devtools-collections', array( $this, 'render_collections' ) ); } /** * Enqueue admin assets conditionally. * * @param string $hook_suffix Current admin page hook suffix. */ public function enqueue_assets( $hook_suffix ) { // Only load on our pages. if ( ! in_array( $hook_suffix, $this->hook_suffixes, true ) ) { return; } // CSS. wp_enqueue_style( 'advanced-rest-api-devtools-admin', ARADT_URL . 'assets/css/admin.css', array( 'wp-components' ), ARADT_VERSION ); // Google Font — Inter. wp_enqueue_style( 'advanced-rest-api-devtools-font', 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap', array(), ARADT_VERSION ); // JS — three files with dependency chaining. wp_enqueue_script( 'advanced-rest-api-devtools-admin', ARADT_URL . 'assets/js/admin.js', array( 'wp-element', 'wp-components', 'wp-i18n', 'wp-api-fetch' ), ARADT_VERSION, true ); wp_enqueue_script( 'advanced-rest-api-devtools-panels', ARADT_URL . 'assets/js/panels.js', array( 'advanced-rest-api-devtools-admin' ), ARADT_VERSION, true ); wp_enqueue_script( 'advanced-rest-api-devtools-app', ARADT_URL . 'assets/js/app.js', array( 'advanced-rest-api-devtools-panels' ), ARADT_VERSION, true ); // Localize script data. $current_user = wp_get_current_user(); $settings = get_option( 'aradt_settings', array() ); wp_localize_script( 'advanced-rest-api-devtools-admin', 'aradtData', array( 'nonce' => wp_create_nonce( 'aradt_nonce' ), 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'restUrl' => rest_url(), 'siteUrl' => site_url(), 'pluginUrl' => ARADT_URL, 'version' => ARADT_VERSION, 'currentPage' => $this->get_current_page( $hook_suffix ), 'user' => array( 'id' => $current_user->ID, 'login' => $current_user->user_login, 'email' => $current_user->user_email, 'roles' => $current_user->roles, 'caps' => array_keys( array_filter( $current_user->allcaps ) ), ), 'settings' => $settings, 'i18n' => array( 'send' => __( 'Send', 'advanced-rest-api-devtools' ), 'loading' => __( 'Loading…', 'advanced-rest-api-devtools' ), 'error' => __( 'Error', 'advanced-rest-api-devtools' ), 'success' => __( 'Success', 'advanced-rest-api-devtools' ), 'noRoutes' => __( 'No routes found.', 'advanced-rest-api-devtools' ), 'noResults' => __( 'No results.', 'advanced-rest-api-devtools' ), 'confirmDelete' => __( 'Are you sure you want to delete this?', 'advanced-rest-api-devtools' ), ), ) ); // Set script translations. wp_set_script_translations( 'advanced-rest-api-devtools-admin', 'advanced-rest-api-devtools', ARADT_DIR . 'languages' ); } /** * Get the current page identifier from hook suffix. * * @param string $hook_suffix Admin page hook suffix. * @return string Page identifier. */ private function get_current_page( $hook_suffix ) { foreach ( $this->hook_suffixes as $page => $suffix ) { if ( $suffix === $hook_suffix ) { return $page; } } return 'dashboard'; } /** * Render dashboard page. */ public function render_dashboard() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'advanced-rest-api-devtools' ) ); } include ARADT_DIR . 'admin/partials/dashboard.php'; } /** * Render logs page. */ public function render_logs() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'advanced-rest-api-devtools' ) ); } include ARADT_DIR . 'admin/partials/logs.php'; } /** * Render environments page. */ public function render_environments() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'advanced-rest-api-devtools' ) ); } include ARADT_DIR . 'admin/partials/environments.php'; } /** * Render collections page. */ public function render_collections() { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'You do not have sufficient permissions to access this page.', 'advanced-rest-api-devtools' ) ); } include ARADT_DIR . 'admin/partials/collections.php'; } }