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
| Path | Kind | Notes |
|---|---|---|
quizwizz.php | bootstrap | main plugin file, header, constants, lifecycle hooks |
uninstall.php | lifecycle | uninstall routine |
readme.txt | metadata | header/version copy |
BUILDING.md | docs | locked toolchain description |
LICENSE, SOURCE-PROVENANCE.md, THIRD-PARTY-NOTICES.md | legal | license/provenance notices |
includes/ | PHP source | all runtime classes |
assets/ | raw assets | frontend/backend source assets |
build/quiz/ | build artifact | compiled block assets only |
languages/ | i18n | text-domain language files |
provenance/ | metadata | source-provenance data |
vendor/ | dependencies | Composer-managed packages |
2. Plugin header and versioning
Verified from quizwizz.php:1-29 and readme.txt:1-9:
| Field | Value | Anchor |
|---|---|---|
| Plugin Name | QuizWizz | quizwizz.php:7 |
| Version | 1.10.0 | quizwizz.php:9, quizwizz.php:22 |
| Requires PHP | 8.3 | quizwizz.php:11 |
| Requires WP | 6.3 | quizwizz.php:12 |
| Tested up to | 7.0 | quizwizz.php:13 |
| Text Domain | quizwizz | quizwizz.php:14 |
| Domain Path | /languages | quizwizz.php:15 |
| Constants | QUIZWIZZ_FILE, QUIZWIZZ_PATH, QUIZWIZZ_URL, QUIZWIZZ_VERSION | quizwizz.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:
| Subsystem | Registration point | Implementation |
|---|---|---|
| CPTs / taxonomies | boot() | includes/PostTypes.php, includes/Taxonomies.php |
| Meta boxes | boot() | includes/Meta.php |
| Blocks | register_blocks() | includes/Plugin.php:85-141 |
| REST controllers | boot() | Quiz, Generate, Admin, Settings, Models, Starter, BatchTranslate |
| Admin pages | boot() | DashboardPage, ImportPage, SettingsPage, StarterPage |
| Admin-post handler | admin_post_qw_import | includes/Plugin.php:64 |
| Frontend shortcodes | boot() | includes/Frontend/Shortcode.php, includes/Frontend/Embeds.php |
| Frontend handlers | boot() | includes/Frontend/CraftHandler.php, includes/Pdf/PdfHandler.php |
| Admin shell assets | enqueue_admin_shell() | includes/Plugin.php:143-166 |
| Body class / title filters | body_class(), maybe_blank_craft_title() | includes/Plugin.php:223-252 |
| Block editor localizations | localize_block_editor() | includes/Plugin.php:168-215 |
REST namespace is quizwizz/v1.
4. Custom post types and taxonomies
From includes/PostTypes.php:7-107:
| CPT | Public | Rewrite | Menu | REST | Supports |
|---|---|---|---|---|---|
qw_quiz | yes | quiz | qw-dashboard | false | ['title'] |
qw_question | no | β | hidden | false | false (none) |
From includes/Taxonomies.php:8-89:
| Taxonomy | Public | Hierarchical | Rewrite | UI | REST |
|---|---|---|---|---|---|
qw_subject | yes | yes | subject | visible | false |
qw_difficulty | no | no | β | hidden | false |
qw_language | no | no | β | hidden | false |
qw_tag | no | no | β | hidden | false |
Subject icon meta is attached via taxonomy hooks in includes/Taxonomies.php.
5. Capabilities
From includes/Capabilities.php:7-74:
manage_quizwizzedit_qw_questionspublish_qw_questionsedit_qw_quizzespublish_qw_quizzesmanage_qw_taxonomiesassign_qw_taxonomies
6. Admin pages
| Page slug | Parent | File | Lines |
|---|---|---|---|
qw-dashboard | top-level | includes/Admin/DashboardPage.php | :21-40 |
qw-import | qw-dashboard | includes/Admin/ImportPage.php | :21-28 |
qw-settings | qw-dashboard | includes/Admin/SettingsPage.php | :19-27 |
qw-get-started | qw-dashboard | includes/Admin/StarterPage.php | :37-47 |
7. Shortcodes and blocks
Shortcodes:
| Shortcode | File | Lines |
|---|---|---|
[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/quizquizwizz/craftquizwizz/libraryquizwizz/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
| Controller | File | Lines | Routes |
|---|---|---|---|
| Quiz | includes/Rest/QuizController.php | :21-93 | POST /quiz/{id}/start, POST /attempt/answer, POST /attempt/finish, GET /collection, retired POST /quiz/{id}/submit (410) |
| Generate | includes/Rest/GenerateController.php | :27-95 | /pool-count, /craft-draft, /reroll, /pdf-preview, /library, /quality-gate/{id} |
| Admin | includes/Rest/AdminController.php | :18-75 | /admin/quizzes, /admin/questions, /admin/collections |
| Settings | includes/Rest/SettingsController.php | :17-42 | /admin/settings read/save |
| Models | includes/Rest/ModelsController.php | :13-23 | /admin/models |
| Starter | includes/Rest/StarterController.php | :13-31 | /admin/starter-library |
| BatchTranslate | includes/Ai/BatchTranslate.php | :28-69 | /translate, /translate/{job_id} |
Admin-post / AJAX handlers
| Action | Kind | File | Lines |
|---|---|---|---|
admin_post_qw_import | admin-post | includes/Plugin.php | :64 |
qwizz_import_question_pack | admin-post | includes/Admin/SettingsPage.php -> includes/Admin/ImportPage.php | :14 -> :168-190 |
qwizz_save_settings_fallback | admin-post | includes/Admin/SettingsPage.php -> same file | :15 -> :191-226 |
qwizz_install_starter_library | admin-post | includes/Admin/StarterPage.php | :18 -> :269-285 |
qwizz_backup_download / restore / delete | admin-post | includes/Admin/SettingsBackup.php | :17-22 |
qw_craft / nopriv_qw_craft | admin-post | includes/Frontend/CraftHandler.php | :22-26 |
qw_pdf / nopriv_qw_pdf | admin-post | includes/Pdf/PdfHandler.php | :6-10 |
qw_pdf_artifact | admin-post | includes/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
| Lifecycle | Hook | Target | File | Lines |
|---|---|---|---|---|
| Activation | register_activation_hook | Plugin::activate | quizwizz.php:26 / includes/Plugin.php:254-265 | creates tables via Installer |
| Deactivation | register_deactivation_hook | Plugin::deactivate | quizwizz.php:27 / includes/Plugin.php:264-265 | β |
| Uninstall | uninstall.php | direct | uninstall.php:24-171 | deletes posts, drops tables, options, caps |
includes/Installer.php details:
SCHEMA_VERSION = '1.6.3'atincludes/Installer.php:15.- 11 custom tables declared at
includes/Installer.php:26-38. dbDeltatable definitions atincludes/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_quizandqw_questionposts 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/andincludes/Rest/(settings, import, starter, backup, diagnostics, admin controllers). - Frontend classes live in
includes/Frontend/andincludes/Pdf/(quiz flow, generate, PDF, craft, shortcodes, embeds, blockrender.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; nonode_modulesor build config is shipped in the runtime tree.
11. Build approach and code conventions
- Toolchain is locked with
composer.lock,package-lock.json, andtools/toolchain.jsonperBUILDING.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 underincludes/Frontend/, REST underincludes/Rest/. - Plugin constants use
QUIZWIZZ_*prefix inquizwizz.php:17-22. - Capability names are prefixed with
qw_/manage_qw_.
- Namespace
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 inincludes/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_settingsqwizz_schema_versionqwizz_rewrite_verqwizz_migration_lockqwizz_migration_errorqwizz_cleanup_last_errorqwizz_question_index_readyqwizz_question_index_cursorqwizz_quiz_counts_readyqwizz_quiz_count_cursorqwizz_remote_banner_cacheqw_opentdb_categoriesqw_openrouter_models_stale
13. Dead / duplicate / backup files
- No
*.bak,*.old,*.orig, or*.tmpfiles were found in the plugin tree. - No
node_modulesdirectory or.gitrepository 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
- The
qw_questionCPT usessupports => falseandshow_in_rest => false; all taxonomies also setshow_in_rest => false. This limits direct block-editor / REST integration for question content. qw_quizis public with rewrite slugquiz, menu rootqw-dashboard, butshow_in_rest => false.- The plugin maintains two version numbers: marketing/plugin version
1.10.0and database schema version1.6.3. - The API surface is mixed: modern REST endpoints coexist with legacy
admin-posthandlers (qw_craft,qw_pdf,qwizz_backup_*, etc.). - Capabilities are granular, but custom capabilities are not mapped to built-in roles in the audited files; mapping may happen elsewhere or at activation.
- 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.