- 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.
411 lines
No EOL
10 KiB
PHP
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;
|
|
}
|
|
}
|