From 372f981a0896ce81aafcfa38b6484e3b17ea87f7 Mon Sep 17 00:00:00 2001 From: James Griffin Date: Sun, 7 Jun 2026 10:24:33 -0300 Subject: [PATCH] Add registration-page selector to the Invites page Invitation links previously pointed at the site home page, which usually does not host the [us_student_register] shortcode. Let the studio admin choose the registration page (stored in the us_registration_page_id option); invitation links now point there, falling back to the home page when unset (with a warning notice). - RegistrationController: OPTION_PAGE constant; set_page action; pass the page id/url to the template. - templates/admin/invites.php: wp_dropdown_pages selector + save; build the invite link from the selected page. - Doc updated. Co-Authored-By: Claude Opus 4.8 --- docs/features/account-registration.md | 1 + src/Auth/RegistrationController.php | 13 ++++++++- templates/admin/invites.php | 40 +++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/docs/features/account-registration.md b/docs/features/account-registration.md index 16297ce..e136211 100644 --- a/docs/features/account-registration.md +++ b/docs/features/account-registration.md @@ -41,6 +41,7 @@ recorded in `us_policy_acceptances` with `registration_type = account` and ## Admin Interface **Invites** in wp-admin (`manage_students`, studio admin only): +- Select the **registration page** (the page hosting `[us_student_register]`), stored in the `us_registration_page_id` option; invitation links point there (falling back to the home page if unset) - Invite an email (creates a pending invite + link) - List pending invites; revoke an invite diff --git a/src/Auth/RegistrationController.php b/src/Auth/RegistrationController.php index f70f5e6..2bc1308 100644 --- a/src/Auth/RegistrationController.php +++ b/src/Auth/RegistrationController.php @@ -5,6 +5,11 @@ namespace Unsupervised\Schedular\Auth; class RegistrationController { + /** + * Option storing the page ID that hosts the [us_student_register] shortcode. + */ + public const OPTION_PAGE = 'us_registration_page_id'; + public function __construct( private InviteRepository $invites ) {} public function renderPage(): void { @@ -16,7 +21,9 @@ class RegistrationController { $this->handleFormAction(); } - $pendingInvites = $this->invites->findPending(); + $pendingInvites = $this->invites->findPending(); + $registrationPageId = (int) get_option( self::OPTION_PAGE, 0 ); + $registrationPageUrl = $registrationPageId > 0 ? (string) get_permalink( $registrationPageId ) : ''; include USC_PLUGIN_DIR . 'templates/admin/invites.php'; } @@ -26,6 +33,10 @@ class RegistrationController { // phpcs:disable WordPress.Security.NonceVerification.Missing $action = sanitize_key( wp_unslash( $_POST['usc_action'] ?? '' ) ); + if ( 'set_page' === $action ) { + update_option( self::OPTION_PAGE, absint( $_POST['registration_page_id'] ?? 0 ) ); + } + if ( 'invite' === $action ) { $email = sanitize_email( wp_unslash( $_POST['email'] ?? '' ) ); diff --git a/templates/admin/invites.php b/templates/admin/invites.php index b5ce256..3861330 100644 --- a/templates/admin/invites.php +++ b/templates/admin/invites.php @@ -5,12 +5,46 @@ if (! defined('ABSPATH')) { exit; } -/** @var list<\Unsupervised\Schedular\Auth\Invite> $pendingInvites */ +/** + * @var list<\Unsupervised\Schedular\Auth\Invite> $pendingInvites + * @var int $registrationPageId + * @var string $registrationPageUrl + */ ?>

+

+
+ + + + + + + +
+ 'registration_page_id', + 'id' => 'registration_page_id', + 'selected' => $registrationPageId, + 'show_option_none' => esc_html__('— Select a page —', 'unsupervised-schedular'), + 'option_none_value' => '0', + ] + ); + ?> +

+
+ +
+ + +

+ +

@@ -38,13 +72,13 @@ if (! defined('ABSPATH')) { + - token, home_url('/'))); ?> + token, $linkBase)); ?> email); ?> -