Fix invite sign-in, add customizable invite-only text, repair account questions #109

Merged
thatguygriff merged 1 commits from fix/registration-signin-and-account-questions into main 2026-07-24 19:29:53 +00:00
Owner

Three registration fixes reported from live use.

1. Accepting an invite now keeps the student signed in

The registration form was processed inside render() (during the_content), so wp_set_auth_cookie() ran after headers were sent — the cookie never persisted and the new student was bounced back to the logged-out registration page. Submissions are now handled on template_redirect, before any output, via post/redirect/get (?us_registered=…), so the cookie sticks and the student lands logged in. Only invite signups can auto-login at submit time; group-link and self-approval signups still confirm their email first (the login gate blocks them until then), so those are unchanged.

2. Customizable "registration is by invitation only" message

New Invitation-only notice panel on the Student Registration block (attribute inviteOnlyMessage; shortcode invite_only_message). Blank keeps the default wording.

3. Account-registration questions save again

dbDelta does not reliably relax a column from NOT NULL to NULL, so sites created before account-scope questions kept us_questions.offering_id NOT NULL and rejected account inserts with "Column 'offering_id' cannot be null". A one-time, self-healing migration (QuestionRepository::ensureOfferingNullable()) re-applies the nullable definition. It is guarded by its own us_questions_offering_nullable option rather than the version gate, so it heals sites already on the current version, and only marks itself done once the ALTER succeeds.

Tests

  • composer test — 602 tests, 1742 assertions, all pass (added 6)
  • composer lint (PHPStan level 10) — clean
  • composer cs (PHPCS) — clean

🤖 Generated with Claude Code

Three registration fixes reported from live use. ### 1. Accepting an invite now keeps the student signed in The registration form was processed inside `render()` (during `the_content`), so `wp_set_auth_cookie()` ran **after** headers were sent — the cookie never persisted and the new student was bounced back to the logged-out registration page. Submissions are now handled on `template_redirect`, before any output, via post/redirect/get (`?us_registered=…`), so the cookie sticks and the student lands logged in. Only invite signups can auto-login at submit time; group-link and self-approval signups still confirm their email first (the login gate blocks them until then), so those are unchanged. ### 2. Customizable "registration is by invitation only" message New **Invitation-only notice** panel on the Student Registration block (attribute `inviteOnlyMessage`; shortcode `invite_only_message`). Blank keeps the default wording. ### 3. Account-registration questions save again `dbDelta` does not reliably relax a column from `NOT NULL` to `NULL`, so sites created before account-scope questions kept `us_questions.offering_id NOT NULL` and rejected account inserts with *"Column 'offering_id' cannot be null"*. A one-time, self-healing migration (`QuestionRepository::ensureOfferingNullable()`) re-applies the nullable definition. It is guarded by its own `us_questions_offering_nullable` option rather than the version gate, so it heals sites already on the current version, and only marks itself done once the `ALTER` succeeds. ### Tests - `composer test` — 602 tests, 1742 assertions, all pass (added 6) - `composer lint` (PHPStan level 10) — clean - `composer cs` (PHPCS) — clean 🤖 Generated with [Claude Code](https://claude.com/claude-code)
thatguygriff added 1 commit 2026-07-24 19:24:41 +00:00
Fix invite sign-in persistence, add invite-only text option, repair account questions
CI / Tests (PHP 8.1) (pull_request) Successful in 47s
CI / Tests (PHP 8.2) (pull_request) Successful in 46s
CI / No Debug Code (pull_request) Successful in 3s
CI / Tests (PHP 8.3) (pull_request) Successful in 2m37s
CI / PHPStan (pull_request) Successful in 2m52s
CI / Coding Standards (pull_request) Successful in 3m6s
CI / Build Plugin Zip (pull_request) Skipped
242150569b
Three registration fixes reported from live use:

- Accepting an invite now keeps the student signed in. The form was
  processed inside render() during the_content, so wp_set_auth_cookie()
  ran after headers were sent and the cookie never persisted — the new
  student was bounced back to the logged-out registration page. The
  submission is now handled on template_redirect (before output) with a
  post/redirect/get, so the cookie sticks and the student lands logged in.

- The "registration is by invitation only" message is now customisable via
  a new block attribute (inviteOnlyMessage / shortcode invite_only_message),
  falling back to the default wording when blank.

- Account-registration questions save again. dbDelta does not reliably
  relax a column from NOT NULL to NULL, so sites created before account-
  scope questions kept us_questions.offering_id NOT NULL and rejected
  account inserts ("Column 'offering_id' cannot be null"). A one-time,
  self-healing migration (guarded by its own option, not the version gate)
  re-applies the nullable definition on next load.

composer test, composer lint, composer cs all pass.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
thatguygriff merged commit 771942be8b into main 2026-07-24 19:29:53 +00:00
thatguygriff deleted branch fix/registration-signin-and-account-questions 2026-07-24 19:29:53 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Unsupervised/unsupervised-scheduler#109