$sections ) { // Loop through sections foreach ( $sections as $section => $settings ) { // Check for backwards compatibility $section_tabs = edd_get_settings_tab_sections( $tab ); if ( ! is_array( $section_tabs ) || ! array_key_exists( $section, $section_tabs ) ) { $section = 'main'; $settings = $sections; } // Current page $page = "edd_settings_{$tab}_{$section}"; // Add the settings section add_settings_section( $page, __return_null(), '__return_false', $page ); foreach ( $settings as $option ) { // For backwards compatibility if ( empty( $option['id'] ) ) { continue; } // Parse args $args = wp_parse_args( $option, array( 'section' => $section, 'id' => null, 'desc' => '', 'name' => '', 'size' => null, 'options' => '', 'std' => '', 'min' => null, 'max' => null, 'step' => null, 'chosen' => null, 'multiple' => null, 'placeholder' => null, 'allow_blank' => true, 'readonly' => false, 'faux' => false, 'tooltip_title' => false, 'tooltip_desc' => false, 'field_class' => '', 'label_for' => false ) ); // Callback fallback $func = 'edd_' . $args['type'] . '_callback'; $callback = ! function_exists( $func ) ? 'edd_missing_callback' : $func; // Link the label to the form field if ( empty( $args['label_for'] ) ) { $args['label_for'] = 'edd_settings[' . $args['id'] . ']'; } // Add the settings field add_settings_field( 'edd_settings[' . $args['id'] . ']', $args['name'], $callback, $page, $page, $args ); } } } // Register our setting in the options table register_setting( 'edd_settings', 'edd_settings', 'edd_settings_sanitize' ); } add_action( 'admin_init', 'edd_register_settings' ); /** * Retrieve the array of plugin settings * * @since 1.8 * @since 3.0 Use a static variable internally to store registered settings * @return array */ function edd_get_registered_settings() { static $edd_settings = null; // Only build settings if not already built. if ( null === $edd_settings ) { $settings = new EDD\Admin\Settings\Register(); $edd_settings = $settings->get(); } return $edd_settings; } /** * Settings Sanitization * * Adds a settings error (for the updated message) * At some point this will validate input * * @since 1.0.8.2 * * @param array $input The value inputted in the field * * @global array $edd_options Array of all the EDD Options * * @return array $input Sanitized value */ function edd_settings_sanitize( $input = array() ) { global $edd_options; // Default values $referrer = ''; $setting_types = edd_get_registered_settings_types(); $doing_section = ! empty( $_POST['_wp_http_referer'] ); $input = ! empty( $input ) ? $input : array(); if ( true === $doing_section ) { // Pull out the tab and section parse_str( $_POST['_wp_http_referer'], $referrer ); $tab = ! empty( $referrer['tab'] ) ? sanitize_key( $referrer['tab'] ) : 'general'; $section = ! empty( $referrer['section'] ) ? sanitize_key( $referrer['section'] ) : 'main'; if ( ! empty( $_POST['edd_tab_override'] ) ) { $tab = sanitize_text_field( $_POST['edd_tab_override'] ); } // Maybe override the tab section if ( ! empty( $_POST['edd_section_override'] ) ) { $section = sanitize_text_field( $_POST['edd_section_override'] ); } // Get setting types for this section $setting_types = edd_get_registered_settings_types( $tab, $section ); // Run a general sanitization for the tab for special fields (like taxes) $input = apply_filters( 'edd_settings_' . $tab . '_sanitize', $input ); // Run a general sanitization for the section so custom tabs with sub-sections can save special data $input = apply_filters( 'edd_settings_' . $tab . '-' . $section . '_sanitize', $input ); } // Remove non setting types and merge settings together $non_setting_types = edd_get_non_setting_types(); $setting_types = array_diff( $setting_types, $non_setting_types ); $output = array_merge( $edd_options, $input ); // Loop through settings, and apply any filters foreach ( $setting_types as $key => $type ) { // Skip if type is empty if ( empty( $type ) ) { continue; } if ( array_key_exists( $key, $output ) ) { $output[ $key ] = apply_filters( 'edd_settings_sanitize_' . $type, $output[ $key ], $key ); $output[ $key ] = apply_filters( 'edd_settings_sanitize', $output[ $key ], $key ); } if ( true === $doing_section ) { switch ( $type ) { case 'checkbox': case 'checkbox_description': case 'gateways': case 'multicheck': case 'payment_icons': if ( array_key_exists( $key, $input ) && $output[ $key ] === '-1' ) { unset( $output[ $key ] ); } break; case 'text': if ( array_key_exists( $key, $input ) && empty( $input[ $key ] ) ) { unset( $output[ $key ] ); } break; case 'number': if ( array_key_exists( $key, $output ) && ! array_key_exists( $key, $input ) ) { unset( $output[ $key ] ); } $setting_details = edd_get_registered_setting_details( $tab, $section, $key ); $number_type = ! empty( $setting_details['step'] ) && false !== strpos( $setting_details['step'], '.' ) ? 'floatval' : 'intval'; $minimum = isset( $setting_details['min'] ) ? $number_type( $setting_details['min'] ) : false; $maximum = isset( $setting_details['max'] ) ? $number_type( $setting_details['max'] ) : false; $new_value = $number_type( $input[ $key ] ); if ( ( false !== $minimum && $minimum > $new_value ) || ( false !== $maximum && $maximum < $new_value ) ) { unset( $output[ $key ] ); } break; default: if ( array_key_exists( $key, $input ) && empty( $input[ $key ] ) || ( array_key_exists( $key, $output ) && ! array_key_exists( $key, $input ) ) ) { unset( $output[ $key ] ); } break; } } elseif ( empty( $input[ $key ] ) ) { unset( $output[ $key ] ); } } // Return output. return (array) $output; } /** * Flattens the set of registered settings and their type so we can easily sanitize all the settings * in a much cleaner set of logic in edd_settings_sanitize * * @since 2.6.5 * @since 2.8 - Added the ability to filter setting types by tab and section * * @param $filtered_tab bool|string A tab to filter setting types by. * @param $filtered_section bool|string A section to filter setting types by. * * @return array Key is the setting ID, value is the type of setting it is registered as */ function edd_get_registered_settings_types( $filtered_tab = false, $filtered_section = false ) { $settings = edd_get_registered_settings(); $setting_types = array(); foreach ( $settings as $tab_id => $tab ) { if ( false !== $filtered_tab && $filtered_tab !== $tab_id ) { continue; } foreach ( $tab as $section_id => $section_or_setting ) { // See if we have a setting registered at the tab level for backwards compatibility if ( false !== $filtered_section && is_array( $section_or_setting ) && array_key_exists( 'type', $section_or_setting ) ) { $setting_types[ $section_or_setting['id'] ] = $section_or_setting['type']; continue; } if ( false !== $filtered_section && $filtered_section !== $section_id ) { continue; } foreach ( $section_or_setting as $section_settings ) { if ( ! empty( $section_settings['type'] ) ) { $setting_types[ $section_settings['id'] ] = $section_settings['type']; } } } } return $setting_types; } /** * Allow getting a specific setting's details. * * @since 3.0 * * @param string $filtered_tab The tab the setting's section is in. * @param string $filtered_section The section the setting is located in. * @param string $setting_key The key associated with the setting. * * @return array */ function edd_get_registered_setting_details( $filtered_tab = '', $filtered_section = '', $setting_key = '' ) { $settings = edd_get_registered_settings(); $setting_details = array(); if ( isset( $settings[ $filtered_tab ][ $filtered_section][ $setting_key ] ) ) { $setting_details = $settings[ $filtered_tab ][ $filtered_section][ $setting_key ]; } return $setting_details; } /** * Return array of settings field types that aren't settings. * * @since 3.0 * * @return array */ function edd_get_non_setting_types() { return apply_filters( 'edd_non_setting_types', array( 'header', 'descriptive_text', 'hook', ) ); } /** * Misc File Download Settings Sanitization * * @since 2.5 * * @param array $input The value inputted in the field * * @return string $input Sanitized value */ function edd_settings_sanitize_misc_file_downloads( $input ) { if ( ! current_user_can( 'manage_shop_settings' ) ) { return $input; } if ( edd_get_file_download_method() != $input['download_method'] || ! edd_htaccess_exists() ) { // Force the .htaccess files to be updated if the Download method was changed. edd_create_protection_files( true, $input['download_method'] ); } return $input; } add_filter( 'edd_settings_misc-file_downloads_sanitize', 'edd_settings_sanitize_misc_file_downloads' ); /** * Misc Accounting Settings Sanitization * * @since 2.5 * * @param array $input The value inputted in the field * * @return array $input Sanitized value */ function edd_settings_sanitize_misc_accounting( $input ) { if ( ! current_user_can( 'manage_shop_settings' ) ) { return $input; } return $input; } /** * Taxes Settings Sanitization * * Adds a settings error (for the updated message) * This also saves the tax rates table * * @since 1.6 * * @param array $input The value inputted in the field * * @return array $input Sanitized value. */ function edd_settings_sanitize_taxes( $input ) { if ( ! current_user_can( 'manage_shop_settings' ) ) { return $input; } if ( ! isset( $_POST['tax_rates'] ) ) { return $input; } $tax_rates = ! empty( $_POST['tax_rates'] ) ? $_POST['tax_rates'] : array(); foreach ( $tax_rates as $tax_rate ) { $scope = isset( $tax_rate['global'] ) ? 'country' : 'region'; $region = isset( $tax_rate['state'] ) ? sanitize_text_field( $tax_rate['state'] ) : ''; $name = '*' === $tax_rate['country'] ? '' : sanitize_text_field( $tax_rate['country'] ); if ( empty( $name ) ) { $scope = 'global'; } $adjustment_data = array( 'name' => $name, 'type' => 'tax_rate', 'scope' => $scope, 'amount_type' => 'percent', 'amount' => floatval( $tax_rate['rate'] ), 'description' => $region, ); if ( ( empty( $adjustment_data['name'] ) && 'global' !== $adjustment_data['scope'] ) || $adjustment_data['amount'] < 0 ) { continue; } $existing_adjustment = edd_get_adjustments( $adjustment_data ); if ( ! empty( $existing_adjustment ) ) { $adjustment = $existing_adjustment[0]; $adjustment_data['status'] = sanitize_text_field( $tax_rate['status'] ); edd_update_adjustment( $adjustment->id, $adjustment_data ); } else { $adjustment_data['status'] = 'active'; edd_add_tax_rate( $adjustment_data ); } } return $input; } add_filter( 'edd_settings_taxes_sanitize', 'edd_settings_sanitize_taxes' ); /** * Payment Gateways Settings Sanitization * * @since 2.7 * * @param array $input The value inputted in the field * * @return string $input Sanitized value */ function edd_settings_sanitize_gateways( $input = array() ) { // Bail if user cannot manage shop settings if ( ! current_user_can( 'manage_shop_settings' ) || empty( $input['default_gateway'] ) ) { return $input; } // Unset the default gateway if there are no `gateways` enabled if ( empty( $input['gateways'] ) || '-1' == $input['gateways'] ) { unset( $input['default_gateway'] ); // Current gateway is no longer enabled, so } elseif ( ! array_key_exists( $input['default_gateway'], $input['gateways'] ) ) { $enabled_gateways = $input['gateways']; reset( $enabled_gateways ); $first_gateway = key( $enabled_gateways ); if ( $first_gateway ) { $input['default_gateway'] = $first_gateway; } } return $input; } add_filter( 'edd_settings_gateways_sanitize', 'edd_settings_sanitize_gateways' ); /** * Sanitize text fields * * @since 1.8 * * @param array $input The field value * * @return string $input Sanitized value */ function edd_sanitize_text_field( $input = '' ) { $allowed_tags = edd_get_allowed_tags(); return trim( wp_kses( $input, $allowed_tags ) ); } add_filter( 'edd_settings_sanitize_text', 'edd_sanitize_text_field' ); /** * Sanitize HTML Class Names * * @since 2.6.11 * * @param string|array $class HTML Class Name(s) * * @return string $class */ function edd_sanitize_html_class( $class = '' ) { if ( is_string( $class ) ) { $class = sanitize_html_class( $class ); } else if ( is_array( $class ) ) { $class = array_values( array_map( 'sanitize_html_class', $class ) ); $class = implode( ' ', array_unique( $class ) ); } return $class; } /** * Sanitizes banned emails. * * @since 3.0 */ function edd_sanitize_banned_emails( $input ) { $emails = ''; if ( ! empty( $input['banned_emails'] ) ) { // Sanitize the input $emails = array_map( 'trim', explode( "\n", $input['banned_emails'] ) ); $emails = array_unique( $emails ); $emails = array_map( 'sanitize_text_field', $emails ); foreach ( $emails as $id => $email ) { if ( ! is_email( $email ) && $email[0] != '@' && $email[0] != '.' ) { unset( $emails[ $id ] ); } } } $input['banned_emails'] = $emails; return $input; } add_filter( 'edd_settings_gateways-checkout_sanitize', 'edd_sanitize_banned_emails' ); /** * Retrieve settings tabs * * @since 1.8 * @since 2.11.4 Any tabs with no registered settings are filtered out in `edd_options_page`. * * @return array $tabs */ function edd_get_settings_tabs() { return apply_filters( 'edd_settings_tabs', array( 'general' => __( 'General', 'easy-digital-downloads' ), 'gateways' => __( 'Payments', 'easy-digital-downloads' ), 'emails' => __( 'Emails', 'easy-digital-downloads' ), 'marketing' => __( 'Marketing', 'easy-digital-downloads' ), 'styles' => __( 'Styles', 'easy-digital-downloads' ), 'taxes' => __( 'Taxes', 'easy-digital-downloads' ), 'privacy' => __( 'Policies', 'easy-digital-downloads' ), 'extensions' => __( 'Extensions', 'easy-digital-downloads' ), 'licenses' => __( 'Licenses', 'easy-digital-downloads' ), 'misc' => __( 'Misc', 'easy-digital-downloads' ), ) ); } /** * Retrieve settings tabs * * @since 2.5 * @return array $section */ function edd_get_settings_tab_sections( $tab = false ) { $tabs = array(); $sections = edd_get_registered_settings_sections(); if ( $tab && ! empty( $sections[ $tab ] ) ) { $tabs = $sections[ $tab ]; } else if ( $tab ) { $tabs = array(); } return $tabs; } /** * Get the settings sections for each tab * Uses a static to avoid running the filters on every request to this function * * @since 2.5 * @return array Array of tabs and sections */ function edd_get_registered_settings_sections() { static $sections = null; if ( null === $sections ) { $sections = array( 'general' => apply_filters( 'edd_settings_sections_general', array( 'main' => __( 'Store', 'easy-digital-downloads' ), 'currency' => __( 'Currency', 'easy-digital-downloads' ), 'pages' => __( 'Pages', 'easy-digital-downloads' ), 'api' => __( 'API', 'easy-digital-downloads' ), ) ), 'gateways' => apply_filters( 'edd_settings_sections_gateways', array( 'main' => __( 'General', 'easy-digital-downloads' ), 'checkout' => __( 'Checkout', 'easy-digital-downloads' ), 'refunds' => __( 'Refunds', 'easy-digital-downloads' ), 'accounting' => __( 'Accounting', 'easy-digital-downloads' ), ) ), 'emails' => apply_filters( 'edd_settings_sections_emails', array( 'main' => __( 'General', 'easy-digital-downloads' ), 'purchase_receipts' => __( 'Purchase Receipts', 'easy-digital-downloads' ), 'sale_notifications' => __( 'Sale Notifications', 'easy-digital-downloads' ), 'email_summaries' => __( 'Summaries', 'easy-digital-downloads' ), ) ), 'marketing' => apply_filters( 'edd_settings_sections_marketing', array( 'main' => __( 'General', 'easy-digital-downloads' ), ) ), 'styles' => apply_filters( 'edd_settings_sections_styles', array( 'main' => __( 'General', 'easy-digital-downloads' ), 'buttons' => __( 'Buttons', 'easy-digital-downloads' ) ) ), 'taxes' => apply_filters( 'edd_settings_sections_taxes', array( 'main' => __( 'General', 'easy-digital-downloads' ), 'rates' => __( 'Rates', 'easy-digital-downloads' ), ) ), 'privacy' => apply_filters( 'edd_settings_section_privacy', array( 'main' => __( 'Privacy Policy', 'easy-digital-downloads' ), 'site_terms' => __( 'Terms & Agreements', 'easy-digital-downloads' ), 'export_erase' => __( 'Export & Erase', 'easy-digital-downloads' ) ) ), 'extensions' => apply_filters( 'edd_settings_sections_extensions', array( 'main' => __( 'Main', 'easy-digital-downloads' ) ) ), 'licenses' => apply_filters( 'edd_settings_sections_licenses', array() ), 'misc' => apply_filters( 'edd_settings_sections_misc', array( 'main' => __( 'General', 'easy-digital-downloads' ), 'button_text' => __( 'Purchase Buttons', 'easy-digital-downloads' ), 'file_downloads' => __( 'File Downloads', 'easy-digital-downloads' ), ) ) ); } // Filter & return return apply_filters( 'edd_settings_sections', $sections ); } /** * Retrieve a list of all published pages * * On large sites this can be expensive, so only load if on the settings page or $force is set to true * * @since 1.9.5 * * @param bool $force Force the pages to be loaded even if not on settings * * @return array $pages_options An array of the pages */ function edd_get_pages( $force = false ) { $pages_options = array( '' => __( 'None', 'easy-digital-downloads' ) ); if ( ( ! isset( $_GET['page'] ) || 'edd-settings' !== $_GET['page'] ) && ! $force ) { return $pages_options; } $pages = get_pages(); if ( $pages ) { foreach ( $pages as $page ) { $pages_options[ $page->ID ] = $page->post_title; } } return $pages_options; } /** * Header Callback * * Renders the header. * * @since 1.0 * * @param array $args Arguments passed by the setting * * @return void */ function edd_header_callback( $args ) { echo apply_filters( 'edd_after_setting_output', '', $args ); } /** * Checkbox Callback * * Renders checkboxes. * * @since 1.0 * @since 3.0 Updated to use `EDD_HTML_Elements`. * * @param array $args Arguments passed by the setting. */ function edd_checkbox_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( isset( $args['faux'] ) && true === $args['faux'] ) { $name = ''; } else { $name = 'edd_settings[' . edd_sanitize_key( $args['id'] ) . ']'; } $class = edd_sanitize_html_class( $args['field_class'] ); $args['name'] = $name; $args['class'] = $class; $args['current'] = ! empty( $edd_option ) ? $edd_option : ''; $args['label'] = wp_kses_post( $args['desc'] ); $args['value'] = 1; $html = ''; $html .= '
'; $html .= EDD()->html->checkbox( $args ); $html .= '
'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Checkbox with description Callback * * Renders checkboxes with a description. * * @since 3.0 * * @param array $args Arguments passed by the setting * * @return void */ function edd_checkbox_description_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); // Allow a setting or filter to override what the found value is. if ( isset( $args['current'] ) ) { $edd_option = $args['current']; } if ( isset( $args['faux'] ) && true === $args['faux'] ) { $name = ''; } else { $name = 'edd_settings[' . edd_sanitize_key( $args['id'] ) . ']'; } $args['name'] = $name; $args['class'] = edd_sanitize_html_class( $args['field_class'] ); $args['current'] = ! empty( $edd_option ) ? $edd_option : ''; $args['label'] = false; $args['value'] = 1; $html = ''; $html .= '
'; $html .= EDD()->html->checkbox( $args ); $html .= ''; $html .= '
'; if ( ! empty( $args['desc'] ) ) { $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; } echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Multicheck Callback * * Renders multiple checkboxes. * * @since 1.0 * * @param array $args Arguments passed by the setting * * @return void */ function edd_multicheck_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); $class = edd_sanitize_html_class( $args['field_class'] ); $html = ''; if ( ! empty( $args['options'] ) ) { $html .= ''; foreach ( $args['options'] as $key => $option ): if ( isset( $edd_option[ $key ] ) ) { $enabled = $option; } else { $enabled = null; } $html .= '
'; $html .= ' '; $html .= ''; $html .= '
'; endforeach; $html .= '

' . $args['desc'] . '

'; } echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Payment method icons callback * * @since 2.1 * * @param array $args Arguments passed by the setting * * @return void */ function edd_payment_icons_callback( $args = array() ) { // Start an output buffer ob_start(); $edd_option = edd_get_option( $args['id'] ); $class = edd_sanitize_html_class( $args['field_class'] ); ?>

$option ) : $checked = false; if ( $edd_options && $edd_options == $key ) { $checked = true; } elseif ( isset( $args['std'] ) && $args['std'] == $key && ! $edd_options ) { $checked = true; } $html .= '
'; $html .= ' '; $html .= ''; $html .= '
'; endforeach; $html .= '

