Accessibility Audio TTS - Text To Speech for Articles',
'7.4',
PHP_VERSION
);
printf(
'
',
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(
'',
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.
*/