QuizWizz v1.10.0 β€” Architecture Map (2026-07-27)

Historical record β€” 2026-07-27

Preserved as observed. Current truth: Program Masterplan.

  • Plugin directory: /home/loca/dev/wrdp/wp/wp-content/plugins/quizwizz/
  • Scope: read-only scan of the plugin directory only
  • Audit date: 2026-07-27

1. Top-level layout

PathKindNotes
quizwizz.phpbootstrapmain plugin file, header, constants, lifecycle hooks
uninstall.phplifecycleuninstall routine
readme.txtmetadataheader/version copy
BUILDING.mddocslocked toolchain description
LICENSE, SOURCE-PROVENANCE.md, THIRD-PARTY-NOTICES.mdlegallicense/provenance notices
includes/PHP sourceall runtime classes
assets/raw assetsfrontend/backend source assets
build/quiz/build artifactcompiled block assets only
languages/i18ntext-domain language files
provenance/metadatasource-provenance data
vendor/dependenciesComposer-managed packages

2. Plugin header and versioning

Verified from quizwizz.php:1-29 and readme.txt:1-9:

FieldValueAnchor
Plugin NameQuizWizzquizwizz.php:7
Version1.10.0quizwizz.php:9, quizwizz.php:22
Requires PHP8.3quizwizz.php:11
Requires WP6.3quizwizz.php:12
Tested up to7.0quizwizz.php:13
Text Domainquizwizzquizwizz.php:14
Domain Path/languagesquizwizz.php:15
ConstantsQUIZWIZZ_FILE, QUIZWIZZ_PATH, QUIZWIZZ_URL, QUIZWIZZ_VERSIONquizwizz.php:17-22

3. Architecture and boot wiring

Bootstrap in quizwizz.php:26-28:

register_activation_hook( QUIZWIZZ_FILE, array( 'QuizWizz\\Plugin', 'activate' ) );
register_deactivation_hook( QUIZWIZZ_FILE, array( 'QuizWizz\\Plugin', 'deactivate' ) );
add_action( 'plugins_loaded', array( 'QuizWizz\\Plugin', 'boot' ) );

includes/Plugin.php:29-83 wires the plugin:

SubsystemRegistration pointImplementation
CPTs / taxonomiesboot()includes/PostTypes.php, includes/Taxonomies.php
Meta boxesboot()includes/Meta.php
Blocksregister_blocks()includes/Plugin.php:85-141
REST controllersboot()Quiz, Generate, Admin, Settings, Models, Starter, BatchTranslate
Admin pagesboot()DashboardPage, ImportPage, SettingsPage, StarterPage
Admin-post handleradmin_post_qw_importincludes/Plugin.php:64
Frontend shortcodesboot()includes/Frontend/Shortcode.php, includes/Frontend/Embeds.php
Frontend handlersboot()includes/Frontend/CraftHandler.php, includes/Pdf/PdfHandler.php
Admin shell assetsenqueue_admin_shell()includes/Plugin.php:143-166
Body class / title filtersbody_class(), maybe_blank_craft_title()includes/Plugin.php:223-252
Block editor localizationslocalize_block_editor()includes/Plugin.php:168-215

REST namespace is quizwizz/v1.

4. Custom post types and taxonomies

From includes/PostTypes.php:7-107:

CPTPublicRewriteMenuRESTSupports
qw_quizyesquizqw-dashboardfalse['title']
qw_questionnoβ€”hiddenfalsefalse (none)

From includes/Taxonomies.php:8-89:

TaxonomyPublicHierarchicalRewriteUIREST
qw_subjectyesyessubjectvisiblefalse
qw_difficultynonoβ€”hiddenfalse
qw_languagenonoβ€”hiddenfalse
qw_tagnonoβ€”hiddenfalse

Subject icon meta is attached via taxonomy hooks in includes/Taxonomies.php.

5. Capabilities

From includes/Capabilities.php:7-74:

  • manage_quizwizz
  • edit_qw_questions
  • publish_qw_questions
  • edit_qw_quizzes
  • publish_qw_quizzes
  • manage_qw_taxonomies
  • assign_qw_taxonomies

6. Admin pages