' . apply_filters( 'edd_after_setting_output', wp_kses_post( $args['desc'] ), $args ) . '

'; echo $html; } /** * Gateways Callback * * Renders gateways fields. * * @since 1.0 * * @param array $args Arguments passed by the setting * * @return void */ function edd_gateways_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); $html = ''; $html .= ''; if ( ! empty( $args['options'] ) ) { $class = edd_sanitize_html_class( $args['field_class'] ); $html .= ''; $url = edd_link_helper( 'https://easydigitaldownloads.com/downloads/category/extensions/gateways/', array( 'utm_medium' => 'payment-settings', 'utm_content' => 'gateways', ) ); /* translators: 1. opening link tag; do not translate; 2. closing link tag; do not translate */ $html .= '

' . esc_html__( 'Choose how you want to allow your customers to pay you.', 'easy-digital-downloads' ) . '
' . sprintf( __( 'More %1$sPayment Gateways%2$s are available.', 'easy-digital-downloads' ), '', '' ) . '

'; } echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Gateways Callback (drop down) * * Renders gateways select menu * * @since 1.5 * * @param array $args Arguments passed by the setting * * @return void */ function edd_gateway_select_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); $class = edd_sanitize_html_class( $args['field_class'] ); if ( isset( $args['chosen'] ) ) { $class .= ' edd-select-chosen'; if ( is_rtl() ) { $class .= ' chosen-rtl'; } } $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Text Callback * * Renders text fields. * * @since 1.0 * * @param array $args Arguments passed by the setting * * @return void */ function edd_text_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( $edd_option ) { $value = $edd_option; } elseif ( ! empty( $args['allow_blank'] ) && empty( $edd_option ) ) { $value = ''; } else { $value = isset( $args['std'] ) ? $args['std'] : ''; } if ( isset( $args['faux'] ) && true === $args['faux'] ) { $args['readonly'] = true; $value = isset( $args['std'] ) ? $args['std'] : ''; $name = ''; } else { $name = 'name="edd_settings[' . esc_attr( $args['id'] ) . ']"'; } $class = edd_sanitize_html_class( $args['field_class'] ); $placeholder = ! empty( $args['placeholder'] ) ? ' placeholder="' . esc_attr( $args['placeholder'] ) . '"' : ''; $disabled = ! empty( $args['disabled'] ) ? ' disabled="disabled"' : ''; $readonly = $args['readonly'] === true ? ' readonly="readonly"' : ''; $size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular'; $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Email Callback * * Renders email fields. * * @since 2.8 * * @param array $args Arguments passed by the setting * * @return void */ function edd_email_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( $edd_option ) { $value = $edd_option; } elseif ( ! empty( $args['allow_blank'] ) && empty( $edd_option ) ) { $value = ''; } else { $value = isset( $args['std'] ) ? $args['std'] : ''; } if ( isset( $args['faux'] ) && true === $args['faux'] ) { $args['readonly'] = true; $value = isset( $args['std'] ) ? $args['std'] : ''; $name = ''; } else { $name = 'name="edd_settings[' . esc_attr( $args['id'] ) . ']"'; } $class = edd_sanitize_html_class( $args['field_class'] ); $placeholder = isset( $args['placeholder'] ) ? $args['placeholder'] : ''; $disabled = ! empty( $args['disabled'] ) ? ' disabled="disabled"' : ''; $readonly = $args['readonly'] === true ? ' readonly="readonly"' : ''; $size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular'; $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Number Callback * * Renders number fields. * * @since 1.9 * * @param array $args Arguments passed by the setting * * @return void */ function edd_number_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( is_numeric( $edd_option ) ) { $value = $edd_option; } else { $value = isset( $args['std'] ) ? $args['std'] : ''; } if ( isset( $args['faux'] ) && true === $args['faux'] ) { $args['readonly'] = true; $value = isset( $args['std'] ) ? $args['std'] : ''; $name = ''; } else { $name = 'name="edd_settings[' . esc_attr( $args['id'] ) . ']"'; } $class = edd_sanitize_html_class( $args['field_class'] ); $max = isset( $args['max'] ) ? $args['max'] : 999999; $min = isset( $args['min'] ) ? $args['min'] : 0; $step = isset( $args['step'] ) ? $args['step'] : 1; $readonly = ! empty( $args['readonly'] ) ? ' readonly' : ''; $disabled = ! empty( $args['disabled'] ) ? ' disabled="disabled"' : ''; $size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular'; $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Textarea Callback * * Renders textarea fields. * * @since 1.0 * * @param array $args Arguments passed by the setting * * @return void */ function edd_textarea_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( $edd_option ) { if ( is_array( $edd_option ) ) { $value = implode( "\n", maybe_unserialize( $edd_option ) ); } else { $value = $edd_option; } } else { $value = isset( $args['std'] ) ? $args['std'] : ''; } $class = edd_sanitize_html_class( $args['field_class'] ); $placeholder = ! empty( $args['placeholder'] ) ? ' placeholder="' . esc_attr( $args['placeholder'] ) . '"' : ''; $readonly = $args['readonly'] === true ? ' readonly="readonly"' : ''; $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Password Callback * * Renders password fields. * * @since 1.3 * * @param array $args Arguments passed by the setting * * @return void */ function edd_password_callback( $args ) { $edd_options = edd_get_option( $args['id'] ); if ( $edd_options ) { $value = $edd_options; } else { $value = isset( $args['std'] ) ? $args['std'] : ''; } $class = edd_sanitize_html_class( $args['field_class'] ); $size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular'; $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Missing Callback * * If a function is missing for settings callbacks alert the user. * * @since 1.3.1 * * @param array $args Arguments passed by the setting * * @return void */ function edd_missing_callback( $args ) { printf( wp_kses_post( /* translators: %s: the setting ID */ __( 'The callback function used for the %s setting is missing.', 'easy-digital-downloads' ) ), '' . esc_attr( $args['id'] ) . '' ); } /** * Select Callback * * Renders select fields. * * @since 1.0 * * @param array $args Arguments passed by the setting * * @return void */ function edd_select_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( $edd_option ) { $value = $edd_option; } else { // Properly set default fallback if the Select Field allows Multiple values if ( empty( $args['multiple'] ) ) { $value = isset( $args['std'] ) ? $args['std'] : ''; } else { $value = ! empty( $args['std'] ) ? $args['std'] : array(); } } $placeholder = isset( $args['placeholder'] ) ? $args['placeholder'] : ''; $class = edd_sanitize_html_class( $args['field_class'] ); if ( isset( $args['chosen'] ) ) { $class .= ' edd-select-chosen'; if ( is_rtl() ) { $class .= ' chosen-rtl'; } } // Nonce $nonce = isset( $args['data']['nonce'] ) ? ' data-nonce="' . sanitize_text_field( $args['data']['nonce'] ) . '"' : ''; // If the Select Field allows Multiple values, save as an Array $name_attr = 'edd_settings[' . esc_attr( $args['id'] ) . ']'; $name_attr = ( $args['multiple'] ) ? $name_attr . '[]' : $name_attr; $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Color select Callback * * Renders color select fields. * * @since 1.8 * * @param array $args Arguments passed by the setting * * @return void */ function edd_color_select_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( $edd_option ) { $value = $edd_option; } else { $value = isset( $args['std'] ) ? $args['std'] : ''; } $class = edd_sanitize_html_class( $args['field_class'] ); if ( $args['chosen'] ) { $class .= 'edd-select-chosen'; if ( is_rtl() ) { $class .= ' chosen-rtl'; } } $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Rich Editor Callback * * Renders rich editor fields. * * @since 1.0 * * @param array $args Arguments passed by the setting */ function edd_rich_editor_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( $edd_option ) { $value = $edd_option; } else { if ( ! empty( $args['allow_blank'] ) && empty( $edd_option ) ) { $value = ''; } else { $value = isset( $args['std'] ) ? $args['std'] : ''; } } $rows = isset( $args['size'] ) ? $args['size'] : 20; $class = edd_sanitize_html_class( $args['field_class'] ); ob_start(); wp_editor( stripslashes( $value ), 'edd_settings_' . esc_attr( $args['id'] ), array( 'textarea_name' => 'edd_settings[' . esc_attr( $args['id'] ) . ']', 'textarea_rows' => absint( $rows ), 'editor_class' => $class, ) ); if ( ! empty( $args['desc'] ) ) { echo '

' . wp_kses_post( $args['desc'] ) . '

'; } $html = ob_get_clean(); echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Upload Callback * * Renders upload fields. * * @since 1.0 * * @param array $args Arguments passed by the setting * * @return void */ function edd_upload_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( $edd_option ) { $value = $edd_option; } else { $value = isset( $args['std'] ) ? $args['std'] : ''; } $class = edd_sanitize_html_class( $args['field_class'] ); $size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : 'regular'; $html = '
'; $html .= ''; $html .= ''; $html .= '
'; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Color picker Callback * * Renders color picker fields. * * @since 1.6 * * @param array $args Arguments passed by the setting * * @return void */ function edd_color_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); if ( $edd_option ) { $value = $edd_option; } else { $value = isset( $args['std'] ) ? $args['std'] : ''; } $default = isset( $args['std'] ) ? $args['std'] : ''; $class = edd_sanitize_html_class( $args['field_class'] ); $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Shop States Callback * * Renders states drop down based on the currently selected country * * @since 1.6 * * @param array $args Arguments passed by the setting * * @return void */ function edd_shop_states_callback( $args ) { $edd_option = edd_get_option( $args['id'] ); $states = edd_get_shop_states(); $class = edd_sanitize_html_class( $args['field_class'] ); $placeholder = isset( $args['placeholder'] ) ? $args['placeholder'] : ''; if ( $args['chosen'] ) { $class .= ' edd-select-chosen'; if ( is_rtl() ) { $class .= ' chosen-rtl'; } } if ( empty( $states ) ) { $class .= ' edd-no-states'; } $html = ''; $html .= '

' . wp_kses_post( $args['desc'] ) . '

'; echo apply_filters( 'edd_after_setting_output', $html, $args ); } /** * Outputs the "Default Rate" setting. * * @since 3.0 * * @param array $args Arguments passed to the setting. */ function edd_tax_rate_callback( $args ) { echo ''; echo wp_kses_post( $args['desc'] ); } /** * Recapture Callback * * Renders Recapture Settings * * @since 2.10.2 * @param array $args Arguments passed by the setting * @return void */ function edd_recapture_callback($args) { $client_connected = false; if ( class_exists( 'RecaptureEDD' ) ) { $client_connected = RecaptureEDD::is_ready(); } ob_start(); echo $args['desc']; // Output the appropriate button and label based on connection status if ( $client_connected ) : $connection_complete = get_option( 'recapture_api_key' ); ?>

', '' ); ?>

', '' ); ?>

', '' ); ?>

$rates, 'nonce' => wp_create_nonce( 'edd-country-field-nonce' ), 'i18n' => array( /* translators: Tax rate country code */ 'duplicateRate' => esc_html__( 'Duplicate tax rates are not allowed. Please deactivate the existing %s tax rate before adding or activating another.', 'easy-digital-downloads' ), 'emptyCountry' => esc_html__( 'Please select a country.', 'easy-digital-downloads' ), 'negativeTax' => esc_html__( 'Please enter a tax rate greater than 0.', 'easy-digital-downloads' ), 'emptyTax' => esc_html__( 'Are you sure you want to add a 0% tax rate?', 'easy-digital-downloads' ), ), ) ); $templates = array( 'meta', 'row', 'row-empty', 'add', 'bulk-actions' ); echo '

