Accessibility Audio TTS - Text To Speech for Articles', '7.4', PHP_VERSION ); printf( '

%s

', wp_kses_post( $message ) ); } /** * ======================================== * CONSTANTS DEFINITION * ======================================== * Define plugin constants for paths, URLs, and versions. */ // Plugin version - should match the version in plugin header. if ( ! defined( 'ACCESSIBILITY_AUDIO_TTS_VERSION' ) ) { define( 'ACCESSIBILITY_AUDIO_TTS_VERSION', '1.1.0' ); } if ( ! defined( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_FILE' ) ) { define( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_FILE', __FILE__ ); } if ( ! defined( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_DIR' ) ) { define( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); } if ( ! defined( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_URL' ) ) { define( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); } if ( ! defined( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_BASENAME' ) ) { define( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_BASENAME', plugin_basename( __FILE__ ) ); } if ( ! defined( 'ACCESSIBILITY_AUDIO_TTS_ASSETS_URL' ) ) { define( 'ACCESSIBILITY_AUDIO_TTS_ASSETS_URL', ACCESSIBILITY_AUDIO_TTS_PLUGIN_URL . 'assets/' ); } if ( ! defined( 'ACCESSIBILITY_AUDIO_TTS_MIN_WP_VERSION' ) ) { define( 'ACCESSIBILITY_AUDIO_TTS_MIN_WP_VERSION', '6.0' ); } if ( ! defined( 'ACCESSIBILITY_AUDIO_TTS_MIN_PHP_VERSION' ) ) { define( 'ACCESSIBILITY_AUDIO_TTS_MIN_PHP_VERSION', '7.4' ); } if ( ! defined( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_PATH' ) ) { define( 'ACCESSIBILITY_AUDIO_TTS_PLUGIN_PATH', ACCESSIBILITY_AUDIO_TTS_PLUGIN_DIR ); } /** * ======================================== * VERSION COMPATIBILITY CHECKS * ======================================== * Check WordPress version compatibility (after constants are defined). */ // Check WordPress version. if ( version_compare( get_bloginfo( 'version' ), ACCESSIBILITY_AUDIO_TTS_MIN_WP_VERSION, '<' ) ) { add_action( 'admin_notices', 'accessibility_audio_tts_wp_version_notice' ); return; } /** * Display WordPress version compatibility notice */ function accessibility_audio_tts_wp_version_notice() { /* translators: 1: Plugin name (HTML), 2: Required WordPress version, 3: Current WordPress version */ $message = sprintf( /* translators: auto */ esc_html__( '%1$s requires WordPress %2$s or higher. You are running WordPress %3$s. Please upgrade WordPress to use this plugin.', 'accessibility-audio-tts-text-to-speech-for-articles' ), 'Accessibility Audio TTS - Text To Speech for Articles', ACCESSIBILITY_AUDIO_TTS_MIN_WP_VERSION, get_bloginfo( 'version' ) ); printf( '

%s

