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;
}
}