' . $args['desc'] . '

'; echo '
'; foreach ( $templates as $tmpl ) { ?> ' . esc_html( $args['tooltip_title'] ) . ': ' . esc_html( $args['tooltip_desc'] ) . '">'; $has_p_tag = strstr( $html, '

' ); $has_label = strstr( $html, '' ); // Insert tooltip at end of paragraph if ( false !== $has_p_tag ) { $html = str_replace( '

', $tooltip . '

', $html ); // Insert tooltip at end of label } elseif ( false !== $has_label ) { $html = str_replace( '', '' . $tooltip, $html ); // Append tooltip to end of HTML } else { $html .= $tooltip; } } return $html; } add_filter( 'edd_after_setting_output', 'edd_add_setting_tooltip', 10, 2 ); /** * Filters the edd_get_option call for test_mode. * * This allows us to ensure that calls directly to edd_get_option respect the constant * in addition to the edd_is_test_mode() function call and included filter. * * @since 3.1 * * @param bool $value If test_mode is enabled in the settings. * @param string $key The key of the setting, should be test_mode. * @param bool $default The default setting, which is 'false' for test_mode. */ function edd_filter_test_mode_option( $value, $key, $default ) { if ( edd_is_test_mode_forced() ) { $value = true; } return $value; } add_filter( 'edd_get_option_test_mode', 'edd_filter_test_mode_option', 10, 3 ); /** * Determine if test mode is being forced to true. * * Using the EDD_TEST_MODE and the edd_is_test_mode filter, determine if the value of true * is being forced for test_mode so we can properly alter the setting for it. * * @since 3.1 * * @return bool If test_mode is being forced or not. */ function edd_is_test_mode_forced() { if ( defined( 'EDD_TEST_MODE' ) && true === EDD_TEST_MODE ) { return true; } if ( false !== has_filter( 'edd_is_test_mode', '__return_true' ) ) { return true; } return false; } /** * Checks for an incorrect setting for the privacy policy. * Required in updating from EDD 2.9.2 to 2.9.3. */ add_filter( 'edd_get_option_show_privacy_policy_on_checkout', function( $value ) { if ( ! empty( $value ) ) { return $value; } $fix_show_privacy_policy_setting = edd_get_option( 'show_agree_to_privacy_policy_on_checkout', false ); if ( ! empty( $fix_show_privacy_policy_setting ) ) { edd_update_option( 'show_privacy_policy_on_checkout', $fix_show_privacy_policy_setting ); edd_delete_option( 'show_agree_to_privacy_policy_on_checkout' ); return $fix_show_privacy_policy_setting; } return $value; }, 10, 3 );