', wp_kses_post( $message ) ); } /** * ======================================== * UTILITY FUNCTIONS * ======================================== * Backward compatibility and helper functions. */ /** * Preferred helper: get asset version using new naming. * * @param string $relative_path Relative path from plugin directory. * @return string File modification time or plugin version as fallback. */ function accessibility_audio_tts_get_asset_version( $relative_path ) { return \Accessibility_Audio_TTS\Plugin_Utils::get_asset_version( $relative_path ); } // Translations are auto-loaded by WordPress.org (WP 4.6+) based on text domain. /** * ======================================== * SYSTEM INITIALIZATION * ======================================== * Setup core systems and autoloader. */ // Load production-safe debug manager. require_once __DIR__ . '/shared/debug-manager.php'; require_once __DIR__ . '/shared/security-manager.php'; require_once __DIR__ . '/shared/plugin-helpers.php'; // Register class autoloader for namespace-based class loading. \Accessibility_Audio_TTS\Plugin_Utils::register_autoloader(); // Initialize security manager. \Accessibility_Audio_TTS\Core\Security_Manager::init(); // Check and display requirements. \Accessibility_Audio_TTS\Plugin_Helpers::display_requirements_notice(); // Global variable for AJAX handler (backward compatibility). global $accessibility_audio_tts_ajax_handler; /** * ======================================== * PLUGIN INITIALIZATION * ======================================== * Main plugin initialization function. */ /** * Initialize essential plugin components. * Called on WordPress 'init' action - only for essential operations. */ function accessibility_audio_tts_init() { // Initialize only essential components that need to run everywhere. \Accessibility_Audio_TTS\Plugin_Initializer::init_essential(); } /** * Initialize admin-specific components. * Called on WordPress 'admin_init' action - only in admin area. */ function accessibility_audio_tts_admin_init() { if ( is_admin() ) { // Run one-time migration if needed (handles plugin updates without reactivation). $migrated = get_option( 'accessibility_audio_tts_dir_migrated', false ); if ( ! $migrated && class_exists( '\\Accessibility_Audio_TTS\\API\\Audio_Directory_Manager' ) ) { $dir_manager = new \Accessibility_Audio_TTS\API\Audio_Directory_Manager(); if ( $dir_manager->maybe_migrate_legacy_directory() ) { update_option( 'accessibility_audio_tts_dir_migrated', true ); } } \Accessibility_Audio_TTS\Plugin_Initializer::init_admin(); } } /** * Initialize frontend-specific components. * Called on WordPress 'wp' action - only on frontend. */ function accessibility_audio_tts_frontend_init() { if ( ! is_admin() ) { \Accessibility_Audio_TTS\Plugin_Initializer::init_frontend(); } } // Hook plugin initialization to appropriate WordPress actions. add_action( 'init', 'accessibility_audio_tts_init' ); add_action( 'admin_init', 'accessibility_audio_tts_admin_init' ); add_action( 'wp', 'accessibility_audio_tts_frontend_init' ); /** * ======================================== * PLUGIN LIFECYCLE HOOKS * ======================================== * Handle plugin activation, deactivation, and uninstall. */ // Activation hook. register_activation_hook( ACCESSIBILITY_AUDIO_TTS_PLUGIN_FILE, 'accessibility_audio_tts_activate_plugin' ); // Deactivation hook. register_deactivation_hook( ACCESSIBILITY_AUDIO_TTS_PLUGIN_FILE, 'accessibility_audio_tts_deactivate_plugin' ); /** * Plugin activation callback. * * @since 1.0.0 */ function accessibility_audio_tts_activate_plugin() { // Check if we can safely activate. if ( ! current_user_can( 'activate_plugins' ) ) { return; } // Verify the activation request. $plugin = isset( $_REQUEST['plugin'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['plugin'] ) ) : ''; check_admin_referer( "activate-plugin_{$plugin}" ); // Run activation procedures. if ( class_exists( '\\Accessibility_Audio_TTS\\Plugin_Initializer' ) ) { \Accessibility_Audio_TTS\Plugin_Initializer::on_activation(); } // Migrate legacy upload directory (wcag-audio → accessibility-audio-tts). if ( class_exists( '\\Accessibility_Audio_TTS\\API\\Audio_Directory_Manager' ) ) { $dir_manager = new \Accessibility_Audio_TTS\API\Audio_Directory_Manager(); $dir_manager->maybe_migrate_legacy_directory(); } // Set activation flag for first-time setup. add_option( 'accessibility_audio_tts_activation_time', time() ); add_option( 'accessibility_audio_tts_version', ACCESSIBILITY_AUDIO_TTS_VERSION ); } /** * Plugin deactivation callback. * * @since 1.0.0 */ function accessibility_audio_tts_deactivate_plugin() { // Check if we can safely deactivate. if ( ! current_user_can( 'activate_plugins' ) ) { return; } // Verify the deactivation request if nonce provided (some programmatic flows may not send it). $plugin = isset( $_REQUEST['plugin'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['plugin'] ) ) : ''; if ( ! empty( $plugin ) && isset( $_REQUEST['_wpnonce'] ) ) { check_admin_referer( "deactivate-plugin_{$plugin}" ); } // Run deactivation procedures. if ( class_exists( '\\Accessibility_Audio_TTS\\Plugin_Initializer' ) ) { \Accessibility_Audio_TTS\Plugin_Initializer::on_deactivation(); } } /** * ======================================== * PLUGIN META AND LINKS * ======================================== * Add plugin action links and meta information. */ // Add settings link to plugin actions. add_filter( 'plugin_action_links_' . ACCESSIBILITY_AUDIO_TTS_PLUGIN_BASENAME, 'accessibility_audio_tts_add_action_links' ); // Add plugin meta links. add_filter( 'plugin_row_meta', 'accessibility_audio_tts_add_meta_links', 10, 2 ); /** * Add action links to plugin list. * * @param array $links Existing links. * @return array Modified links. * @since 1.0.0 */ function accessibility_audio_tts_add_action_links( $links ) { $settings_link = sprintf( '%s', admin_url( 'admin.php?page=accessibility-audio-tts' ), esc_html__( 'Settings', 'accessibility-audio-tts-text-to-speech-for-articles' ) ); array_unshift( $links, $settings_link ); return $links; } /** * Add meta links to plugin list. * * @param array $links Existing links. * @param string $file Plugin file. * @return array Modified links. * @since 1.0.0 */ function accessibility_audio_tts_add_meta_links( $links, $file ) { if ( ACCESSIBILITY_AUDIO_TTS_PLUGIN_BASENAME === $file ) { $custom_links = array( 'visit_site' => sprintf( '%s', 'https://app4you.dev', esc_html__( 'Visit plugin site', 'accessibility-audio-tts-text-to-speech-for-articles' ) ), 'author' => sprintf( '%s', 'https://app4you.dev/wcag-2-2-audio-generator-text-to-speech-accessibility/', esc_html__( 'App4You.dev', 'accessibility-audio-tts-text-to-speech-for-articles' ) ), ); return $custom_links; } return $links; } /** * ======================================== * PLUGIN UNINSTALL * ======================================== * Plugin uninstall hook is handled in uninstall.php. * as per WordPress best practices. */