' ), 30 ); add_submenu_page( 'sitefix', __( 'Dashboard', 'sitefix' ), __( 'Dashboard', 'sitefix' ), 'manage_options', 'sitefix', array( $this, 'render_dashboard' ) ); add_submenu_page( 'sitefix', __( 'Audit', 'sitefix' ), __( 'Audit', 'sitefix' ), 'manage_options', 'sitefix-audit', array( $this, 'render_audit' ) ); add_submenu_page( 'sitefix', __( 'Settings', 'sitefix' ), __( 'Settings', 'sitefix' ), 'manage_options', 'sitefix-settings', array( $this, 'render_settings' ) ); if ( ! sitefix_is_pro_active() ) { add_submenu_page( 'sitefix', __( 'Upgrade to Pro', 'sitefix' ), '' . __( 'Upgrade to Pro', 'sitefix' ) . '', 'manage_options', 'sitefix-pro-upsell', array( $this, 'render_pro_upsell' ) ); } } public function register_settings() { register_setting( 'sitefix_settings_group', 'sitefix_settings', array( 'sanitize_callback' => array( $this, 'sanitize_settings' ), ) ); } public function sanitize_settings( $input ) { $defaults = sitefix_get_default_settings(); $clean = array(); foreach ( $defaults as $key => $default ) { $clean[ $key ] = ! empty( $input[ $key ] ); } return $clean; } public function enqueue_assets( $hook ) { if ( strpos( (string) $hook, 'sitefix' ) === false ) return; wp_enqueue_style( 'sitefix-admin', SITEFIX_URL . 'assets/css/admin.css', array(), SITEFIX_VERSION ); wp_enqueue_script( 'sitefix-admin', SITEFIX_URL . 'assets/js/admin.js', array(), SITEFIX_VERSION, true ); wp_localize_script( 'sitefix-admin', 'sitefixData', array( 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'sitefix_nonce' ), ) ); } /** * Dashboard. */ public function render_dashboard() { $last = get_transient( 'sitefix_last_scan' ); $score = is_array( $last ) ? (int) ( $last['score'] ?? 0 ) : 0; $pages = is_array( $last ) ? count( $last['report'] ?? array() ) : 0; $is_pro = sitefix_is_pro_active(); $color = $score >= 90 ? '#10B981' : ( $score >= 70 ? '#F59E0B' : '#EF4444' ); ?>

SiteFix

v · PRO' : 'Free'; ?>

✓

0 ? esc_html( (string) $score ) : '—'; ?> /100

0 ) { esc_html_e( 'Lighthouse Accessibility', 'sitefix' ); } else { esc_html_e( 'Run your first scan', 'sitefix' ); } ?>

0 ) { /* translators: %d: number of pages */ printf( esc_html__( 'Based on the last scan of %d page(s). All fixes are applied at runtime — your content stays untouched.', 'sitefix' ), $pages ); } else { esc_html_e( 'SiteFix runs an audit on your most recent pages and applies fixes automatically. Click "Run scan" to begin.', 'sitefix' ); } ?>

    __( 'Auto-add missing alt text from filenames', 'sitefix' ), 'enable_heading_fix' => __( 'Heading hierarchy normalisation', 'sitefix' ), 'enable_skip_link' => __( 'Skip-to-content link for keyboard users', 'sitefix' ), 'enable_focus_indicator' => __( 'Visible focus indicators on all interactives', 'sitefix' ), 'enable_aria_landmarks' => __( 'ARIA landmarks for navigation', 'sitefix' ), 'enable_lang_attr' => __( 'Lang attribute on ', 'sitefix' ), 'enable_table_caption' => __( 'Table headers with scope=col', 'sitefix' ), 'enable_form_labels' => __( 'Form input aria-labels', 'sitefix' ), ); foreach ( $list as $key => $label ) { $on = ! empty( $settings[ $key ] ); echo '
  • ' . ( $on ? '✓' : '○' ) . ' ' . esc_html( $label ) . '
  • '; } ?>

★

/100 ✓
  • · —

array( __( 'Auto-add missing alt text', 'sitefix' ), __( 'Smart fallback from filename when image has no alt attribute. WCAG 1.1.1.', 'sitefix' ) ), 'enable_heading_fix' => array( __( 'Normalise heading hierarchy', 'sitefix' ), __( 'Detect and adjust skipped heading levels. WCAG 1.3.1.', 'sitefix' ) ), 'enable_skip_link' => array( __( 'Skip-to-content link', 'sitefix' ), __( 'Visible only on keyboard focus. WCAG 2.4.1.', 'sitefix' ) ), 'enable_focus_indicator' => array( __( 'Visible focus indicator', 'sitefix' ), __( 'Strong outline on all interactive elements when focused. WCAG 2.4.7.', 'sitefix' ) ), 'enable_aria_landmarks' => array( __( 'ARIA landmarks (nav)', 'sitefix' ), __( 'aria-label on navigation menus. WCAG 4.1.2.', 'sitefix' ) ), 'enable_lang_attr' => array( __( 'Lang attribute on ', 'sitefix' ), __( 'Ensures the page declares its language. WCAG 3.1.1.', 'sitefix' ) ), 'enable_table_caption' => array( __( 'Table headers with scope', 'sitefix' ), __( 'Adds scope="col" to TH cells. WCAG 1.3.1.', 'sitefix' ) ), 'enable_form_labels' => array( __( 'Form input aria-labels', 'sitefix' ), __( 'Adds aria-label from placeholder/name when input lacks a label. WCAG 1.3.1 / 4.1.2.', 'sitefix' ) ), ); foreach ( $fields as $key => $info ) : list( $label, $desc ) = $info; ?>

★

  • ★ AI Alt Text — Claude Sonnet 4.6 vision reads image content, writes accurate alt text. 1 credit per image.
  • ★ Deep WCAG Audit — page-by-page reports with line-level violations.
  • ★ PDF Compliance Certificate — monthly accessibility statement, auto-emailed.
  • ★ Bulk Auto-Fix — apply fixes site-wide in one click.
  • ★ Multi-language ARIA labels — localize in 7+ languages.
  • ★ Priority support 24h — direct dev access.

TierSitesMonthlyAnnualLifetimeCredits/mo
Solo1€4.95€49€19950
Pro5€9.95€99€399200
Agency20€24.95€249€9991000

30-day money-back guarantee · top-up packs available · credits never expire