'; } /** * Returns button link html. * * @param string $text Text. * @param string $w3tc_url URL. * @param bool $new_window Open link in a new window. * @param string $class_value Class. * @param string $w3tc_name Name. * * @return string */ public static function button_link( $text, $w3tc_url, $new_window = false, $class_value = 'button', $w3tc_name = '' ) { $w3tc_url = str_replace( '&', '&', $w3tc_url ); if ( $new_window ) { $onclick = sprintf( 'window.open(\'%s\');', addslashes( $w3tc_url ) ); } else { $onclick = ''; if ( strpos( $class_value, 'w3tc-button-ignore-change' ) >= 0 ) { $onclick .= 'w3tc_beforeupload_unbind(); '; } $onclick .= sprintf( 'document.location.href=\'%s\';', addslashes( $w3tc_url ) ); } return self::button( $text, $onclick, $class_value, $w3tc_name ); } /** * Generates a URL with a nonce. * * @param array $addon { * Addon parameters used to build the URL. * * @type string $page Optional. The page parameter. Defaults to 'w3tc_dashboard'. * } * * @return string The generated URL with a nonce. */ public static function url( $addon ) { if ( ! isset( $addon['page'] ) ) { $addon['page'] = Util_Request::get_string( 'page', 'w3tc_dashboard' ); } $w3tc_url = 'admin.php'; $amp = '?'; foreach ( $addon as $w3tc_key => $w3tc_value ) { $w3tc_url .= $amp . rawurlencode( $w3tc_key ) . '=' . rawurlencode( $w3tc_value ); $amp = '&'; } $admin_action = ''; foreach ( $addon as $w3tc_key => $w3tc_value ) { // First w3tc_* key names the dispatcher handler (e.g. w3tc_default_config_state_master). if ( 0 === \strpos( $w3tc_key, 'w3tc_' ) && 'page' !== $w3tc_key ) { $admin_action = $w3tc_key; break; } } // Addon arrays without a dispatcher key are plain page links; no nonce needed. if ( '' !== $admin_action ) { $w3tc_url = Util_Nonce::admin_nonce_url( $w3tc_url, $admin_action ); } return $w3tc_url; } /** * Returns hide note button html * * @param string $text Text. * @param string $w3tc_note Note. * @param string $redirect Redirect. * @param boolean $admin If to use config admin. * @param string $page Page. * @param string $custom_method Custom method. * * @return string */ public static function button_hide_note( $text, $w3tc_note, $redirect = '', $admin = false, $page = '', $custom_method = 'w3tc_default_hide_note' ) { if ( '' === $page ) { $page = Util_Request::get_string( 'page', 'w3tc_dashboard' ); } $w3tc_url = sprintf( 'admin.php?page=%s&%s¬e=%s', $page, $custom_method, $w3tc_note ); if ( $admin ) { $w3tc_url .= '&admin=1'; } if ( '' !== $redirect ) { $w3tc_url .= '&redirect=' . rawurlencode( $redirect ); } $w3tc_url = Util_Nonce::admin_nonce_url( $w3tc_url, $custom_method ); return self::button_link( $text, $w3tc_url, false, 'button', 'w3tc_hide_' . $custom_method ); } /** * Hide note button. * * @param array $parameters { * Parameters for generating the hide note button. * * @type string $w3tc_key The configuration key used to generate the button ID. * } * * @return string The generated button HTML. */ public static function button_hide_note2( $parameters ) { return self::button_link( __( 'Hide this message', 'w3-total-cache' ), self::url( $parameters ), false, 'button', 'w3tc_hide_' . self::config_key_to_http_name( $parameters['key'] ) ); } /** * Action button * * @param string $action Action. * @param string $w3tc_url URL. * @param string $class_value Class. * @param bool $new_window New window flag. * * @return string */ public static function action_button( $action, $w3tc_url, $class_value = '', $new_window = false ) { return self::button_link( $action, $w3tc_url, $new_window, $class_value ); } /** * Returns popup button html * * @param string $text Text. * @param string $action Action. * @param string $params Parameters. * @param integer $width Width. * @param integer $height Height. * * @return string */ public static function button_popup( $text, $action, $params = '', $width = 800, $height = 600 ) { $handler = 'w3tc_' . $action; $w3tc_url = Util_Nonce::admin_nonce_url( sprintf( 'admin.php?page=w3tc_dashboard&%s%s', $handler, ( '' !== $params ? '&' . $params : '' ) ), $handler ); $w3tc_url = str_replace( '&', '&', $w3tc_url ); $onclick = sprintf( 'window.open(\'%s\', \'%s\', \'width=%d,height=%d,status=no,toolbar=no,menubar=no,scrollbars=yes\');', $w3tc_url, $action, $width, $height ); return self::button( $text, $onclick ); } /** * Returns label string for a config key. * * @param string $config_key Config key. * * @return string */ public static function config_label( $config_key ) { static $config_labels = null; if ( is_null( $config_labels ) ) { $config_labels = apply_filters( 'w3tc_config_labels', array() ); } if ( isset( $config_labels[ $config_key ] ) ) { return $config_labels[ $config_key ]; } return ''; } /** * Prints the label string for a config key. * * @param string $config_key Config key. * * @return void */ public static function e_config_label( $config_key ) { $config_label = self::config_label( $config_key ); echo wp_kses( $config_label, self::get_allowed_html_for_wp_kses_from_content( $config_label ) ); } /** * Returns postbox header * * WordPress 5.5 introduced .postbox-header, which broke the styles of our postboxes. This was * resolved by adding additional css to /pub/css/options.css and pub/css/widget.css tagged with * a "WP 5.5" comment. * * @todo Add .postbox-header to our postboxes and cleanup css. * * @link https://github.com/BoldGrid/w3-total-cache/issues/237 * * @param string $title Title. * @param string $class_value Class. * @param string $id ID. * * @return void */ public static function postbox_header( $title, $class_value = '', $id = '' ) { $id = ! empty( $id ) ? ' id="' . esc_attr( $id ) . '"' : ''; ?>
class="postbox ">

' . wp_kses( $description, self::get_allowed_html_for_wp_kses_from_content( $description ) ) . '
' : ''; $basic_settings_tab = ( ! empty( $adv_link ) ) ? '' . esc_html__( 'Basic Settings', 'w3-total-cache' ) . '' : ''; $adv_settings_tab = ( ! empty( $adv_link ) ) ? '' . esc_html__( 'Advanced Settings', 'w3-total-cache' ) . '' : ''; $premium_link_tab = ( ! empty( $premium_link ) ) ? '' . esc_html__( 'Premium Services', 'w3-total-cache' ) . '' : ''; $tutorials_tab = ( ! empty( $premium_link ) ) ? '' . esc_html__( 'Help', 'w3-total-cache' ) . '' : ''; $extra_link_tabs = ''; foreach ( $w3tc_extra_links as $extra_link_text => $extra_link ) { $extra_link_tabs .= '' . esc_html( $extra_link_text ) . ''; } echo '

' . wp_kses( $title, self::get_allowed_html_for_wp_kses_from_content( $title ) ) . '

' . $description . '
'; } /** * Returns postbox footer * * @return void */ public static function postbox_footer() { echo '
'; } /** * Retrieves a specific tab's content based on the provided key and tab type. * * @since 2.8.3 * * This function dynamically loads content for a specified tab type (e.g., tutorials, premium services) * based on a given configuration key. It uses a mapping to fetch the correct tab content, which is then * wrapped in a `
` element with a `data-tab-type` attribute for identification. * * @param string $w3tc_key The configuration key used to retrieve tab settings. * @param string $tab_type The type of tab to retrieve (e.g., 'tutorials', 'premium-services'). * * @return string|null The HTML content for the specified tab, or null if the tab or key is not found. * * Usage: * ``` * echo wp_kses_post( Util_Ui::get_tab('example_key', 'tutorials'); // Retrieves the tutorials tab for 'example_key' * ``` */ public static function get_tab( string $w3tc_key, string $tab_type ): ?string { // If for any reason the key or tab type is empty, return an empty string. if ( empty( $w3tc_key ) || empty( $tab_type ) ) { return ''; } require_once 'ConfigSettingsTabs.php'; $configs = Config_Tab_Settings::get_config( $w3tc_key ); // Define a mapping of tab types to the corresponding config keys. $tab_mapping = array( 'help' => 'help', 'premium-services' => 'premium_support', ); // Check if the provided tab type exists in the mapping and in the configs. if ( isset( $tab_mapping[ $tab_type ] ) && isset( $configs['tabs'][ $tab_mapping[ $tab_type ] ] ) ) { return '
' . $configs['tabs'][ $tab_mapping[ $tab_type ] ] . '
'; } return null; } /** * Config save button. * * @param string $id ID. * @param string $extra Extra. * * @return void */ public static function button_config_save( $id = '', $extra = '' ) { $b1_id = 'w3tc_save_options_' . $id; $b2_id = 'w3tc_default_save_and_flush_' . $id; $nonce_field = self::nonce_field( Util_Nonce::admin_action( 'w3tc_save_options' ) ); $nonce_html = wp_kses( $nonce_field, self::get_allowed_html_for_wp_kses_from_content( $nonce_field ) ); $extra_html = wp_kses( $extra, self::get_allowed_html_for_wp_kses_from_content( $extra ) ); ?>

'; } ?>

is_sealed( $w3tc_key ) ) { echo 'disabled="disabled" '; } } /** * Returns nonce field HTML * * @param string|int $action Action. * @param string $w3tc_name Name. * @param bool $referer Referrer. * * @return string */ public static function nonce_field( $action = -1, $w3tc_name = '_wpnonce', $referer = true ) { $return = ''; if ( $referer ) { $return .= wp_referer_field( false ); } return $return; } /** * HTML attribute carrying a per-handler admin nonce for submit buttons. * * @since 2.10.0 * * @param string $action Dispatcher handler request key. * * @return string */ public static function admin_submit_nonce_attr( $action ) { return ' data-w3tc-nonce="' . esc_attr( Util_Nonce::create_admin( $action ) ) . '"'; } /** * Returns an notification box * * @param string $w3tc_message Message. * @param string $id Adds an id to the notification box. * @param bool $dismissible Whether the notification box should be dismissible. * * @return string */ public static function get_notification_box( $w3tc_message, $id = '', $dismissible = false ) { $page_val = Util_Request::get_string( 'page' ); if ( empty( $page_val ) || ( ! empty( $page_val ) && 'w3tc_' !== substr( $page_val, 0, 5 ) ) ) { $logo = sprintf( 'W3 Total Cache', esc_url( plugins_url( '/pub/img/W3TC_dashboard_logo_title.png', W3TC_FILE ) ) . '' ); } else { $logo = ''; } return sprintf( '
%3$s
', $id ? 'id="' . esc_attr( $id ) . '"' : '', $dismissible ? 'is-dismissible' : '', $logo . wp_kses( $w3tc_message, self::get_allowed_html_for_wp_kses_from_content( $w3tc_message ) ) ); } /** * Echos an notification box * * @param string $w3tc_message Message. * @param string $id adds an id to the notification box. * @param bool $dismissible Whether the notification box should be dismissible. * * @return void */ public static function e_notification_box( $w3tc_message, $id = '', $dismissible = false ) { $notification_box = self::get_notification_box( $w3tc_message, $id, $dismissible ); echo wp_kses( $notification_box, self::get_allowed_html_for_wp_kses_from_content( $notification_box ) ); } /** * Echos an error box. * * @param string $w3tc_message Message. * @param string $id Id. * @param bool $dismissible Whether the notification box should be dismissible. * * @return void */ public static function error_box( $w3tc_message, $id = '', $dismissible = false ) { $page_val = Util_Request::get_string( 'page' ); if ( empty( $page_val ) || ( ! empty( $page_val ) && 'w3tc_' !== substr( $page_val, 0, 5 ) ) ) { $logo = sprintf( 'W3 Total Cache', esc_url( plugins_url( '/pub/img/W3TC_dashboard_logo_title.png', W3TC_FILE ) . '' ) ); } else { $logo = ''; } $v = sprintf( '
%3$s
', $id ? 'id="' . esc_attr( $id ) . '"' : '', $dismissible ? 'is-dismissible' : '', $logo . wp_kses( $w3tc_message, self::get_allowed_html_for_wp_kses_from_content( $w3tc_message ) ) ); echo wp_kses( $v, self::get_allowed_html_for_wp_kses_from_content( $v ) ); } /** * Format bytes into B, KB, MB, GB and TB * * phpcs:disable Squiz.PHP.CommentedOutCode.Found * * @param int $bytes Bytes. * @param int $precision Precision. * * @return string */ public static function format_bytes( $bytes, $precision = 2 ) { $units = array( 'B', 'KB', 'MB', 'GB', 'TB' ); $bytes = max( $bytes, 0 ); $pow = floor( ( $bytes ? log( $bytes ) : 0 ) / log( 1024 ) ); $pow = min( $pow, count( $units ) - 1 ); // Uncomment one of the following alternatives. $bytes /= pow( 1024, $pow ); // $bytes /= ( 1 << ( 10 * $pow ) ); return round( $bytes, $precision ) . ' ' . $units[ $pow ]; } /** * Format mbytes into B, KB, MB, GB and TB * * phpcs:disable Squiz.PHP.CommentedOutCode.Found * * @param int $bytes Bytes. * @param int $precision Precision. * * @return string */ public static function format_mbytes( $bytes, $precision = 2 ) { $units = array( 'B', 'KB', 'MB', 'GB', 'TB' ); $bytes = max( $bytes, 0 ); $pow = floor( ( $bytes ? log( $bytes ) : 0 ) / log( 1024 ) ); $pow = min( $pow, count( $units ) - 1 ); // Uncomment one of the following alternatives. $bytes /= pow( 1024, $pow ); // $bytes /= ( 1 << ( 10 * $pow ) ); return round( $bytes, $precision ) . ' ' . $units[ $pow + 2 ]; } /** * Returns an hidden input text element * * @param string $id ID. * @param string $w3tc_name Name. * @param string $w3tc_value Value. * * @return string */ public static function r_hidden( $id, $w3tc_name, $w3tc_value ) { return ''; } /** * Echos a hidden input text element * * @param string $id ID. * @param string $w3tc_name Name. * @param string $w3tc_value Value. * * @return void */ public static function hidden( $id, $w3tc_name, $w3tc_value ) { $hidden = self::r_hidden( $id, $w3tc_name, $w3tc_value ); echo wp_kses( $hidden, self::get_allowed_html_for_wp_kses_from_content( $hidden ) ); } /** * Echos an label element * * @param string $id ID. * @param string $text Text. * * @return void */ public static function label( $id, $text ) { $w3tc_label = ''; echo wp_kses( $w3tc_label, self::get_allowed_html_for_wp_kses_from_content( $w3tc_label ) ); } /** * Echos an input text element * * @param string $id ID. * @param string $w3tc_name Name. * @param string $w3tc_value Value. * @param bool $w3tc_disabled Disabled. * @param int $size Size. * @param string $type Type. * @param string $w3tc_placeholder Placeholder. * * @return void */ public static function textbox( $id, $w3tc_name, $w3tc_value, $w3tc_disabled = false, $size = 40, $type = 'text', $w3tc_placeholder = '' ) { $w3tc_placeholder = ! empty( $w3tc_placeholder ) ? ' placeholder="' . esc_attr( $w3tc_placeholder ) . '"' : ''; echo ''; } /** * Echos an input password element * * @param string $id ID. * @param string $w3tc_name Name. * @param string $w3tc_value Value. * @param bool $w3tc_disabled Diabled. * @param int $size Size. * * @return void */ public static function passwordbox( $id, $w3tc_name, $w3tc_value, $w3tc_disabled = false, $size = 40 ) { echo ''; } /** * Returns true when the given config key carries the * `flags.secret => true` marker in `ConfigKeys.php`. * * Used by {@see self::control2()} to auto-mask textbox-rendered * secret keys (e.g. `cdn.s3.key` routed through * `Util_Ui::config_item()`), so a future credential field added to * the schema is masked by being flagged — no template edit needed. * * @since 2.10.0 * * @param string|array $w3tc_key Config key (compound keys are never * secrets in the static schema). * * @return bool */ public static function is_secret_config_key( $w3tc_key ) { if ( \is_array( $w3tc_key ) || ! \is_string( $w3tc_key ) || '' === $w3tc_key ) { return false; } $secrets = Config::secret_keys(); return isset( $secrets[ $w3tc_key ] ); } /** * Renders an input for a credential-typed config value. * * Never reflects the actual secret into the HTML `value=` attribute. * Instead: * * - `value=""` is always emitted (so a settings-page render — view- * source, browser cache, screenshot, intermediary proxy — never * yields the credential). * - A `••••••••` placeholder is rendered when a secret is * configured, so the admin can see that *something* is set * without seeing the value. An empty config value renders an * empty placeholder (the admin sees a blank input — same UX as * "credential not set"). * - `autocomplete="new-password"` discourages browsers from * auto-filling stored passwords into the wrong field. * - When a secret is configured, a companion `Remove` checkbox is * rendered alongside the input. Submitting that checkbox is the * only way to wipe a stored credential through the UI — see * `Generic_AdminActions_Default::read_request()` for the * server-side counterpart. Without it, clearing the visible * input and saving is a no-op (the empty-POST-preserves-secret * rule, see below). * * The companion server-side rules live in * `Generic_AdminActions_Default::read_request()`: * * 1. Empty POST for a `secret`-flagged key means "no change", * not "blank it". This lets the placeholder pattern round-trip * cleanly: the admin saves Settings without re-entering * existing credentials. * 2. A submitted companion `{name}__w3tc_clear=1` field forces * the value to '' (and the downstream save hooks then fire, * e.g. `Licensing_Plugin_Admin::possible_state_change()` * deactivates the license against EDD). * * @since 2.10.0 * * @param array $args { * Field arguments. * * @type string $id DOM id. * @type string $w3tc_name Submit name (e.g. `cdn__s3__secret`). * @type bool $has_value Whether a secret is currently * configured. When true the input * renders a dot placeholder AND a * companion `Remove` checkbox. * @type int $size HTML size attribute. Default 60. * @type string $type `password` (default) or `text`. * @type string $sealing_key Pass a key prefix (e.g. `cdn.`) to * disable the input when sealed by * the master config. * @type bool $extra_class Whether to also include the * `w3tc-ignore-change` class * (default true). * } * * @return void */ public static function secret_input( $args ) { $id = isset( $args['id'] ) ? (string) $args['id'] : ''; $w3tc_name = isset( $args['name'] ) ? (string) $args['name'] : ''; $has_value = ! empty( $args['has_value'] ); $size = isset( $args['size'] ) ? (int) $args['size'] : 60; $type = isset( $args['type'] ) && 'text' === $args['type'] ? 'text' : 'password'; $sealing_key = isset( $args['sealing_key'] ) ? (string) $args['sealing_key'] : ''; $extra_class = ! isset( $args['extra_class'] ) || (bool) $args['extra_class']; $w3tc_disabled = ! empty( $args['disabled'] ); $w3tc_placeholder = $has_value ? '••••••••' : ''; if ( ! $w3tc_disabled && '' !== $sealing_key && Dispatcher::config()->is_sealed( $sealing_key ) ) { $w3tc_disabled = true; } echo ''; /** * Render the explicit-clear affordance only when a secret is * configured AND the field is editable. There is nothing to * remove from an empty field, and a sealed/disabled field has * to be unsealed before its value can be changed at all. * * The companion name pattern is `{name}__w3tc_clear` so it * never collides with a real ConfigKeys.php key (no schema * entry ends in `clear`) and is trivially filtered out of the * `$_REQUEST` iteration in `read_request()`. */ if ( $has_value && ! $w3tc_disabled ) { $clear_id = $id . '__w3tc_clear'; echo ' '; } } /** * Echoes a select element. * * @param string $id The ID attribute for the select element. * @param string $w3tc_name The name attribute for the select element. * @param string $w3tc_value The selected value. * @param array $values An array of options, where the key is the option value and the value is the label. * @param bool $w3tc_disabled Whether the select element should be disabled. Default false. * @param array $optgroups { * Optional. An associative array of optgroup labels. * * @type int|string $w3tc_key The optgroup identifier. * @type string $w3tc_label The label for the optgroup. * } * * @return void */ public static function selectbox( $id, $w3tc_name, $w3tc_value, $values, $w3tc_disabled = false, $optgroups = null ) { echo ''; } /** * Echos a select option * * @param string $w3tc_key Key. * @param string $selected_value Name. * @param string $w3tc_descriptor Descriptor. * * @return void */ private static function option( $w3tc_key, $selected_value, $w3tc_descriptor ) { if ( ! is_array( $w3tc_descriptor ) ) { $w3tc_label = $w3tc_descriptor; $w3tc_disabled = false; } else { $w3tc_label = $w3tc_descriptor['label']; $w3tc_disabled = ! empty( $w3tc_descriptor['disabled'] ); } echo '' . "\n"; } /** * Echos a group of radio elements values: value => label pair or value => array(label, disabled, postfix). * * @param string $w3tc_name Name. * @param string $w3tc_value Value. * @param array $values { * Values. * * @type string $w3tc_label Label for the radio button. * @type bool $w3tc_disabled Whether the radio button is disabled. * @type string $postfix Postfix to be appended to the label. * @type bool $pro_feature Whether the radio button is a pro feature. * @type string $pro_excerpt Excerpt for pro feature description. * @type string $pro_description Full description for the pro feature. * @type string $intro_label Intro label for pro feature. * @type string $score Score associated with the pro feature. * @type string $score_label Label for the score. * @type string $score_description Description for the score. * @type string $score_link Link related to the score. * @type bool $show_learn_more Whether to show the "learn more" option for the pro feature. * } * @param bool $w3tc_disabled Disabled flag for all radio buttons. * @param string $separator Separator to be used between radio buttons. * * @return void */ public static function radiogroup( $w3tc_name, $w3tc_value, $values, $w3tc_disabled = false, $separator = '' ) { $w3tc_c = Dispatcher::config(); $w3tc_is_pro = Util_Environment::is_w3tc_pro( $w3tc_c ); $w3tc_first = true; foreach ( $values as $w3tc_key => $label_or_array ) { if ( $w3tc_first ) { $w3tc_first = false; } else { echo wp_kses( $separator, self::get_allowed_html_for_wp_kses_from_content( $separator ) ); } $w3tc_label = ''; $item_disabled = false; $postfix = ''; $pro_feature = false; if ( ! is_array( $label_or_array ) ) { $w3tc_label = $label_or_array; } else { $w3tc_label = $label_or_array['label']; $item_disabled = $label_or_array['disabled']; $postfix = isset( $label_or_array['postfix'] ) ? $label_or_array['postfix'] : ''; $pro_feature = isset( $label_or_array['pro_feature'] ) ? $label_or_array['pro_feature'] : false; } if ( $pro_feature ) { self::pro_wrap_maybe_start(); } echo '' . wp_kses( $postfix, self::get_allowed_html_for_wp_kses_from_content( $postfix ) ) . "\n"; if ( $pro_feature ) { self::pro_wrap_description( $label_or_array['pro_excerpt'], $label_or_array['pro_description'], $w3tc_name . '__' . $w3tc_key ); if ( ! $w3tc_is_pro && isset( $label_or_array['intro_label'] ) && isset( $label_or_array['score'] ) && isset( $label_or_array['score_label'] ) && isset( $label_or_array['score_description'] ) && isset( $label_or_array['score_link'] ) ) { $score_block = self::get_score_block( $label_or_array['intro_label'], $label_or_array['score'], $label_or_array['score_label'], $label_or_array['score_description'], $label_or_array['score_link'] ); echo wp_kses( $score_block, self::get_allowed_html_for_wp_kses_from_content( $score_block ) ); } $show_learn_more = isset( $label_or_array['show_learn_more'] ) && is_bool( $label_or_array['show_learn_more'] ) ? $label_or_array['show_learn_more'] : true; self::pro_wrap_maybe_end( $w3tc_name . '__' . $w3tc_key, $show_learn_more ); } } } /** * Echos an input text element * * @param string $id ID. * @param string $w3tc_name Name. * @param string $w3tc_value Value. * @param bool $w3tc_disabled Disabled. * * @return void */ public static function textarea( $id, $w3tc_name, $w3tc_value, $w3tc_disabled = false ) { // The "textarea" element must not have padding around the value. ?> '; } echo '' . "\n"; echo ' '; if ( ! is_null( $w3tc_label ) ) { echo wp_kses( $w3tc_label, self::get_allowed_html_for_wp_kses_from_content( $w3tc_label ) ) . ''; } } /** * Echos an element * * @param string $type Type. * @param string $id ID. * @param string $w3tc_name Name. * @param mixed $w3tc_value Value. * @param bool $w3tc_disabled Disabled. * * @return void */ public static function element( $type, $id, $w3tc_name, $w3tc_value, $w3tc_disabled = false ) { switch ( $type ) { case 'textbox': self::textbox( $id, $w3tc_name, $w3tc_value, $w3tc_disabled ); break; case 'password': self::passwordbox( $id, $w3tc_name, $w3tc_value, $w3tc_disabled ); break; case 'textarea': self::textarea( $id, $w3tc_name, $w3tc_value, $w3tc_disabled ); break; case 'checkbox': default: self::checkbox( $id, $w3tc_name, $w3tc_value, $w3tc_disabled ); break; } } /** * Checkbox * * @param array $e { * Config. * * @type string $w3tc_name The name of the checkbox. * @type mixed $w3tc_value The value of the checkbox. * @type bool $w3tc_disabled Optional. Whether the checkbox is disabled. Defaults to false. * @type string $w3tc_label Optional. The label for the checkbox. Defaults to null. * } * * @return void */ public static function checkbox2( $e ) { self::checkbox( $e['name'], $e['name'], $e['value'], ( isset( $e['disabled'] ) ? $e['disabled'] : false ), ( isset( $e['label'] ) ? $e['label'] : null ) ); } /** * Radio * * @param array $e { * Config. * * @type string $w3tc_name The name of the radio group. * @type mixed $w3tc_value The selected value. * @type array $values Array of radio button options. * @type bool $w3tc_disabled Whether the radio group is disabled. * @type string $separator The separator between radio buttons. * } * * @return void */ public static function radiogroup2( $e ) { self::radiogroup( $e['name'], $e['value'], $e['values'], $e['disabled'], $e['separator'] ); } /** * Select * * @param array $e { * Config. * * @type string $w3tc_name The name of the select element. * @type mixed $w3tc_value The selected value. * @type array $values The available options. * @type bool $w3tc_disabled Optional. Whether the select should be disabled. Default false. * @type array|null $optgroups Optional. The optgroups for grouping options. Default null. * } * * @return void */ public static function selectbox2( $e ) { self::selectbox( $e['name'], $e['name'], $e['value'], $e['values'], ( isset( $e['disabled'] ) ? $e['disabled'] : false ), ( isset( $e['optgroups'] ) ? $e['optgroups'] : null ) ); } /** * Textbox * * @param array $e { * Config. * * @type string $w3tc_name Name of the textbox. * @type string $w3tc_value Value of the textbox. * @type bool $w3tc_disabled Whether the textbox is disabled. Default is false. * @type int $size Size of the textbox. Default is 20. * @type string $type Type of the textbox. Default is 'text'. * @type string $w3tc_placeholder Placeholder text for the textbox. Default is an empty string. * } * * @return void */ public static function textbox2( $e ) { self::textbox( $e['name'], $e['name'], $e['value'], ( isset( $e['disabled'] ) ? $e['disabled'] : false ), ( ! empty( $e['size'] ) ? $e['size'] : 20 ), ( ! empty( $e['type'] ) ? $e['type'] : 'text' ), ( ! empty( $e['placeholder'] ) ? $e['placeholder'] : '' ) ); } /** * Textarea * * @param array $e { * Config. * * @type string $w3tc_name Name of the textarea. * @type string $w3tc_value Value of the textarea. * @type bool $w3tc_disabled Whether the textarea is disabled. Default is false. * } * * @return void */ public static function textarea2( $e ) { self::textarea( $e['name'], $e['name'], $e['value'], ( isset( $e['disabled'] ) ? $e['disabled'] : false ) ); } /** * Control various types of input elements based on configuration. * * Handles rendering of different input controls (checkbox, radiogroup, selectbox, textbox, textarea, none, and button) * based on the configuration provided in the input array. * * @param array $w3tc_a { * Configuration for the control. * * @type string $control The type of control to render. Possible values are 'checkbox', 'radiogroup', 'selectbox', 'textbox', 'textarea', 'none', 'button'. * @type string $control_name The name of the control. * @type mixed $w3tc_value The value of the control. * @type bool $w3tc_disabled Whether the control is disabled. * @type string $checkbox_label The label for the checkbox (if applicable). * @type array $radiogroup_values The values for the radiogroup (if applicable). * @type string $radiogroup_separator The separator for the radiogroup (if applicable). * @type array $selectbox_values The values for the selectbox (if applicable). * @type mixed $selectbox_optgroups The optgroups for the selectbox (if applicable). * @type string $textbox_type The type of the textbox (if applicable). * @type int $textbox_size The size of the textbox (if applicable). * @type string $textbox_placeholder The placeholder text for the textbox (if applicable). * @type string $none_label The label for 'none' or 'button' controls. * } * * @return void */ public static function control2( $w3tc_a ) { if ( 'checkbox' === $w3tc_a['control'] ) { self::checkbox2( array( 'name' => $w3tc_a['control_name'], 'value' => $w3tc_a['value'], 'disabled' => $w3tc_a['disabled'], 'label' => $w3tc_a['checkbox_label'], ) ); } elseif ( 'radiogroup' === $w3tc_a['control'] ) { self::radiogroup2( array( 'name' => $w3tc_a['control_name'], 'value' => $w3tc_a['value'], 'disabled' => $w3tc_a['disabled'], 'values' => $w3tc_a['radiogroup_values'], 'separator' => isset( $w3tc_a['radiogroup_separator'] ) ? $w3tc_a['radiogroup_separator'] : '', ) ); } elseif ( 'selectbox' === $w3tc_a['control'] ) { self::selectbox2( array( 'name' => $w3tc_a['control_name'], 'value' => $w3tc_a['value'], 'disabled' => $w3tc_a['disabled'], 'values' => $w3tc_a['selectbox_values'], 'optgroups' => isset( $w3tc_a['selectbox_optgroups'] ) ? $w3tc_a['selectbox_optgroups'] : null, ) ); } elseif ( 'textbox' === $w3tc_a['control'] ) { // Secret-flagged keys (CDN API secrets, FTP passwords, license // key, etc.) must NEVER reflect their value into the HTML // `value=` attribute. Route through the placeholder renderer // so the form pattern stays consistent with the inputs that // already migrated to `Util_Ui::secret_input()` directly. if ( self::is_secret_config_key( $w3tc_a['key'] ?? '' ) ) { // Carry through the caller-supplied id so the surrounding // `
' . $score . '

' . $score_label . '

' . $score_description . ' ' . esc_html__( 'Review the testing results', 'w3-total-cache' ) . '' . esc_html__( ' to see how.', 'w3-total-cache' ) . '


' . esc_html__( ' and improve your PageSpeed Scores today!', 'w3-total-cache' ) . '

'; return $score_block; } /** * Prints the Google PageSpeed score block that is built into the config_item_xxx methods. * This allows for manual printing in places that may need it. * * @param string $intro_label Intro Label. * @param string $score Score Value. * @param string $score_label Score Label. * @param string $score_description Score Description. * @param string $score_link Score Link. * * @return void */ public static function print_score_block( $intro_label, $score, $score_label, $score_description, $score_link ) { $score_block = self::get_score_block( $intro_label, $score, $score_label, $score_description, $score_link ); echo wp_kses( $score_block, self::get_allowed_html_for_wp_kses_from_content( $score_block ) ); } }