Send students to a chosen page when registration succeeds
CI / Tests (PHP 8.2) (pull_request) Successful in 49s
CI / Tests (PHP 8.1) (pull_request) Successful in 1m0s
CI / Coding Standards (pull_request) Successful in 2m51s
CI / PHPStan (pull_request) Successful in 2m57s
CI / Tests (PHP 8.3) (pull_request) Successful in 2m40s
CI / Build Plugin Zip (pull_request) Skipped
CI / No Debug Code (pull_request) Successful in 2s
CI / Tests (PHP 8.2) (pull_request) Successful in 49s
CI / Tests (PHP 8.1) (pull_request) Successful in 1m0s
CI / Coding Standards (pull_request) Successful in 2m51s
CI / PHPStan (pull_request) Successful in 2m57s
CI / Tests (PHP 8.3) (pull_request) Successful in 2m40s
CI / Build Plugin Zip (pull_request) Skipped
CI / No Debug Code (pull_request) Successful in 2s
The Student Registration block's "After email confirmation" panel becomes "After registration": the page it selects is now where a newly registered student continues to, and a new autoRedirect toggle sends them there instead of showing the link. Only the two finished states qualify (RegistrationPage::isRegistrationComplete): an invited student who is now logged in, and a self-signup back from the emailed confirmation link. A validation error, an expired confirmation link, and the intermediate "check your email" step all stay on the page so their message is read. The invited-student success previously had no link at all; it gains a "Continue to your account" one. That path deliberately has no WordPress-login-screen fallback — pointing someone already signed in at the login screen helps nobody — so continueUrl() distinguishes "no page chosen" from "page chosen", and the redirect does nothing until one is picked. Closes #115 Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+49
-4
@@ -109,6 +109,7 @@ class BlockRegistrar {
|
||||
'type' => 'number',
|
||||
'default' => 0,
|
||||
],
|
||||
'autoRedirect' => $redirectToggle,
|
||||
'inviteOnlyMessage' => [
|
||||
'type' => 'string',
|
||||
'default' => '',
|
||||
@@ -170,10 +171,11 @@ class BlockRegistrar {
|
||||
/**
|
||||
* Server-side auto-redirect for blocks that opt in via their autoRedirect
|
||||
* attribute: logged-out visitors on a page containing the booking block
|
||||
* are sent to its login page, and logged-in visitors on a page containing
|
||||
* the student-login block are sent to its booking page. Hooked on
|
||||
* `template_redirect` because block rendering happens after output has
|
||||
* started, too late to send a Location header.
|
||||
* are sent to its login page, logged-in visitors on a page containing the
|
||||
* student-login block are sent to its booking page, and a student who has
|
||||
* just finished registering is sent to the register block's chosen page.
|
||||
* Hooked on `template_redirect` because block rendering happens after
|
||||
* output has started, too late to send a Location header.
|
||||
*/
|
||||
public function maybeAutoRedirect(): void {
|
||||
if ( is_admin() || ! is_singular() ) {
|
||||
@@ -185,6 +187,10 @@ class BlockRegistrar {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( $this->maybeRedirectAfterRegistration( $post ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( is_user_logged_in() ) {
|
||||
$attrs = $this->firstBlockAttrs( $post->post_content, 'us-scheduler/student-login' );
|
||||
if ( null === $attrs || ! Val::bool( $attrs['autoRedirect'] ?? false ) ) {
|
||||
@@ -217,6 +223,45 @@ class BlockRegistrar {
|
||||
$this->redirect( $this->bookingPage->loginUrl( $loginPageId ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a student whose registration has just completed to the register
|
||||
* block's chosen page, when the block opts in. Only the finished states
|
||||
* qualify (see {@see RegistrationPage::isRegistrationComplete()}): a
|
||||
* failure or the "check your email" step stays put so its message is read.
|
||||
* Unlike the other blocks there is no login-screen fallback — with no page
|
||||
* chosen there is nowhere to send them, so the link is shown instead.
|
||||
*
|
||||
* Returns whether the redirect was issued (it only ever returns in tests;
|
||||
* {@see redirect()} exits in production).
|
||||
*/
|
||||
private function maybeRedirectAfterRegistration( \WP_Post $post ): bool {
|
||||
// Checked before parsing the content because it is a couple of query
|
||||
// args, whereas every front-end request would otherwise pay for a
|
||||
// third block scan.
|
||||
if ( ! $this->registrationPage->isRegistrationComplete() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$attrs = $this->firstBlockAttrs( $post->post_content, 'us-scheduler/student-register' );
|
||||
if ( null === $attrs || ! Val::bool( $attrs['autoRedirect'] ?? false ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pageId = Val::int( $attrs['loginPageId'] ?? 0 );
|
||||
if ( $pageId === $post->ID ) {
|
||||
return false; // Redirecting the page to itself would loop.
|
||||
}
|
||||
|
||||
$url = $this->registrationPage->continueUrl( $pageId );
|
||||
if ( null === $url ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->redirect( $url );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attributes of the first occurrence of the named block in the content,
|
||||
* searching inner blocks so blocks nested inside groups or columns are
|
||||
|
||||
Reference in New Issue
Block a user