tab_text ) ) { $this->tab_text = $this->title; } // Output the Intercom messenger if we're on the Plugin's settings screen. if ( $this->on_settings_screen( $this->name ) ) { add_action( 'admin_footer', array( $this, 'output_intercom' ) ); } // Register the settings section. $this->register_section(); } /** * Helper method to determine if we're viewing the current settings screen. * * @since 2.5.0 * * @param string $tab Current settings tab (general|tools|restrict-content|broadcasts). * @return bool */ public function on_settings_screen( $tab ) { // Bail if this is an AJAX or Cron request. if ( wp_doing_ajax() || wp_doing_cron() ) { return false; } // Bail if we're not on the settings screen. if ( ! filter_has_var( INPUT_GET, 'page' ) ) { return false; } if ( filter_input( INPUT_GET, 'page', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) !== '_wp_convertkit_settings' ) { return false; } // Define current settings tab. // General screen won't always be loaded with a `tab` parameter. if ( filter_has_var( INPUT_GET, 'tab' ) ) { $current_tab = filter_input( INPUT_GET, 'tab', FILTER_SANITIZE_FULL_SPECIAL_CHARS ); } else { $current_tab = 'general'; } // Return whether the request is for the current settings tab. return ( $current_tab === $tab ); } /** * Register settings section. */ public function register_section() { // Don't register a settings section if no settings key is defined. if ( empty( $this->settings_key ) ) { return; } // Register settings sections. foreach ( $this->settings_sections as $name => $settings_section ) { // Determine if this settings section needs to be wrapped in its own container. $wrap = array(); if ( $settings_section['wrap'] ) { $wrap = array( 'before_section' => $this->get_render_container_start(), 'after_section' => $this->get_render_container_end(), ); } add_settings_section( ( $name === 'general' ? $this->name : $this->name . '-' . $name ), $settings_section['title'], $settings_section['callback'], $this->settings_key, $wrap ); } // Register settings fields. $this->register_fields(); // Register setting to store data in options table. register_setting( $this->settings_key, $this->settings_key, array( $this, 'sanitize_settings' ) ); } /** * Register fields for this section */ public function register_fields() { } /** * Prints help info for this section */ abstract public function print_section_info(); /** * Returns the URL for the ConvertKit documentation for this setting section. */ abstract public function documentation_url(); /** * Outputs success and/or error notices if required. * * @since 2.0.0 */ public function maybe_output_notices() { // Define notices that might be displayed as a notification. $notices = array(); /** * Register success and error notices for settings screens. * * @since 2.5.1 * * @param array $notices Regsitered success and error notices. * @return array */ $notices = apply_filters( 'convertkit_settings_base_register_notices', $notices ); // Output the verbose error description if supplied (e.g. OAuth). if ( filter_has_var( INPUT_GET, 'error_description' ) ) { $this->output_error( filter_input( INPUT_GET, 'error_description', FILTER_SANITIZE_FULL_SPECIAL_CHARS ) ); } // Output error notification if defined. if ( filter_has_var( INPUT_GET, 'error' ) ) { $error = filter_input( INPUT_GET, 'error', FILTER_SANITIZE_FULL_SPECIAL_CHARS ); if ( array_key_exists( $error, $notices ) ) { $this->output_error( $notices[ $error ] ); } } // Output success notification if defined. if ( filter_has_var( INPUT_GET, 'success' ) ) { $success = filter_input( INPUT_GET, 'success', FILTER_SANITIZE_FULL_SPECIAL_CHARS ); if ( array_key_exists( $success, $notices ) ) { $this->output_success( $notices[ $success ] ); } } } /** * Renders the section */ public function render() { /** * Performs actions prior to rendering the settings form. * * @since 1.9.6 */ do_action( 'convertkit_settings_base_render_before' ); do_settings_sections( $this->settings_key ); settings_fields( $this->settings_key ); if ( ! $this->save_disabled ) { submit_button(); } /** * Performs actions after rendering of the settings form. * * @since 1.9.6 */ do_action( 'convertkit_settings_base_render_after' ); } /** * Outputs opening .metabox-holder and .postbox container div elements, * used before beginning a setting screen's output. * * @since 2.0.0 */ public function render_container_start() { echo wp_kses( $this->get_render_container_start(), convertkit_kses_allowed_html() ); } /** * Outputs closing .metabox-holder and .postbox container div elements, * used after finishing a setting screen's output. * * @since 2.0.0 */ public function render_container_end() { echo wp_kses( $this->get_render_container_end(), convertkit_kses_allowed_html() ); } /** * Returns opening .metabox-holder and .postbox container div elements, * used before beginning a section of a settings screen output. * * @since 2.7.1 */ public function get_render_container_start() { return '
'; } /** * Redirects to the settings screen. * * @since 2.2.9 */ public function redirect() { wp_safe_redirect( add_query_arg( array( 'page' => '_wp_convertkit_settings', 'tab' => $this->name, ), 'options-general.php' ) ); exit(); } /** * Redirects to the settings screen with an error notice key. * * The function maybe_output_notices() will then output the translated error notice * based on the supplied key. * * @since 2.5.1 * * @param string $error The error notice key, registered using `convertkit_settings_base_register_notices`. */ public function redirect_with_error_notice( $error ) { wp_safe_redirect( add_query_arg( array( 'page' => '_wp_convertkit_settings', 'tab' => $this->name, 'error' => $error, ), 'options-general.php' ) ); exit(); } /** * Redirects to the settings screen with the verbose error description. * * @since 2.5.1 * * @param string $error_description The error description. */ public function redirect_with_error_description( $error_description ) { wp_safe_redirect( add_query_arg( array( 'page' => '_wp_convertkit_settings', 'tab' => $this->name, 'error_description' => $error_description, ), 'options-general.php' ) ); exit(); } /** * Redirects to the settings screen with a success notice key. * * The function maybe_output_notices() will then output the translated success notice * based on the supplied key. * * @since 2.5.1 * * @param string $success The success notice key, registered using `convertkit_settings_base_register_notices`. */ public function redirect_with_success_notice( $success ) { wp_safe_redirect( add_query_arg( array( 'page' => '_wp_convertkit_settings', 'tab' => $this->name, 'success' => $success, ), 'options-general.php' ) ); exit(); } /** * Outputs the given success message in an inline notice. * * @since 2.0.0 * * @param string $success_message Success Message. */ public function output_success( $success_message ) { ?>
%s',
str_repeat( '*', strlen( $value ) - 4 ) . substr( $value, - 4 )
);
if ( $description ) {
$html .= $this->get_description( $description );
}
echo wp_kses(
$html,
convertkit_kses_allowed_html()
);
}
/**
* Returns a text field.
*
* @since 1.9.6
*
* @param string $name Name.
* @param string $value Value.
* @param bool|string|array $description Description (false|string|array).
* @param bool|array $css_classes CSS Classes (false|array).
* @return string HTML Field
*/
public function get_text_field( $name, $value = '', $description = false, $css_classes = false ) {
$html = sprintf(
'',
( is_array( $css_classes ) ? implode( ' ', $css_classes ) : 'regular-text' ),
$name,
$this->settings_key,
$name,
$value
);
return $html . $this->get_description( $description );
}
/**
* Outputs a text field.
*
* @since 2.8.5
*
* @param string $name Name.
* @param string $value Value.
* @param bool|string|array $description Description (false|string|array).
* @param bool|array $css_classes CSS Classes (false|array).
*/
public function output_text_field( $name, $value = '', $description = false, $css_classes = false ) {
echo wp_kses(
$this->get_text_field( $name, $value, $description, $css_classes ),
convertkit_kses_allowed_html()
);
}
/**
* Returns a number field.
*
* @since 2.6.1
*
* @param string $name Name.
* @param string $value Value.
* @param int|float $min `min` attribute value.
* @param int|float $max `max` attribute value.
* @param int|float $step `step` attribute value.
* @param bool|string|array $description Description (false|string|array).
* @param bool|array $css_classes CSS Classes (false|array).
* @return string HTML Field
*/
public function get_number_field( $name, $value = '', $min = 0, $max = 9999, $step = 1, $description = false, $css_classes = false ) {
$html = sprintf(
'',
( is_array( $css_classes ) ? implode( ' ', $css_classes ) : 'small-text' ),
$name,
$this->settings_key,
$name,
$value,
$min,
$max,
$step
);
return $html . $this->get_description( $description );
}
/**
* Outputs a number field.
*
* @since 2.8.5
*
* @param string $name Name.
* @param string $value Value.
* @param int|float $min `min` attribute value.
* @param int|float $max `max` attribute value.
* @param int|float $step `step` attribute value.
* @param bool|string|array $description Description (false|string|array).
* @param bool|array $css_classes CSS Classes (false|array).
*/
public function output_number_field( $name, $value = '', $min = 0, $max = 9999, $step = 1, $description = false, $css_classes = false ) {
echo wp_kses(
$this->get_number_field( $name, $value, $min, $max, $step, $description, $css_classes ),
convertkit_kses_allowed_html()
);
}
/**
* Returns a textarea field.
*
* @since 2.3.5
*
* @param string $name Name.
* @param string $value Value.
* @param bool|string|array $description Description (false|string|array).
* @param bool|array $css_classes CSS Classes (false|array).
* @return string HTML Field
*/
public function get_textarea_field( $name, $value = '', $description = false, $css_classes = false ) {
$html = sprintf(
'',
( is_array( $css_classes ) ? implode( ' ', $css_classes ) : 'regular-text' ),
$name,
$this->settings_key,
$name,
$value
);
return $html . $this->get_description( $description );
}
/**
* Outputs a textarea field.
*
* @since 2.8.5
*
* @param string $name Name.
* @param string $value Value.
* @param bool|string|array $description Description (false|string|array).
* @param bool|array $css_classes CSS Classes (false|array).
*/
public function output_textarea_field( $name, $value = '', $description = false, $css_classes = false ) {
echo wp_kses(
$this->get_textarea_field( $name, $value, $description, $css_classes ),
convertkit_kses_allowed_html()
);
}
/**
* Returns a date field.
*
* @since 2.2.8
*
* @param string $name Name.
* @param string $value Value.
* @param bool|string|array $description Description (false|string|array).
* @param bool|array $css_classes CSS Classes (false|array).
* @return string HTML Field
*/
public function get_date_field( $name, $value = '', $description = false, $css_classes = false ) {
$html = sprintf(
'',
( is_array( $css_classes ) ? implode( ' ', $css_classes ) : 'regular-text' ),
$name,
$this->settings_key,
$name,
$value
);
return $html . $this->get_description( $description );
}
/**
* Outputs a date field.
*
* @since 2.8.5
*
* @param string $name Name.
* @param string $value Value.
* @param bool|string|array $description Description (false|string|array).
* @param bool|array $css_classes CSS Classes (false|array).
*/
public function output_date_field( $name, $value = '', $description = false, $css_classes = false ) {
echo wp_kses(
$this->get_date_field( $name, $value, $description, $css_classes ),
convertkit_kses_allowed_html()
);
}
/**
* Returns a select dropdown field.
*
* @since 1.9.6
*
* @param string $name Name.
* @param string $value Value.
* @param array $options Options / Choices.
* @param bool|string $description Description.
* @param bool|array $css_classes