Question Pools and Per-Question Timers
Pro featureQuestion pools draw a random set of questions from your question bank each time a student starts the quiz, so no two attempts are identical. Per-question timers put a countdown on individual questions and enforce it on the server. Both are configured on the quiz's Advanced settings.
Pro feature. Question pools and per-question timers are part of the Advanced Quizzes extension in Learnomy Pro.
What you can do
- Draw a random selection of N questions from the question bank at the moment each student starts the quiz, so every attempt is a different paper.
- Filter the pool draw by question category, difficulty range, and question type, so the random set still matches the exam you intend.
- Give students a fresh, unpredictable question set on each attempt to make sharing answers far less useful.
- Put a countdown on individual questions, set in seconds per question.
- Have the timer enforced on the server at submit -- a question whose time ran out is treated as timed out, not just visually flagged in the browser.
- Show a live per-question countdown badge on the quiz player, with auto-advance on timeout on the Focused layout.

How to use it
Set up a question pool
- Make sure Learnomy Pro is active and the Advanced Quizzes extension is enabled.
- Build up your Question Bank with categorised questions, and set a difficulty (1 to 5) on questions you want to draw by difficulty. See Question Bank.
- Open the quiz and go to its Advanced settings. Open the Pool card.
- Choose the criteria for the draw: the question categories to draw from, an optional difficulty range, an optional question type, and the count (how many questions to select, 1 to 200).
- Save. From now on, each time a student starts the quiz, Learnomy selects that many random questions from the bank matching your criteria and builds the attempt from them.
Set a per-question timer
- In the same Advanced settings, open the Timer card.
- Set the number of seconds for a question. A value of zero means no timer on that question.
- Save. On the quiz player each timed question shows a countdown badge; on the Focused layout the player auto-advances when a question's time runs out.
- Timers are also enforced on the server when the attempt is submitted, so a client that ignores the countdown still has over-time questions marked as timed out.
Settings and options
| Setting | Where | Values | Notes |
|---|---|---|---|
| Pool categories | Advanced settings > Pool card | question category IDs | The categories the random draw pulls from. |
| Difficulty range | Advanced settings > Pool card | min and max, each 1 to 5 | Restricts the draw to questions within the difficulty band. |
| Question type | Advanced settings > Pool card | a question type, optional | Restricts the draw to one type when set. |
| Count | Advanced settings > Pool card | 1 to 200 | How many questions to select per attempt. |
| Per-question timer | Advanced settings > Timer card | seconds (0 = none) | Countdown for that question, enforced on the server at submit. |
The pool draw runs at attempt start, before any conditional logic, so the drawn set defines the questions the rest of the attempt works from.
For developers
- Config storage: question pools, per-slot timers, conditional-logic rules, and rubrics are all stored in one dedicated table,
lrn_pro_aq_config(config_type+object_id, unique together), managed byLearnomy_Pro\Extensions\Advanced_Quizzes\Models\Aq_Config(get()/save()/remove()). Earlier releases stored each of these as an individualwp_optionsrow (learnomy_quiz_pool_{quiz_id},learnomy_quiz_slot_timer_{slot_id}, and so on) -- one option per quiz/question/slot, unindexed and unbounded. A one-time migration (Aq_Config::migrate_from_options(), run on the advanced-quizzes extension's activation) moves any existing rows into the table and deletes the old options, so a site upgrading from an earlier version keeps its pools and timers intact.Pool_Service(create_pool/get_pool/resolve_pool) and the timer REST handlers both read and write throughAq_Config, notwp_options, directly. - Pool draw:
resolve_pool()selects the questions through the Free modelLearnomy\Models\Question::pool_match( $filters, $count ); it is wired into attempt start via thelearnomy_pro_quiz_filter_questionsfilter (priority 5, before conditional logic). - Timer REST:
GET/POST /learnomy-pro/v1/quiz-slots/{id}/timerread and save a slot'sseconds. - Timer enforcement: timer data is injected into the player through the
learnomy_quiz_player_contextfilter; the server enforces elapsed time on thelearnomy_quiz_submittedaction. The live countdown badge and Focused-layout auto-advance are driven byassets/js/quiz-player-timers.js.