upskill-event-manager/includes/class-hvac-settings-refactored.php
bengizmo 2cb37d0285 fix: Ensure trainer registration page is publicly accessible
- Added explicit checks to prevent authentication redirects on registration page
- Added ensure_registration_page_public() method with priority 1 to run before other auth checks
- Included registration-pending and training-login pages in public pages list
- Added fallback function in main plugin file to remove auth hooks on registration page

This ensures that users can access /trainer/registration/ without being logged in, as intended for new trainer signups.
2025-07-28 10:30:54 -03:00

411 lines
No EOL
10 KiB
PHP

<?php
/**
* HVAC Community Events Settings - Refactored
*
* Handles plugin settings and configuration
*
* @package HVAC_Community_Events
* @subpackage Includes
* @since 1.1.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class HVAC_Settings_Refactored
*/
class HVAC_Settings_Refactored {
/**
* Settings option name
*
* @var string
*/
private $option_name = 'hvac_ce_settings';
/**
* Settings page slug
*
* @var string
*/
private $page_slug = 'hvac-community-events';
/**
* Settings group
*
* @var string
*/
private $settings_group = 'hvac_ce_settings_group';
/**
* Default settings
*
* @var array
*/
private $defaults = array();
/**
* Cached settings
*
* @var array
*/
private $settings = null;
/**
* Constructor
*/
public function __construct() {
$this->set_defaults();
add_action( 'admin_menu', array( $this, 'add_settings_page' ) );
add_action( 'admin_init', array( $this, 'register_settings' ) );
}
/**
* Set default settings
*/
private function set_defaults() {
$this->defaults = array(
'general' => array(
'debug_mode' => false,
'cache_duration' => 300,
'enable_notifications' => true,
),
'registration' => array(
'auto_approve' => false,
'require_venue' => false,
'email_verification' => true,
'terms_url' => '',
),
'dashboard' => array(
'items_per_page' => 20,
'show_revenue' => true,
'show_capacity' => true,
'date_format' => 'Y-m-d',
),
'notifications' => array(
'admin_email' => get_option( 'admin_email' ),
'from_email' => get_option( 'admin_email' ),
'from_name' => get_option( 'blogname' ),
),
'advanced' => array(
'uninstall_data' => false,
'legacy_support' => false,
),
);
}
/**
* Get all settings
*
* @return array
*/
public function get_settings() {
if ( null === $this->settings ) {
$this->settings = get_option( $this->option_name, array() );
$this->settings = wp_parse_args( $this->settings, $this->defaults );
}
return $this->settings;
}
/**
* Get a specific setting
*
* @param string $section Setting section
* @param string $key Setting key
* @param mixed $default Default value if not set
* @return mixed
*/
public function get( $section, $key, $default = null ) {
$settings = $this->get_settings();
if ( isset( $settings[ $section ][ $key ] ) ) {
return $settings[ $section ][ $key ];
}
if ( null !== $default ) {
return $default;
}
return isset( $this->defaults[ $section ][ $key ] )
? $this->defaults[ $section ][ $key ]
: null;
}
/**
* Update a setting
*
* @param string $section Setting section
* @param string $key Setting key
* @param mixed $value New value
* @return bool
*/
public function update( $section, $key, $value ) {
$settings = $this->get_settings();
if ( ! isset( $settings[ $section ] ) ) {
$settings[ $section ] = array();
}
$settings[ $section ][ $key ] = $value;
$this->settings = $settings;
return update_option( $this->option_name, $settings );
}
/**
* Add settings page to admin menu
*/
public function add_settings_page() {
add_options_page(
__( 'HVAC Community Events Settings', 'hvac-community-events' ),
__( 'HVAC Events', 'hvac-community-events' ),
'manage_options',
$this->page_slug,
array( $this, 'render_settings_page' )
);
}
/**
* Register settings
*/
public function register_settings() {
register_setting(
$this->settings_group,
$this->option_name,
array( $this, 'sanitize_settings' )
);
// General Settings Section
add_settings_section(
'hvac_ce_general',
__( 'General Settings', 'hvac-community-events' ),
array( $this, 'render_section_general' ),
$this->page_slug
);
add_settings_field(
'debug_mode',
__( 'Debug Mode', 'hvac-community-events' ),
array( $this, 'render_field_checkbox' ),
$this->page_slug,
'hvac_ce_general',
array(
'label_for' => 'debug_mode',
'section' => 'general',
'key' => 'debug_mode',
'description' => __( 'Enable debug logging', 'hvac-community-events' ),
)
);
add_settings_field(
'cache_duration',
__( 'Cache Duration', 'hvac-community-events' ),
array( $this, 'render_field_number' ),
$this->page_slug,
'hvac_ce_general',
array(
'label_for' => 'cache_duration',
'section' => 'general',
'key' => 'cache_duration',
'description' => __( 'Cache duration in seconds', 'hvac-community-events' ),
'min' => 60,
'max' => 3600,
)
);
// Registration Settings Section
add_settings_section(
'hvac_ce_registration',
__( 'Registration Settings', 'hvac-community-events' ),
array( $this, 'render_section_registration' ),
$this->page_slug
);
add_settings_field(
'auto_approve',
__( 'Auto Approve', 'hvac-community-events' ),
array( $this, 'render_field_checkbox' ),
$this->page_slug,
'hvac_ce_registration',
array(
'label_for' => 'auto_approve',
'section' => 'registration',
'key' => 'auto_approve',
'description' => __( 'Automatically approve new trainer registrations', 'hvac-community-events' ),
)
);
// Add more sections and fields as needed
}
/**
* Render settings page
*/
public function render_settings_page() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
// Show success message if settings were saved
if ( isset( $_GET['settings-updated'] ) ) {
add_settings_error(
'hvac_ce_settings',
'hvac_ce_settings_message',
__( 'Settings saved.', 'hvac-community-events' ),
'updated'
);
}
settings_errors( 'hvac_ce_settings' );
?>
<div class="wrap">
<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
<form action="options.php" method="post">
<?php
settings_fields( $this->settings_group );
do_settings_sections( $this->page_slug );
submit_button( __( 'Save Settings', 'hvac-community-events' ) );
?>
</form>
</div>
<?php
}
/**
* Render general section description
*/
public function render_section_general() {
echo '<p>' . __( 'Configure general plugin settings.', 'hvac-community-events' ) . '</p>';
}
/**
* Render registration section description
*/
public function render_section_registration() {
echo '<p>' . __( 'Configure trainer registration settings.', 'hvac-community-events' ) . '</p>';
}
/**
* Render checkbox field
*
* @param array $args Field arguments
*/
public function render_field_checkbox( $args ) {
$value = $this->get( $args['section'], $args['key'] );
?>
<input type="checkbox"
id="<?php echo esc_attr( $args['label_for'] ); ?>"
name="<?php echo esc_attr( $this->option_name ); ?>[<?php echo esc_attr( $args['section'] ); ?>][<?php echo esc_attr( $args['key'] ); ?>]"
value="1"
<?php checked( 1, $value, true ); ?>
/>
<?php if ( ! empty( $args['description'] ) ) : ?>
<p class="description"><?php echo esc_html( $args['description'] ); ?></p>
<?php endif;
}
/**
* Render number field
*
* @param array $args Field arguments
*/
public function render_field_number( $args ) {
$value = $this->get( $args['section'], $args['key'] );
?>
<input type="number"
id="<?php echo esc_attr( $args['label_for'] ); ?>"
name="<?php echo esc_attr( $this->option_name ); ?>[<?php echo esc_attr( $args['section'] ); ?>][<?php echo esc_attr( $args['key'] ); ?>]"
value="<?php echo esc_attr( $value ); ?>"
min="<?php echo esc_attr( $args['min'] ?? 0 ); ?>"
max="<?php echo esc_attr( $args['max'] ?? '' ); ?>"
class="regular-text"
/>
<?php if ( ! empty( $args['description'] ) ) : ?>
<p class="description"><?php echo esc_html( $args['description'] ); ?></p>
<?php endif;
}
/**
* Render text field
*
* @param array $args Field arguments
*/
public function render_field_text( $args ) {
$value = $this->get( $args['section'], $args['key'] );
?>
<input type="text"
id="<?php echo esc_attr( $args['label_for'] ); ?>"
name="<?php echo esc_attr( $this->option_name ); ?>[<?php echo esc_attr( $args['section'] ); ?>][<?php echo esc_attr( $args['key'] ); ?>]"
value="<?php echo esc_attr( $value ); ?>"
class="regular-text"
/>
<?php if ( ! empty( $args['description'] ) ) : ?>
<p class="description"><?php echo esc_html( $args['description'] ); ?></p>
<?php endif;
}
/**
* Sanitize settings
*
* @param array $input Raw input data
* @return array Sanitized data
*/
public function sanitize_settings( $input ) {
$sanitized = array();
// General settings
if ( isset( $input['general'] ) ) {
$sanitized['general'] = array(
'debug_mode' => ! empty( $input['general']['debug_mode'] ),
'cache_duration' => absint( $input['general']['cache_duration'] ?? 300 ),
'enable_notifications' => ! empty( $input['general']['enable_notifications'] ),
);
// Update debug mode in logger
HVAC_Logger::set_enabled( $sanitized['general']['debug_mode'] );
}
// Registration settings
if ( isset( $input['registration'] ) ) {
$sanitized['registration'] = array(
'auto_approve' => ! empty( $input['registration']['auto_approve'] ),
'require_venue' => ! empty( $input['registration']['require_venue'] ),
'email_verification' => ! empty( $input['registration']['email_verification'] ),
'terms_url' => esc_url_raw( $input['registration']['terms_url'] ?? '' ),
);
}
// Dashboard settings
if ( isset( $input['dashboard'] ) ) {
$sanitized['dashboard'] = array(
'items_per_page' => absint( $input['dashboard']['items_per_page'] ?? 20 ),
'show_revenue' => ! empty( $input['dashboard']['show_revenue'] ),
'show_capacity' => ! empty( $input['dashboard']['show_capacity'] ),
'date_format' => sanitize_text_field( $input['dashboard']['date_format'] ?? 'Y-m-d' ),
);
}
// Merge with existing settings to preserve sections not being updated
$existing = $this->get_settings();
$sanitized = wp_parse_args( $sanitized, $existing );
return $sanitized;
}
/**
* Get instance of settings class (singleton)
*
* @return self
*/
public static function get_instance() {
static $instance = null;
if ( null === $instance ) {
$instance = new self();
}
return $instance;
}
}