*/ class Frontend { /** * The ID of this plugin. * * @since 3.0.0 * @access private * @var string $plugin_name The ID of this plugin. */ private $plugin_name; /** * The version of this plugin. * * @since 3.0.0 * @access private * @var string $version The current version of this plugin. */ private $version; /** * Admin modules of the plugin * * @var array */ private static $modules; /** * Currently active modules * * @var array */ private static $active_modules; /** * Existing modules * * @var array */ public static $existing_modules; /** * Initialize the class and set its properties. * * @since 3.0.0 * @param string $plugin_name The name of the plugin. * @param string $version The version of this plugin. */ public function __construct( $plugin_name, $version ) { $this->plugin_name = $plugin_name; $this->version = $version; self::$modules = $this->get_default_modules(); $this->load_modules(); add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ), 1 ); add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_checker_assets' ), 2 ); add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_toolbar_widget' ), 3 ); add_action( 'wp_head', array( $this, 'inject_audit_preload_style' ), 0 ); } /** * Inject an early is_active() ) { self::$active_modules[ $module ] = true; } } } } } /** * Enqueue front end scripts * * @return void */ public function enqueue_scripts() { $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'assets/js/script' . $suffix . '.js', array(), $this->version, true ); $config = Settings::get_instance()->get(); $config = apply_filters( 'wya11y_config', $config ); wp_localize_script( $this->plugin_name, '_wyA11yConfig', $config ); } /** * Enqueue checker assets (content script and dashboard bundle) * * @return void */ public function enqueue_checker_assets() { // Only load when an admin opened this URL via the backend "Scan page" trigger. // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only flag, no state change. $is_audit_request = isset( $_GET['wya11y_audit'] ) && '1' === sanitize_text_field( wp_unslash( $_GET['wya11y_audit'] ) ); if ( ! $is_audit_request ) { return; } if ( ! current_user_can( 'manage_options' ) ) { return; } // Enqueue content script (vanilla JS, no build) wp_enqueue_script( 'wya11y-content-script', plugin_dir_url( __FILE__ ) . 'assets/checker/js/content-script.js', array(), $this->version, true ); // Check if built checker bundle exists $checker_js_path = dirname( __FILE__ ) . '/../admin/app/dist/assets/checker.js'; $checker_css_path = dirname( __FILE__ ) . '/../admin/app/dist/assets/react.css'; $checker_js = null; $checker_css = null; if ( file_exists( $checker_js_path ) ) { $checker_js = 'assets/checker.js'; wp_enqueue_script( 'wya11y-checker-dashboard', plugin_dir_url( dirname( __FILE__ ) ) . 'admin/app/dist/' . $checker_js, array(), $this->version, true ); // Add filter to add type="module" attribute for this script add_filter( 'script_loader_tag', array( $this, 'add_module_type_to_checker' ), 10, 3 ); } if ( file_exists( $checker_css_path ) ) { $checker_css = 'assets/react.css'; wp_enqueue_style( 'wya11y-checker-styles', plugin_dir_url( dirname( __FILE__ ) ) . 'admin/app/dist/' . $checker_css, array(), $this->version ); } wp_localize_script( 'wya11y-content-script', 'wya11yChecker', array( 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'wya11y_checker' ), 'assetsUrl' => plugin_dir_url( __FILE__ ) . 'assets/checker/', 'dashboardUrl' => $checker_js ? plugin_dir_url( dirname( __FILE__ ) ) . 'admin/app/dist/' . $checker_js : '', 'dashboardCssUrl' => $checker_css ? plugin_dir_url( dirname( __FILE__ ) ) . 'admin/app/dist/' . $checker_css : '', 'version' => $this->version, ) ); } /** * Enqueue toolbar widget script with proper WordPress enqueuing and localization * * @return void */ public function enqueue_toolbar_widget() { $settings = Settings::get_instance(); $toolbar_settings = $settings->get( 'toolbar' ); // Check if toolbar is enabled if ( (empty( $toolbar_settings['enabled']) && ! $toolbar_settings['enabled']) || (! isset($toolbar_settings['features']) && ! is_array($toolbar_settings['features']) ) ){ return; } // Prepare the configuration for the widget $hide_on_small_screen = isset( $toolbar_settings['features']['hideOnSmallScreens'] ) ? $toolbar_settings['features']['hideOnSmallScreens'] : false; $allowed_settings_options = array( 'font-size' => 'fontSize', 'high-contrast' => 'contrast', 'grayscale' => 'grayscale', ); $allowed_settings = array(); $is_feature_enabled = false; foreach ( $allowed_settings_options as $key => $value ) { if( isset( $toolbar_settings['features'][ $value ] ) && ! empty( $toolbar_settings['features'][ $value ] ) && $toolbar_settings['features'][ $value ] === true ){ $allowed_settings[ $key ] = true; $is_feature_enabled = true; }else{ $allowed_settings[ $key ] = false; } } if(!$is_feature_enabled){ return; } // Prepare configuration array $config = array( 'iconId' => 'default', 'toolbarSettings' => array( 'hideFromSmallScreen' => isset( $toolbar_settings['features']['hideOnSmallScreens'] ) ? $toolbar_settings['features']['hideOnSmallScreens'] : false, ), 'position' => array( 'mobile' => isset( $toolbar_settings['placement']['position'] ) ? $toolbar_settings['placement']['position'] : 'bottom-right', 'desktop' => isset( $toolbar_settings['placement']['position'] ) ? $toolbar_settings['placement']['position'] : 'bottom-right', 'vertical' => isset( $toolbar_settings['placement']['verticalOffset'] ) ? $toolbar_settings['placement']['verticalOffset'] : 20, ), 'allowedSettings' => $allowed_settings, 'language' => array( 'default' => get_locale(), 'selected' => array(), ), 'translations' => array( 'Accessibility toolbar' => __( 'Accessibility toolbar', 'accessibility-plus' ), 'Adjust Font Sizing' => __( 'Adjust Font Sizing', 'accessibility-plus' ), 'High contrast' => __( 'High contrast', 'accessibility-plus' ), 'Grayscale' => __( 'Grayscale', 'accessibility-plus' ), ), ); // Enqueue the widget script with proper versioning wp_enqueue_script( 'accessibility-plus-widget', plugin_dir_url( __FILE__ ) . 'assets/js/widget.min.js', array(), // No dependencies $this->version, // Use plugin version for cache busting true // Load in footer ); // Localize script to pass configuration wp_localize_script( 'accessibility-plus-widget', '_accessibilityPlusConfig', $config ); } /** * Add type="module" attribute to checker.js script tag * * @param string $tag The script tag HTML. * @param string $handle The script handle. * @param string $src The script source URL. * @return string Modified script tag. */ public function add_module_type_to_checker( $tag, $handle, $src ) { // Only modify the checker dashboard script if ( 'wya11y-checker-dashboard' === $handle ) { // Add type="module" attribute $tag = str_replace( '