database_manager = $database_manager ?? new Admin_Database_Manager(); $this->message_manager = $message_manager ?? new Admin_Message_Manager(); } /** * Add admin menu to WordPress. */ public function add_admin_menu() { static $menu_added = false; if ( $menu_added ) { return; } $menu_added = true; add_menu_page( __( 'Accessibility Audio TTS', 'accessibility-audio-tts-text-to-speech-for-articles' ), __( 'A11y Audio TTS', 'accessibility-audio-tts-text-to-speech-for-articles' ), 'manage_options', 'accessibility-audio-tts', array( $this, 'render_admin_page' ), 'dashicons-microphone', 30 ); } /** * Render admin page. */ public function render_admin_page() { static $already_rendered = false; if ( $already_rendered ) { return; } $already_rendered = true; // Display messages. $this->message_manager->check_and_display_get_message(); // Get statistics. $generated_count = $this->database_manager->get_generated_posts_count(); $published_posts = $this->database_manager->get_published_posts_count(); $percentage = $this->database_manager->calculate_generation_percentage( $generated_count, $published_posts ); // Render page components. $this->render_admin_page_content( $generated_count, $published_posts, $percentage ); } /** * Render admin page content. * * @param int $generated_count Number of generated posts. * @param int $published_posts Number of published posts. * @param float $percentage Coverage percentage. */ private function render_admin_page_content( $generated_count, $published_posts, $percentage ) { // Initialize renderers. $page_renderer = new Admin_Page_Renderer(); $list_renderer = new Generated_List_Renderer(); // Load the Cron_Status_Renderer class if not already loaded. if ( ! class_exists( '\\Accessibility_Audio_TTS\\Admin\\Cron_Status_Renderer' ) ) { require_once __DIR__ . '/../infrastructure/cron/cron-status-renderer.php'; } $cron_renderer = new Cron_Status_Renderer(); // Prepare template variables. $template_vars = $this->prepare_template_variables(); echo '
'; echo '
'; echo '
'; $page_renderer->render_header(); echo '
'; $list_renderer->render_modal( $generated_count ); $cron_renderer->render_modal(); echo '
'; $page_renderer->render_stats_cards( $generated_count, $published_posts, $percentage ); // Prepare variables for template without using extract(). $saved_api_key = $template_vars['saved_api_key'] ?? ''; $saved_voices = $template_vars['saved_voices'] ?? array(); $saved_voice_id = $template_vars['saved_voice_id'] ?? ''; $saved_voice_name = $template_vars['saved_voice_name'] ?? ''; $saved_model = $template_vars['saved_model'] ?? 'eleven_multilingual_v2'; $saved_mode = $template_vars['saved_mode'] ?? 'wp_cron'; $saved_post_types = $template_vars['saved_post_types'] ?? array( 'post' ); $all_post_types = $template_vars['all_post_types'] ?? array(); $saved_chatgpt_api_key = $template_vars['saved_chatgpt_api_key'] ?? ''; $saved_chatgpt_prompt = $template_vars['saved_chatgpt_prompt'] ?? ''; require __DIR__ . '/templates/settings/admin-page-settings.php'; echo '
'; echo '
'; echo '
'; } /** * Prepare variables for template. * * @return array Template variables. */ private function prepare_template_variables() { return array( 'saved_api_key' => get_option( 'accessibility_audio_tts_api_key', '' ), 'saved_voices' => get_option( 'accessibility_audio_tts_voices_list', array() ), 'saved_voice_id' => get_option( 'accessibility_audio_tts_voice_id', '' ), 'saved_voice_name' => get_option( 'accessibility_audio_tts_voice_name', '' ), 'saved_model' => get_option( 'accessibility_audio_tts_model', 'eleven_multilingual_v2' ), 'saved_mode' => get_option( 'accessibility_audio_tts_processing_mode', 'wp_cron' ), 'saved_post_types' => get_option( 'accessibility_audio_tts_post_types', array( 'post' ) ), 'all_post_types' => get_post_types( array( 'public' => true ), 'objects' ), 'saved_chatgpt_api_key' => get_option( 'accessibility_audio_tts_chatgpt_api_key', '' ), 'saved_chatgpt_prompt' => get_option( 'accessibility_audio_tts_chatgpt_prompt', '' ), ); } /** * Check if current page is Accessibility Audio TTS admin page. * * @return bool True if on Accessibility Audio TTS admin page. */ public function is_accessibility_audio_tts_admin_page() { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Page detection for routing, no data processing or state changes. return isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] ) ) === 'accessibility-audio-tts'; } /** * Get admin page URL with optional parameters. * * @param array $params Optional URL parameters. * @return string Admin page URL. */ public function get_admin_page_url( $params = array() ) { $url = admin_url( 'admin.php?page=accessibility-audio-tts' ); if ( ! empty( $params ) ) { $url .= '&' . http_build_query( $params ); } return $url; } }