Page slugParentFileLines
qw-dashboardtop-levelincludes/Admin/DashboardPage.php:21-40
qw-importqw-dashboardincludes/Admin/ImportPage.php:21-28
qw-settingsqw-dashboardincludes/Admin/SettingsPage.php:19-27
qw-get-startedqw-dashboardincludes/Admin/StarterPage.php:37-47

7. Shortcodes and blocks

Shortcodes:

ShortcodeFileLines
[quizwizz_craft]includes/Frontend/Shortcode.php:16-18
[quizwizz_quiz], [quizwizz_library], [quizwizz_subjects]includes/Frontend/Embeds.php:17-22

Blocks registered in includes/Plugin.php:85-141 from build/quiz/block.json:

  • quizwizz/quiz
  • quizwizz/craft
  • quizwizz/library
  • quizwizz/subjects

Block build artifacts in build/quiz/ include block.json, index.js, index.asset.php, editor.css, style-index.css, style-index-rtl.css, render.php.

8. REST endpoints and admin-post/AJAX handlers

REST controllers/routes

ControllerFileLinesRoutes
Quizincludes/Rest/QuizController.php:21-93POST /quiz/{id}/start, POST /attempt/answer, POST /attempt/finish, GET /collection, retired POST /quiz/{id}/submit (410)
Generateincludes/Rest/GenerateController.php:27-95/pool-count, /craft-draft, /reroll, /pdf-preview, /library, /quality-gate/{id}
Adminincludes/Rest/AdminController.php:18-75/admin/quizzes, /admin/questions, /admin/collections
Settingsincludes/Rest/SettingsController.php:17-42/admin/settings read/save
Modelsincludes/Rest/ModelsController.php:13-23/admin/models
Starterincludes/Rest/StarterController.php:13-31/admin/starter-library
BatchTranslateincludes/Ai/BatchTranslate.php:28-69/translate, /translate/{job_id}

Admin-post / AJAX handlers

ActionKindFileLines
admin_post_qw_importadmin-postincludes/Plugin.php:64
qwizz_import_question_packadmin-postincludes/Admin/SettingsPage.php -> includes/Admin/ImportPage.php:14 -> :168-190
qwizz_save_settings_fallbackadmin-postincludes/Admin/SettingsPage.php -> same file:15 -> :191-226
qwizz_install_starter_libraryadmin-postincludes/Admin/StarterPage.php:18 -> :269-285
qwizz_backup_download / restore / deleteadmin-postincludes/Admin/SettingsBackup.php:17-22
qw_craft / nopriv_qw_craftadmin-postincludes/Frontend/CraftHandler.php:22-26
qw_pdf / nopriv_qw_pdfadmin-postincludes/Pdf/PdfHandler.php:6-10
qw_pdf_artifactadmin-postincludes/Pdf/PdfHandler.php:9-10

Additional hooks in includes/QuestionIndex.php:36-46 and includes/Ai/BatchTranslate.php:23-25.

9. Activation, deactivation and uninstall

LifecycleHookTargetFileLines
Activationregister_activation_hookPlugin::activatequizwizz.php:26 / includes/Plugin.php:254-265creates tables via Installer
Deactivationregister_deactivation_hookPlugin::deactivatequizwizz.php:27 / includes/Plugin.php:264-265β€”
Uninstalluninstall.phpdirectuninstall.php:24-171deletes posts, drops tables, options, caps

includes/Installer.php details:

  • SCHEMA_VERSION = '1.6.3' at includes/Installer.php:15.
  • 11 custom tables declared at includes/Installer.php:26-38.
  • dbDelta table definitions at includes/Installer.php:198-337.
  • InnoDB enforcement at includes/Installer.php:412-438.
  • Scheduled cleanup events at includes/Installer.php:388-398.
  • Network migration batching at includes/Installer.php:482-585.
  • Operational options removed on uninstall at includes/Installer.php:718-753.

uninstall.php:24-171:

  • Deletes qw_quiz and qw_question posts in batches.
  • Drops all 11 custom tables.
  • Deletes plugin options and rewrite rules.
  • Removes capabilities from roles.
  • Respects qw_exposure_settings['lifecycle']['preserve_on_uninstall'].

