<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class WP_OJS_SSO_Registration {
private static $instance = null;
public static function instance() {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
if ( WP_OJS_SSO_Plugin::get_option( 'enable_registration_checkbox' ) ) {
add_action( 'register_form', [ $this, 'render_fields' ] );
add_filter( 'registration_errors', [ $this, 'validate' ], 10, 3 );
add_action( 'user_register', [ $this, 'save' ] );
add_action( 'login_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
}
}
public function enqueue_scripts() {
if ( ! isset( $_GET['action'] ) || 'register' !== $_GET['action'] ) {
// Only on the registration page
global $pagenow;
if ( 'wp-login.php' !== $pagenow ) {
return;
}
}
wp_enqueue_script(
'wp-ojs-sso-conditional',
WP_OJS_SSO_URL . 'assets/js/conditional-fields.js',
[],
WP_OJS_SSO_VERSION,
true
);
wp_enqueue_style(
'wp-ojs-sso-registration',
WP_OJS_SSO_URL . 'assets/css/admin-styles.css',
[],
WP_OJS_SSO_VERSION
);
}
public function render_fields() {
// Ensure the form supports file uploads
echo '<script>document.getElementById("registerform").enctype="multipart/form-data";</script>';
$checkbox_text = WP_OJS_SSO_Plugin::get_option(
'registration_checkbox_text',
__( 'I want to subscribe to the journal', 'wp-ojs-sso-bridge' )
);
$description = WP_OJS_SSO_Plugin::get_option(
'registration_description',
__( 'Your subscription will be activated after verification by an administrator.', 'wp-ojs-sso-bridge' )
);
$requested = ! empty( $_POST['ojs_subscription_requested'] );
?>
<p id="ojs-subscribe-toggle">
<label>
<input type="checkbox" name="ojs_subscription_requested" id="ojs_subscription_requested" value="1"
<?php checked( $requested ); ?> />
<?php echo esc_html( $checkbox_text ); ?>
</label>
<?php if ( $description ) : ?>
<br/><span class="description"><?php echo wp_kses_post( $description ); ?></span>
<?php endif; ?>
</p>
<div id="ojs-subscription-fields" style="<?php echo $requested ? '' : 'display:none;'; ?>">
<p>
<label for="first_name"><?php esc_html_e( 'First Name', 'wp-ojs-sso-bridge' ); ?> <span class="description">*</span></label><br/>
<input type="text" name="first_name" id="first_name" class="input"
value="<?php echo esc_attr( $_POST['first_name'] ?? '' ); ?>" data-conditional-required="1" />
</p>
<p>
<label for="last_name"><?php esc_html_e( 'Last Name', 'wp-ojs-sso-bridge' ); ?> <span class="description">*</span></label><br/>
<input type="text" name="last_name" id="last_name" class="input"
value="<?php echo esc_attr( $_POST['last_name'] ?? '' ); ?>" data-conditional-required="1" />
</p>
<?php
$fields = WP_OJS_SSO_Subscription_Fields::get_fields();
foreach ( $fields as $key => $field ) {
$value = sanitize_text_field( $_POST[ $key ] ?? '' );
echo '<p>';
WP_OJS_SSO_Subscription_Fields::render_field( $key, $field, $value );
echo '</p>';
}
?>
</div>
<?php
}
public function validate( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['ojs_subscription_requested'] ) ) {
return $errors;
}
if ( empty( $_POST['first_name'] ) ) {
$errors->add( 'first_name_error', __( '<strong>Error</strong>: First Name is required for subscription.', 'wp-ojs-sso-bridge' ) );
}
if ( empty( $_POST['last_name'] ) ) {
$errors->add( 'last_name_error', __( '<strong>Error</strong>: Last Name is required for subscription.', 'wp-ojs-sso-bridge' ) );
}
$field_errors = WP_OJS_SSO_Subscription_Fields::validate( $_POST, $_FILES );
foreach ( $field_errors as $code => $msg ) {
$errors->add( $code . '_error', '<strong>' . esc_html__( 'Error', 'wp-ojs-sso-bridge' ) . '</strong>: ' . esc_html( $msg ) );
}
return $errors;
}
public function save( $user_id ) {
if ( empty( $_POST['ojs_subscription_requested'] ) ) {
return;
}
update_user_meta( $user_id, 'ojs_subscription_requested', '1' );
WP_OJS_SSO_Subscription_Fields::save_fields( $user_id, $_POST );
// Media uploads (certificato + bonifico)
if ( ! empty( $_FILES['ojs_student_document']['name'] ) ) {
WP_OJS_SSO_File_Upload::handle_upload( $user_id );
}
if ( ! empty( $_FILES['ojs_bonifico_receipt']['name'] ) && class_exists( 'WP_OJS_SSO_Subscription_Media' ) ) {
WP_OJS_SSO_Subscription_Media::handle_upload( $user_id, 'ojs_bonifico_receipt', WP_OJS_SSO_Subscription_Media::KIND_BONIFICO );
}
// Notify admin
if ( WP_OJS_SSO_Plugin::get_option( 'notify_admin_on_request' ) ) {
$user = get_userdata( $user_id );
$admin_email = get_option( 'admin_email' );
$subject = sprintf(
/* translators: %s: site name */
__( '[%s] New journal subscription request', 'wp-ojs-sso-bridge' ),
get_bloginfo( 'name' )
);
$body = sprintf(
/* translators: 1: username, 2: email, 3: admin users URL */
__( "User \"%1\$s\" (%2\$s) has requested a journal subscription.\n\nReview pending requests: %3\$s", 'wp-ojs-sso-bridge' ),
$user->user_login,
$user->user_email,
admin_url( 'users.php?ojs_sub_filter=requested' )
);
wp_mail( $admin_email, $subject, $body );
}
}
}