array( 'id' => true, 'class' => true, 'style' => true, 'data-*' => true, ), 'span' => array( 'id' => true, 'class' => true, 'style' => true, 'data-*' => true, ), 'ins' => array( 'class' => true, 'style' => true, 'data-*' => true, ), 'noscript' => array(), ); return wp_kses( $value, $allowed ); } /** * Register the plugin settings * * @return void */ function adxbyms_register_settings() { // Main slot/plugin-wide settings $settings = array( 'adxbyms_enabled', 'adxbyms_popup_enabled', 'adxbyms_popup_network_code', 'adxbyms_popup_option', 'adxbyms_popup_scroll_trigger', 'adxbyms_ad2_enabled', 'adxbyms_ad2_network_code', 'adxbyms_ad2_keywords', 'adxbyms_anchor_enabled', 'adxbyms_anchor_network_code', 'adxbyms_anchor_position', 'adxbyms_offerwall_onscroll_enabled', 'adxbyms_offerwall_onscroll_network_code', 'adxbyms_offerwall_onscroll_logo_url', 'adxbyms_interstitial_enabled', 'adxbyms_interstitial_network_code', 'adxbyms_custom_enabled', 'adxbyms_header_code', 'adxbyms_footer_code', 'adxbyms_ads_txt_enabled', 'adxbyms_ads_txt_code', 'adxbyms_slot_enabled', ); foreach ( $settings as $opt ) { // Skip custom header/footer code for special handling below if ( 'adxbyms_header_code' === $opt || 'adxbyms_footer_code' === $opt || 'adxbyms_ads_txt_code' === $opt ) { continue; } register_setting( 'adxbyms_settings', $opt, array( 'sanitize_callback' => 'adxbyms_sanitize_option', ) ); } // Register header/footer code with custom sanitization register_setting( 'adxbyms_settings', 'adxbyms_header_code', array( 'type' => 'string', 'sanitize_callback' => 'adxbyms_sanitize_raw_code', 'show_in_rest' => false, ) ); register_setting( 'adxbyms_settings', 'adxbyms_footer_code', array( 'type' => 'string', 'sanitize_callback' => 'adxbyms_sanitize_raw_code', 'show_in_rest' => false, ) ); // ads.txt is plain text register_setting( 'adxbyms_settings', 'adxbyms_ads_txt_code', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_textarea_field', 'show_in_rest' => false, ) ); // Popup scroll trigger (60-100 percentage) register_setting( 'adxbyms_settings', 'adxbyms_popup_scroll_trigger', array( 'sanitize_callback' => function ( $value ) { $value = absint( $value ); if ( $value < 60 ) { return 60; } return ( $value >= 60 && $value <= 100 ) ? $value : 60; }, 'show_in_rest' => false, ) ); // Subslot (Display Slot) settings — register for all 10 subslots for ( $i = 1; $i <= 10; $i++ ) { register_setting( 'adxbyms_settings', "adxbyms_slot_{$i}_enabled", array( 'sanitize_callback' => 'adxbyms_sanitize_option' ) ); register_setting( 'adxbyms_settings', "adxbyms_slot_{$i}_network_code", array( 'sanitize_callback' => 'sanitize_text_field' ) ); register_setting( 'adxbyms_settings', "adxbyms_slot_{$i}_sizes", array( 'sanitize_callback' => 'adxbyms_sanitize_option' ) ); register_setting( 'adxbyms_settings', "adxbyms_slot_{$i}_pages", array( 'sanitize_callback' => 'adxbyms_sanitize_option' ) ); register_setting( 'adxbyms_settings', "adxbyms_slot_{$i}_insertion", array( 'sanitize_callback' => 'sanitize_text_field' ) ); register_setting( 'adxbyms_settings', "adxbyms_slot_{$i}_alignment", array( 'sanitize_callback' => 'sanitize_text_field' ) ); register_setting( 'adxbyms_settings', "adxbyms_slot_{$i}_text", array( 'sanitize_callback' => 'sanitize_text_field' ) ); register_setting( 'adxbyms_settings', "adxbyms_slot_{$i}_offset", array( 'sanitize_callback' => 'absint' ) ); register_setting( 'adxbyms_settings', "adxbyms_slot_{$i}_devices", array( 'sanitize_callback' => 'adxbyms_sanitize_option' ) ); } // Set default values for booleans if not already present (first install) $booleans = array( 'adxbyms_enabled', 'adxbyms_ads_txt_enabled', 'adxbyms_slot_enabled', 'adxbyms_popup_enabled', 'adxbyms_ad2_enabled', 'adxbyms_anchor_enabled', 'adxbyms_offerwall_onscroll_enabled', 'adxbyms_interstitial_enabled', 'adxbyms_custom_enabled', ); foreach ( $booleans as $b ) { if ( get_option( $b ) === false ) { update_option( $b, 'false' ); } } // Defaults for all subslot enable toggles for ( $i = 1; $i <= 10; $i++ ) { $opt = "adxbyms_slot_{$i}_enabled"; if ( get_option( $opt ) === false ) { update_option( $opt, 'false' ); } } // Defaults for all subslot device toggles for ( $i = 1; $i <= 10; $i++ ) { $opt = "adxbyms_slot_{$i}_devices"; if ( get_option( $opt ) === false ) { update_option( $opt, array( 'desktop', 'mobile' ) ); } } // Default for anchor position if ( get_option( 'adxbyms_anchor_position' ) === false ) { update_option( 'adxbyms_anchor_position', 'TOP_ANCHOR' ); } } add_action( 'admin_init', 'adxbyms_register_settings' ); /** * Sanitizer callback for all plugin options. * * @param mixed $value The value to sanitize. * @return mixed Sanitized value. */ function adxbyms_sanitize_option( $value ) { // Arrays: sanitize recursively (for checkboxes). if ( is_array( $value ) ) { return array_map( 'sanitize_text_field', $value ); } // Allow