<?php /** * Liveticker: Plugin settings class. * * This file contains the derived class for the plugin's settings. * * @package SCLiveticker */ namespace SCLiveticker; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Liveticker admin configuration. * * @since 1.3.0 extracted from {@link Admin} class */ class Settings extends SCLiveticker { /** * Register settings API * * @return void * * @since 1.0.0 * @since 1.3.0 moved from Admin to Settings class */ public static function register_settings(): void { register_setting( 'scliveticker_settings', self::OPTION, array( __CLASS__, 'validate_settings' ) ); // Form sections. add_settings_section( 'scliveticker_settings_general', __( 'General', 'stklcode-liveticker' ), array( __CLASS__, 'settings_general_section' ), 'scliveticker-settings-page' ); // Form fields. add_settings_field( 'enable_ajax', __( 'Use AJAX', 'stklcode-liveticker' ), array( __CLASS__, 'settings_enable_ajax_field' ), 'scliveticker-settings-page', 'scliveticker_settings_general', array( 'label_for' => esc_attr( self::OPTION ) . '-enable-ajax' ) ); add_settings_field( 'poll_interval', __( 'AJAX poll interval', 'stklcode-liveticker' ), array( __CLASS__, 'settings_poll_interval_field' ), 'scliveticker-settings-page', 'scliveticker_settings_general', array( 'label_for' => esc_attr( self::OPTION ) . '-poll-interval' ) ); add_settings_field( 'enable_css', __( 'Default CSS Styles', 'stklcode-liveticker' ), array( __CLASS__, 'settings_enable_css_field' ), 'scliveticker-settings-page', 'scliveticker_settings_general', array( 'label_for' => esc_attr( self::OPTION ) . '-enable-css' ) ); add_settings_field( 'show_feed', __( 'Show RSS feed', 'stklcode-liveticker' ), array( __CLASS__, 'settings_show_feed_field' ), 'scliveticker-settings-page', 'scliveticker_settings_general', array( 'label_for' => esc_attr( self::OPTION ) . '-show-feed' ) ); add_settings_field( 'enable_shortcode', __( 'Shortcode support', 'stklcode-liveticker' ), array( __CLASS__, 'settings_enable_shortcode_field' ), 'scliveticker-settings-page', 'scliveticker_settings_general', array( 'label_for' => esc_attr( self::OPTION ) . '-enable-shortcode' ) ); add_settings_field( 'embedded_script', __( 'Embedded JavaScript', 'stklcode-liveticker' ), array( __CLASS__, 'settings_embedded_script_field' ), 'scliveticker-settings-page', 'scliveticker_settings_general', array( 'label_for' => esc_attr( self::OPTION ) . '-embedded-script' ) ); } /** * Render the settings page. * * @return void * * @since 1.0.0 * @since 1.3.0 moved from Admin to Settings class */ public static function render_settings_page(): void { ?> <div class="wrap"> <div id="icon-options-general" class="icon32"><br></div> <h2>Liveticker <?php esc_html_e( 'Settings', 'stklcode-liveticker' ); ?></h2> <?php if ( isset( $_GET['settings-updated'] ) ) { // phpcs:ignore echo '<div class="updated"><p>' . esc_html__( 'Settings updated successfully.', 'stklcode-liveticker' ) . '</p></div>'; } ?> <form action="options.php" method="post"> <?php settings_fields( 'scliveticker_settings' ); do_settings_sections( 'scliveticker-settings-page' ); submit_button(); ?> </form> </div> <?php } /** * Render general section. * * @return void * * @since 1.0.0 * @since 1.3.0 moved from Admin to Settings class */ public static function settings_general_section(): void { } /** * Render enable AJAX field. * * @return void * * @since 1.0.0 * @since 1.3.0 moved from Admin to Settings class */ public static function settings_enable_ajax_field(): void { self::render_checkbox( 'enable-ajax', '[enable_ajax]', self::$options['enable_ajax'], __( 'Disable this option to not use AJAX update. This means all liveticker widgets and shortcodes are only updated once on site load.', 'stklcode-liveticker' ), __( 'Enable AJAX updates', 'stklcode-liveticker' ) ); } /** * Render AJAX poll interval field. * * @return void * * @since 1.0.0 * @since 1.3.0 moved from Admin to Settings class */ public static function settings_poll_interval_field(): void { $poll_interval = self::$options['poll_interval']; echo '<input id="' . esc_attr( self::OPTION ) . '-poll-interval" type="number" name="' . esc_attr( self::OPTION ) . '[poll_interval]" value="' . esc_attr( $poll_interval ) . '"> '; esc_html_e( 'seconds', 'stklcode-liveticker' ); echo '<p class="description">' . esc_html__( 'Interval (in seconds) to update ticker if AJAX is enabled.', 'stklcode-liveticker' ) . '</p>'; } /** * Render enable css field. * * @return void * * @since 1.0.0 * @since 1.3.0 moved from Admin to Settings class */ public static function settings_enable_css_field(): void { self::render_checkbox( 'enable-css', '[enable_css]', self::$options['enable_css'], __( 'Disable this option to remove the default styling CSS file.', 'stklcode-liveticker' ), __( 'Enable default stylesheet', 'stklcode-liveticker' ) ); } /** * Render enable css field. * * @return void * * @since 1.0.0 * @since 1.3.0 moved from Admin to Settings class */ public static function settings_show_feed_field(): void { self::render_checkbox( 'show-feed', '[show_feed]', self::$options['show_feed'], __( 'Can be overwritten in shortcode.', 'stklcode-liveticker' ), __( 'Show RSS feed in shortcode', 'stklcode-liveticker' ) ); } /** * Render enable shortcode field. * * @return void * * @since 1.2.0 * @since 1.3.0 moved from Admin to Settings class */ public static function settings_enable_shortcode_field(): void { self::render_checkbox( 'enable-shortcode', '[enable_shortcode]', self::$options['enable_shortcode'], __( 'Enable shortcode processing in tick content.', 'stklcode-liveticker' ), __( 'Allow shortcodes in tick content', 'stklcode-liveticker' ) ); } /** * Render embedded script field. * * @return void * * @since 1.2.0 * @since 1.3.0 moved from Admin to Settings class */ public static function settings_embedded_script_field(): void { self::render_checkbox( 'embedded-script', '[embedded_script]', self::$options['embedded_script'], __( 'Allow embedded script evaluation in tick contents. This might be useful for embedded content, e.g. social media integrations.', 'stklcode-liveticker' ) . ' ' . __( 'Be aware that this feature potentially enables cross-site scripting, so make sure content is created by trusted people and only enable this if required.', 'stklcode-liveticker' ), __( 'Allow JavaScript in tick content', 'stklcode-liveticker' ) ); } /** * Validate settings callback. * * @param array $input Input arguments. * * @return array Parsed arguments. * * @since 1.0.0 * @since 1.3.0 moved from Admin to Settings class */ public static function validate_settings( array $input ): array { $defaults = self::default_options(); $result['enable_ajax'] = isset( $input['enable_ajax'] ) ? intval( $input['enable_ajax'] ) : 0; $result['poll_interval'] = isset( $input['poll_interval'] ) ? intval( $input['poll_interval'] ) : $defaults['poll_interval']; $result['enable_css'] = isset( $input['enable_css'] ) ? intval( $input['enable_css'] ) : 0; $result['show_feed'] = isset( $input['show_feed'] ) ? intval( $input['show_feed'] ) : 0; $result['enable_shortcode'] = isset( $input['enable_shortcode'] ) ? intval( $input['enable_shortcode'] ) : 0; $result['embedded_script'] = isset( $input['embedded_script'] ) ? intval( $input['embedded_script'] ) : 0; return $result; } /** * Render a checkbox field. * * @param string $id Field ID. * @param string $name Option name. * @param mixed $value Current value. * @param string $description Description text. * @param string $screen_reader_text Screen reader text. * * @return void */ private static function render_checkbox( string $id, string $name, $value, string $description, string $screen_reader_text ) { ?> <fieldset> <legend class="screen-reader-text"><?php echo esc_html( $screen_reader_text ); ?></legend> <label for="<?php echo esc_attr( self::OPTION . '-' . $id ); ?>"> <input id="<?php echo esc_attr( self::OPTION . '-' . $id ); ?>" name="<?php echo esc_attr( self::OPTION . $name ); ?>" type="checkbox" value="1" <?php checked( $value, 1 ); ?>> <?php esc_html_e( 'Enable', 'stklcode-liveticker' ); ?> </label> <p class="description"><?php echo esc_html( $description ); ?></p> </fieldset> <?php } }