10. Frontend / backend split and assets

  • Backend classes live in includes/Admin/ and includes/Rest/ (settings, import, starter, backup, diagnostics, admin controllers).
  • Frontend classes live in includes/Frontend/ and includes/Pdf/ (quiz flow, generate, PDF, craft, shortcodes, embeds, block render.php).
  • Shared/core classes: includes/Plugin.php, includes/PostTypes.php, includes/Taxonomies.php, includes/Meta.php, includes/Capabilities.php, includes/Installer.php, includes/QuestionIndex.php, includes/ExposureSettings.php, includes/Admin/SiteHealth.php, includes/RateLimiter.php.
  • Raw assets: assets/ (source images/scripts/styles).
  • Built block assets: build/quiz/ only; no node_modules or build config is shipped in the runtime tree.

11. Build approach and code conventions

  • Toolchain is locked with composer.lock, package-lock.json, and tools/toolchain.json per BUILDING.md:7-12.
  • The only npm-built artifact is build/quiz/.
  • Conventions:
    • Namespace QuizWizz.
    • One class per file under includes/.
    • Admin classes under includes/Admin/, frontend under includes/Frontend/, REST under includes/Rest/.
    • Plugin constants use QUIZWIZZ_* prefix in quizwizz.php:17-22.
    • Capability names are prefixed with qw_ / manage_qw_.

12. DB schema and versioning

  • Plugin version: 1.10.0 (quizwizz.php:22).
  • Schema version: 1.6.3 (includes/Installer.php:15, includes/ExposureSettings.php:18, referenced in includes/Admin/SiteHealth.php:54).
  • Custom tables (11):
    • {$prefix}qwizz_rate_limits
    • {$prefix}qwizz_ai_ledger
    • {$prefix}qwizz_ai_reservations
    • {$prefix}qwizz_attempts
    • {$prefix}qwizz_translation_jobs
    • {$prefix}qwizz_settings_backups
    • {$prefix}qwizz_locks
    • {$prefix}qwizz_question_index
    • {$prefix}qwizz_question_subjects
    • {$prefix}qwizz_private_files
    • {$prefix}qwizz_private_file_chunks
  • Key operational options (removed on uninstall, from includes/Installer.php:718-753):
    • qw_exposure_settings
    • qwizz_schema_version
    • qwizz_rewrite_ver
    • qwizz_migration_lock
    • qwizz_migration_error
    • qwizz_cleanup_last_error
    • qwizz_question_index_ready
    • qwizz_question_index_cursor
    • qwizz_quiz_counts_ready
    • qwizz_quiz_count_cursor
    • qwizz_remote_banner_cache
    • qw_opentdb_categories
    • qw_openrouter_models_stale

13. Dead / duplicate / backup files

  • No *.bak, *.old, *.orig, or *.tmp files were found in the plugin tree.
  • No node_modules directory or .git repository is present in the runtime tree.
  • No duplicate class definitions were detected for the audited namespaces.
  • The β€œmessy WIP” description does not manifest as leftover backup or duplicate files in the scanned filesystem.

14. Observations

  1. The qw_question CPT uses supports => false and show_in_rest => false; all taxonomies also set show_in_rest => false. This limits direct block-editor / REST integration for question content.
  2. qw_quiz is public with rewrite slug quiz, menu root qw-dashboard, but show_in_rest => false.
  3. The plugin maintains two version numbers: marketing/plugin version 1.10.0 and database schema version 1.6.3.
  4. The API surface is mixed: modern REST endpoints coexist with legacy admin-post handlers (qw_craft, qw_pdf, qwizz_backup_*, etc.).
  5. Capabilities are granular, but custom capabilities are not mapped to built-in roles in the audited files; mapping may happen elsewhere or at activation.
  6. The build artifact is present and clean, while the build tooling itself is not shipped, matching the locked-toolchain policy described in BUILDING.md.

2026-07-28 bench delta

This page remains the static 2026-07-27 architecture snapshot. Option F added the single-quiz template, UiLanguage, QuizAccess, and shared admin SVG validation; removed the obsolete dashboard script; and hardened service authorization, settings-backup ownership, and result-state handling. Current remediation status and executable evidence live in the canonical masterplan and probe record.


End of report.