render_addon_screen( __( 'Cloudflare firewall sync', 'guardforge' ), __( 'Push a locked-out IP straight into your Cloudflare zone, so the next attempt never reaches WordPress at all. Available with GuardForge Pro.', 'guardforge' ), 'cloudflare_sync' ); return; } $guardforge_opts = GUARDFORGE_Options::all(); $guardforge_has_token = GUARDFORGE_Options::get_secret( 'cf_api_token' ) !== ''; $guardforge_zone = (string) ( $guardforge_opts['cf_zone_id'] ?? '' ); $guardforge_configured = $guardforge_has_token && $guardforge_zone !== ''; // The header badge says what has been PROVEN, not what has been typed in: // a saved token and zone are "configured"; only a successful verify_token // call (read-only GET on the zone) makes it "connected". Same facts the // "Token verification" card below prints (GF-G1, 2026-09-06). $guardforge_verify_state = ( $guardforge_configured && class_exists( 'GUARDFORGE_Cloudflare_Sync' ) ) ? GUARDFORGE_Cloudflare_Sync::state() : null; if ( ! $guardforge_configured ) { $guardforge_header_badge = __( 'NOT CONNECTED', 'guardforge' ); } elseif ( is_array( $guardforge_verify_state ) && ! empty( $guardforge_verify_state['ok'] ) ) { $guardforge_header_badge = __( 'CONNECTED', 'guardforge' ); } elseif ( is_array( $guardforge_verify_state ) && $guardforge_verify_state['checked_at'] !== '' ) { $guardforge_header_badge = __( 'NOT VERIFIED', 'guardforge' ); } else { $guardforge_header_badge = __( 'CONFIGURED · not verified yet', 'guardforge' ); } ?>