plugin_name = $plugin_name; $this->version = $version; $this->options = $options; add_action('wp_ajax_adasprso_search_categories', array($this, 'ajax_search_categories')); add_action('admin_head', array($this, 'suppress_foreign_notices')); } /** * Remove other plugins' and themes' admin notices on our settings page * so they don't clutter the interface. Our own settings errors are output * via settings_errors() inside the page template, so they are unaffected. */ public function suppress_foreign_notices() { $screen = get_current_screen(); if ( ! $screen || 'settings_page_add-as-preferred-source' !== $screen->id ) { return; } remove_all_actions( 'admin_notices' ); remove_all_actions( 'all_admin_notices' ); } /** * Register the stylesheets for the admin area. * * @since 1.0.0 */ public function enqueue_styles($hook) { // Only load on plugin settings page if ('settings_page_add-as-preferred-source' !== $hook) { return; } wp_enqueue_style('wp-color-picker'); wp_enqueue_style($this->plugin_name . '-admin', ADASPRSO_PLUGIN_URL . 'admin/css/add-as-preferred-source-admin.css', array(), $this->version, 'all'); } /** * Register the JavaScript for the admin area. * * @since 1.0.0 */ public function enqueue_scripts($hook) { // Only load on plugin settings page if ('settings_page_add-as-preferred-source' !== $hook) { return; } wp_enqueue_script('wp-color-picker'); wp_enqueue_media(); wp_enqueue_script($this->plugin_name . '-admin', ADASPRSO_PLUGIN_URL . 'admin/js/add-as-preferred-source-admin.js', array('jquery', 'wp-color-picker'), $this->version, false); wp_localize_script($this->plugin_name . '-admin', 'adasprso_admin', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('adasprso_categories_nonce'), )); } /** * Add settings page link to plugins page * * @since 1.0.0 */ public function add_action_links($links) { $settings_link = '' . __('Settings', 'add-as-preferred-source') . ''; array_unshift($links, $settings_link); return $links; } /** * Show admin notice with settings link * * @since 1.0.0 */ public function admin_notice() { // Show notice only once $notice_dismissed = get_option('adasprso_notice_dismissed'); // Check if notice is already dismissed or if not on plugins page $current_screen = get_current_screen(); if ( $notice_dismissed || ! $current_screen || $current_screen->id !== 'plugins' ) { return; } if ( 'plugins' === $current_screen->id ) { // Auto-dismiss the notice after showing it once update_option('adasprso_notice_dismissed', true); ?>
plugin_name, array($this, 'display_settings_page') ); } /** * Display the settings page content * * @since 1.0.0 */ public function display_settings_page() { include_once ADASPRSO_PLUGIN_PATH . 'admin/partials/add-as-preferred-source-admin-display.php'; } /** * Register plugin settings * * @since 1.0.0 */ public function register_settings() { register_setting( 'adasprso_settings', 'adasprso_options', array($this, 'validate_settings') ); // Implementation Method Section add_settings_section( 'adasprso_method_section', __('Implementation Method', 'add-as-preferred-source'), array($this, 'method_section_callback'), 'adasprso_settings_method' ); add_settings_field( 'adasprso_implementation_method', __('How the button works', 'add-as-preferred-source'), array($this, 'implementation_method_callback'), 'adasprso_settings_method', 'adasprso_method_section' ); // Badge & Link Section — moved here (from the Banner Settings tab) // because both fields apply just as much to the inline button as to // the banner, and customers who only use the inline button couldn't // find them under a "Banner Settings" tab they had no reason to open. add_settings_section( 'adasprso_shared_section', __('Badge & Link', 'add-as-preferred-source'), array($this, 'shared_section_callback'), 'adasprso_settings_method' ); // Custom Domain add_settings_field( 'adasprso_custom_domain', __('Custom Domain', 'add-as-preferred-source'), array($this, 'custom_domain_callback'), 'adasprso_settings_method', 'adasprso_shared_section' ); // Badge Language add_settings_field( 'adasprso_badge_language', __('Badge Language', 'add-as-preferred-source'), array($this, 'badge_language_callback'), 'adasprso_settings_method', 'adasprso_shared_section' ); // Badge Theme add_settings_field( 'adasprso_badge_theme', __('Badge Theme', 'add-as-preferred-source'), array($this, 'badge_theme_callback'), 'adasprso_settings_method', 'adasprso_shared_section' ); // General Settings Section add_settings_section( 'adasprso_general_section', __('General Settings', 'add-as-preferred-source'), array($this, 'general_section_callback'), 'adasprso_settings' ); // Banner Enabled add_settings_field( 'adasprso_enabled', __('Enable Banner', 'add-as-preferred-source'), array($this, 'enabled_callback'), 'adasprso_settings', 'adasprso_general_section' ); // Website Name add_settings_field( 'adasprso_website_name', __('Website Name', 'add-as-preferred-source'), array($this, 'website_name_callback'), 'adasprso_settings', 'adasprso_general_section' ); // Banner Text add_settings_field( 'adasprso_banner_text', __('Banner Text', 'add-as-preferred-source'), array($this, 'banner_text_callback'), 'adasprso_settings', 'adasprso_general_section' ); // Banner Position add_settings_field( 'adasprso_banner_position', __('Banner Position', 'add-as-preferred-source'), array($this, 'banner_position_callback'), 'adasprso_settings', 'adasprso_general_section' ); // Banner Trigger add_settings_field( 'adasprso_banner_trigger', __('Display Trigger', 'add-as-preferred-source'), array($this, 'banner_trigger_callback'), 'adasprso_settings', 'adasprso_general_section' ); // Scroll Percentage add_settings_field( 'adasprso_banner_scroll_percent', __('Scroll Percentage', 'add-as-preferred-source'), array($this, 'banner_scroll_percent_callback'), 'adasprso_settings', 'adasprso_general_section' ); // Delay Seconds add_settings_field( 'adasprso_banner_delay_seconds', __('Delay (seconds)', 'add-as-preferred-source'), array($this, 'banner_delay_seconds_callback'), 'adasprso_settings', 'adasprso_general_section' ); // Banner Frequency (after the visitor closes the banner) add_settings_field( 'adasprso_banner_frequency', __('After Visitor Closes Banner', 'add-as-preferred-source'), array($this, 'banner_frequency_callback'), 'adasprso_settings', 'adasprso_general_section' ); // Dismiss Duration (days) add_settings_field( 'adasprso_banner_dismiss_days', __('Hide Duration (days)', 'add-as-preferred-source'), array($this, 'banner_dismiss_days_callback'), 'adasprso_settings', 'adasprso_general_section' ); // Color Settings Section add_settings_section( 'adasprso_color_section', __('Color Settings', 'add-as-preferred-source'), array($this, 'color_section_callback'), 'adasprso_settings' ); // Banner Background Color add_settings_field( 'adasprso_banner_bg_color', __('Banner Background Color', 'add-as-preferred-source'), array($this, 'banner_bg_color_callback'), 'adasprso_settings', 'adasprso_color_section' ); // Text Color add_settings_field( 'adasprso_text_color', __('Text Color', 'add-as-preferred-source'), array($this, 'text_color_callback'), 'adasprso_settings', 'adasprso_color_section' ); // Device Settings Section add_settings_section( 'adasprso_device_section', __('Device Settings', 'add-as-preferred-source'), array($this, 'device_section_callback'), 'adasprso_settings' ); // Show on Mobile add_settings_field( 'adasprso_show_on_mobile', __('Show on Mobile', 'add-as-preferred-source'), array($this, 'show_on_mobile_callback'), 'adasprso_settings', 'adasprso_device_section' ); // Show on Desktop add_settings_field( 'adasprso_show_on_desktop', __('Show on Desktop', 'add-as-preferred-source'), array($this, 'show_on_desktop_callback'), 'adasprso_settings', 'adasprso_device_section' ); // Display Rules Section add_settings_section( 'adasprso_display_rules_section', __('Display Rules', 'add-as-preferred-source'), array($this, 'display_rules_section_callback'), 'adasprso_settings' ); // Display On add_settings_field( 'adasprso_display_on', __('Show Banner On', 'add-as-preferred-source'), array($this, 'display_on_callback'), 'adasprso_settings', 'adasprso_display_rules_section' ); // Exclude Post / Page IDs add_settings_field( 'adasprso_exclude_post_ids', __('Exclude Post / Page IDs', 'add-as-preferred-source'), array($this, 'exclude_post_ids_callback'), 'adasprso_settings', 'adasprso_display_rules_section' ); // Exclude Categories add_settings_field( 'adasprso_exclude_categories', __('Exclude Categories', 'add-as-preferred-source'), array($this, 'exclude_categories_callback'), 'adasprso_settings', 'adasprso_display_rules_section' ); // Inline Button Settings Section add_settings_section( 'adasprso_inline_section', __('Inline Button Settings', 'add-as-preferred-source'), array($this, 'inline_section_callback'), 'adasprso_settings_inline' ); // Inline Enabled add_settings_field( 'adasprso_inline_enabled', __('Enable Inline Button', 'add-as-preferred-source'), array($this, 'inline_enabled_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Inline Style add_settings_field( 'adasprso_inline_style', __('Badge Style', 'add-as-preferred-source'), array($this, 'inline_style_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Inline Position add_settings_field( 'adasprso_inline_position', __('Button Position', 'add-as-preferred-source'), array($this, 'inline_position_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Inline Post Types add_settings_field( 'adasprso_inline_post_types', __('Post Types', 'add-as-preferred-source'), array($this, 'inline_post_types_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Inline Background Color add_settings_field( 'adasprso_inline_bg_color', __('Background Color', 'add-as-preferred-source'), array($this, 'inline_bg_color_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Inline Text Color add_settings_field( 'adasprso_inline_text_color', __('Text Color', 'add-as-preferred-source'), array($this, 'inline_text_color_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Inline Text (Title) add_settings_field( 'adasprso_inline_text', __('Inline Title', 'add-as-preferred-source'), array($this, 'inline_text_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Inline Subtitle add_settings_field( 'adasprso_inline_subtitle', __('Inline Subtitle', 'add-as-preferred-source'), array($this, 'inline_subtitle_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Link style: lead-in text (before the clickable phrase) add_settings_field( 'adasprso_inline_link_prefix', __('Link Lead-in Text', 'add-as-preferred-source'), array($this, 'inline_link_prefix_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Link style: closing text (after the clickable phrase) add_settings_field( 'adasprso_inline_link_suffix', __('Link Closing Text', 'add-as-preferred-source'), array($this, 'inline_link_suffix_callback'), 'adasprso_settings_inline', 'adasprso_inline_section' ); // Shortcode / Block Settings Section - the defaults used by the // [preferred_source] shortcode, the editor block, and the // adasprso_preferred_source() template tag. add_settings_section( 'adasprso_shortcode_section', __('Shortcode & Block Settings', 'add-as-preferred-source'), array($this, 'shortcode_section_callback'), 'adasprso_settings_shortcode' ); add_settings_field( 'adasprso_shortcode_style', __('Badge Style', 'add-as-preferred-source'), array($this, 'shortcode_style_callback'), 'adasprso_settings_shortcode', 'adasprso_shortcode_section' ); add_settings_field( 'adasprso_shortcode_align', __('Alignment', 'add-as-preferred-source'), array($this, 'shortcode_align_callback'), 'adasprso_settings_shortcode', 'adasprso_shortcode_section' ); add_settings_field( 'adasprso_shortcode_text', __('Title Text', 'add-as-preferred-source'), array($this, 'shortcode_text_callback'), 'adasprso_settings_shortcode', 'adasprso_shortcode_section' ); add_settings_field( 'adasprso_shortcode_subtitle', __('Subtitle', 'add-as-preferred-source'), array($this, 'shortcode_subtitle_callback'), 'adasprso_settings_shortcode', 'adasprso_shortcode_section' ); add_settings_field( 'adasprso_shortcode_link_prefix', __('Lead-in Text', 'add-as-preferred-source'), array($this, 'shortcode_link_prefix_callback'), 'adasprso_settings_shortcode', 'adasprso_shortcode_section' ); add_settings_field( 'adasprso_shortcode_link_suffix', __('Closing Text', 'add-as-preferred-source'), array($this, 'shortcode_link_suffix_callback'), 'adasprso_settings_shortcode', 'adasprso_shortcode_section' ); add_settings_field( 'adasprso_shortcode_bg_color', __('Background Color', 'add-as-preferred-source'), array($this, 'shortcode_bg_color_callback'), 'adasprso_settings_shortcode', 'adasprso_shortcode_section' ); add_settings_field( 'adasprso_shortcode_text_color', __('Text Color', 'add-as-preferred-source'), array($this, 'shortcode_text_color_callback'), 'adasprso_settings_shortcode', 'adasprso_shortcode_section' ); add_settings_field( 'adasprso_shortcode_skip_auto_inline', __('Avoid Duplicates', 'add-as-preferred-source'), array($this, 'shortcode_skip_auto_inline_callback'), 'adasprso_settings_shortcode', 'adasprso_shortcode_section' ); } /** * Validate settings * * @since 1.0.0 * @param array $input The input options. * @return array The sanitized options. */ public function validate_settings($input) { $sanitized_input = array(); // No need to manually verify nonce - WordPress settings API handles this automatically // The nonce is automatically generated and verified by settings_fields() // Implementation method $valid_methods = array('legacy', 'advanced', 'standard'); $sanitized_input['implementation_method'] = (isset($input['implementation_method']) && in_array($input['implementation_method'], $valid_methods, true)) ? $input['implementation_method'] : 'legacy'; $sanitized_input['standard_theme'] = (isset($input['standard_theme']) && 'dark' === $input['standard_theme']) ? 'dark' : 'light'; $valid_google_langs = array_keys($this->get_google_publisher_languages()); $sanitized_input['standard_lang'] = (isset($input['standard_lang']) && ('auto' === $input['standard_lang'] || in_array($input['standard_lang'], $valid_google_langs, true))) ? $input['standard_lang'] : 'auto'; $sanitized_input['advanced_lang'] = (isset($input['advanced_lang']) && ('auto' === $input['advanced_lang'] || in_array($input['advanced_lang'], $valid_google_langs, true))) ? $input['advanced_lang'] : 'auto'; // Boolean field $sanitized_input['enabled'] = isset($input['enabled']) ? 1 : 0; // Text fields $sanitized_input['website_name'] = sanitize_text_field( isset( $input['website_name'] ) ? $input['website_name'] : '' ); $sanitized_input['banner_text'] = sanitize_text_field( isset( $input['banner_text'] ) ? $input['banner_text'] : '' ); // Custom domain — store as entered (full URL or plain domain both work) $sanitized_input['custom_domain'] = sanitize_text_field( isset( $input['custom_domain'] ) ? trim( $input['custom_domain'] ) : '' ); // Banner position $sanitized_input['banner_position'] = ( isset( $input['banner_position'] ) && 'top' === $input['banner_position'] ) ? 'top' : 'bottom'; // Banner trigger $valid_triggers = array('immediate', 'scroll', 'time'); $sanitized_input['banner_trigger'] = (isset($input['banner_trigger']) && in_array($input['banner_trigger'], $valid_triggers, true)) ? $input['banner_trigger'] : 'immediate'; // Scroll percentage (10–90) $sanitized_input['banner_scroll_percent'] = isset($input['banner_scroll_percent']) ? max(10, min(90, (int) $input['banner_scroll_percent'])) : 50; // Delay seconds (1–60) $sanitized_input['banner_delay_seconds'] = isset($input['banner_delay_seconds']) ? max(1, min(60, (int) $input['banner_delay_seconds'])) : 5; // Banner frequency — 'remember' hides via cookie after dismissal, 'always' shows on every page view $sanitized_input['banner_frequency'] = ( isset( $input['banner_frequency'] ) && 'always' === $input['banner_frequency'] ) ? 'always' : 'remember'; // Dismiss duration in days (1–365) $sanitized_input['banner_dismiss_days'] = isset($input['banner_dismiss_days']) ? max(1, min(365, (int) $input['banner_dismiss_days'])) : 7; // Color fields $sanitized_input['banner_bg_color'] = sanitize_hex_color( isset( $input['banner_bg_color'] ) ? $input['banner_bg_color'] : '' ); $sanitized_input['text_color'] = sanitize_hex_color( isset( $input['text_color'] ) ? $input['text_color'] : '' ); // Device settings $sanitized_input['show_on_mobile'] = isset($input['show_on_mobile']) ? 1 : 0; $sanitized_input['show_on_desktop'] = isset($input['show_on_desktop']) ? 1 : 0; // Display rules $valid_display_on = array('everywhere', 'posts_only', 'pages_only', 'front_page_only'); $sanitized_input['display_on'] = (isset($input['display_on']) && in_array($input['display_on'], $valid_display_on, true)) ? $input['display_on'] : 'everywhere'; // Exclude post/page IDs — keep only integers, re-join as comma string $raw_ids = isset($input['exclude_post_ids']) ? $input['exclude_post_ids'] : ''; $ids = array_filter(array_map('intval', explode(',', $raw_ids))); $sanitized_input['exclude_post_ids'] = implode(',', $ids); // Exclude categories — array of term IDs $sanitized_input['exclude_categories'] = array(); if (isset($input['exclude_categories']) && is_array($input['exclude_categories'])) { foreach ($input['exclude_categories'] as $cat_id) { $sanitized_input['exclude_categories'][] = absint($cat_id); } } // Inline settings $sanitized_input['inline_enabled'] = isset($input['inline_enabled']) ? 1 : 0; $valid_inline_styles = array('default', 'simple', 'strip', 'pill', 'link', 'boxed'); $sanitized_input['inline_style'] = ( isset( $input['inline_style'] ) && in_array( $input['inline_style'], $valid_inline_styles, true ) ) ? $input['inline_style'] : 'default'; $valid_positions = array('above', 'below', 'both'); $sanitized_input['inline_position'] = ( isset( $input['inline_position'] ) && in_array( $input['inline_position'], $valid_positions, true ) ) ? $input['inline_position'] : 'both'; // Sanitize Post Types $sanitized_input['inline_post_types'] = array(); if (isset($input['inline_post_types']) && is_array($input['inline_post_types'])) { foreach ($input['inline_post_types'] as $post_type) { if (post_type_exists($post_type)) { $sanitized_input['inline_post_types'][] = sanitize_text_field($post_type); } } } // Sanitize Colors $sanitized_input['inline_bg_color'] = sanitize_hex_color( isset( $input['inline_bg_color'] ) ? $input['inline_bg_color'] : '' ); $sanitized_input['inline_text_color'] = sanitize_hex_color( isset( $input['inline_text_color'] ) ? $input['inline_text_color'] : '' ); $sanitized_input['inline_text'] = sanitize_text_field( isset( $input['inline_text'] ) ? $input['inline_text'] : '' ); $sanitized_input['inline_subtitle'] = sanitize_text_field( isset( $input['inline_subtitle'] ) ? $input['inline_subtitle'] : '' ); // Link style only: surrounding sentence text $sanitized_input['inline_link_prefix'] = sanitize_text_field( isset( $input['inline_link_prefix'] ) ? $input['inline_link_prefix'] : '' ); $sanitized_input['inline_link_suffix'] = sanitize_text_field( isset( $input['inline_link_suffix'] ) ? $input['inline_link_suffix'] : '' ); // Shortcode / block settings $sanitized_input['shortcode_style'] = ( isset( $input['shortcode_style'] ) && in_array( $input['shortcode_style'], $valid_inline_styles, true ) ) ? $input['shortcode_style'] : 'default'; $valid_alignments = array('left', 'center', 'right'); $sanitized_input['shortcode_align'] = ( isset( $input['shortcode_align'] ) && in_array( $input['shortcode_align'], $valid_alignments, true ) ) ? $input['shortcode_align'] : 'center'; $sanitized_input['shortcode_text'] = sanitize_text_field( isset( $input['shortcode_text'] ) ? $input['shortcode_text'] : '' ); $sanitized_input['shortcode_subtitle'] = sanitize_text_field( isset( $input['shortcode_subtitle'] ) ? $input['shortcode_subtitle'] : '' ); $sanitized_input['shortcode_link_prefix'] = sanitize_text_field( isset( $input['shortcode_link_prefix'] ) ? $input['shortcode_link_prefix'] : '' ); $sanitized_input['shortcode_link_suffix'] = sanitize_text_field( isset( $input['shortcode_link_suffix'] ) ? $input['shortcode_link_suffix'] : '' ); $sanitized_input['shortcode_bg_color'] = sanitize_hex_color( isset( $input['shortcode_bg_color'] ) ? $input['shortcode_bg_color'] : '' ); $sanitized_input['shortcode_text_color'] = sanitize_hex_color( isset( $input['shortcode_text_color'] ) ? $input['shortcode_text_color'] : '' ); $sanitized_input['shortcode_skip_auto_inline'] = isset($input['shortcode_skip_auto_inline']) ? 1 : 0; $valid_badge_languages = array_keys( $this->get_available_badge_languages() ); $sanitized_input['badge_language'] = ( isset( $input['badge_language'] ) && in_array( $input['badge_language'], $valid_badge_languages, true ) ) ? $input['badge_language'] : 'auto'; $sanitized_input['badge_custom_text'] = sanitize_text_field( isset( $input['badge_custom_text'] ) ? $input['badge_custom_text'] : '' ); // Custom uploaded badge image — stored as a media library attachment ID. $sanitized_input['badge_custom_image_id'] = isset( $input['badge_custom_image_id'] ) ? absint( $input['badge_custom_image_id'] ) : 0; // Badge theme — anything other than an explicit "light" stays dark, so // installs updated from older versions keep their current badges. $sanitized_input['badge_theme'] = ( isset( $input['badge_theme'] ) && 'light' === $input['badge_theme'] ) ? 'light' : 'dark'; // Clear site caches so the updated settings take effect immediately — // but only when something actually changed, so resaving the same // settings doesn't trigger a needless cache-plugin sweep. if ( $sanitized_input !== $this->options ) { $this->clear_site_caches(); } // Add success message add_settings_error('adasprso_options', 'settings_updated', __('Settings saved successfully!', 'add-as-preferred-source'), 'updated'); return $sanitized_input; } /** * Clear caches from popular caching plugins and the WordPress object cache. * * Runs after settings are saved so visitors see the updated banner/button * without needing a manual cache purge. */ private function clear_site_caches() { // WP Rocket if ( function_exists( 'rocket_clean_domain' ) ) { rocket_clean_domain(); } // W3 Total Cache if ( function_exists( 'w3tc_pgcache_flush' ) ) { w3tc_pgcache_flush(); } // WP Super Cache if ( function_exists( 'wp_cache_clear_cache' ) ) { wp_cache_clear_cache(); } // LiteSpeed Cache if ( class_exists( 'LiteSpeed_Cache_API' ) ) { do_action( 'litespeed_purge_all' ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound } // Autoptimize if ( class_exists( 'autoptimizeCache' ) ) { autoptimizeCache::clearall(); } // WP Fastest Cache if ( isset( $GLOBALS['wp_fastest_cache'] ) && method_exists( $GLOBALS['wp_fastest_cache'], 'deleteCache' ) ) { $GLOBALS['wp_fastest_cache']->deleteCache( true ); } // Hummingbird if ( class_exists( '\Hummingbird\Core\Filesystem' ) ) { do_action( 'wphb_clear_page_cache' ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound } // Cache Enabler if ( class_exists( 'Cache_Enabler' ) ) { do_action( 'cache_enabler_clear_complete_cache' ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound } // SG Optimizer (SiteGround) if ( function_exists( 'sg_cachepress_purge_cache' ) ) { sg_cachepress_purge_cache(); } // Comet Cache if ( class_exists( 'comet_cache' ) ) { comet_cache::clearCache(); } // Swift Performance if ( class_exists( 'Swift_Performance_Cache' ) ) { Swift_Performance_Cache::clear_all_cache(); } // Breeze (Cloudways) if ( class_exists( 'Breeze_PurgeCache' ) ) { do_action( 'breeze_clear_all_cache' ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound } } /** * Implementation method section callback */ public function method_section_callback() { echo '' . esc_html__('Choose how visitors add your site as a preferred source. You can switch anytime.', 'add-as-preferred-source') . '
'; } /** * Badge & Link section callback — these apply to both the banner and * the inline button, so they live here instead of under either tab. */ public function shared_section_callback() { echo '' . esc_html__('These apply wherever your badge or button appears — the banner, the inline button, or both.', 'add-as-preferred-source') . '
'; } /** * The languages Google's preferred-source script itself supports (its * `data-lang` / `lang` values), independent of which 17 languages we * happen to have bundled badge images for. Used by the "Your Own Design" * and "Google's Own Button" language pickers, since neither renders our * badge image and so isn't limited to that smaller list. */ public function get_google_publisher_languages() { return array( 'ar' => 'Arabic', 'bg' => 'Bulgarian', 'bn' => 'Bengali', 'cs' => 'Czech', 'da' => 'Danish', 'de' => 'German', 'el' => 'Greek', 'en' => 'English', 'en-GB' => 'English (UK)', 'es' => 'Spanish', 'es-419' => 'Spanish (Latin America)', 'et' => 'Estonian', 'fil' => 'Filipino', 'fr' => 'French', 'fr-CA' => 'French (Canadian)', 'gu' => 'Gujarati', 'hi' => 'Hindi', 'hr' => 'Croatian', 'hu' => 'Hungarian', 'id' => 'Indonesian', 'it' => 'Italian', 'iw' => 'Hebrew', 'ja' => 'Japanese', 'kn' => 'Kannada', 'ko' => 'Korean', 'lt' => 'Lithuanian', 'lv' => 'Latvian', 'ml' => 'Malayalam', 'mr' => 'Marathi', 'ms' => 'Malay', 'nl' => 'Dutch', 'no' => 'Norwegian (Bokmal)', 'pa' => 'Punjabi', 'pl' => 'Polish', 'pt-BR' => 'Portuguese (Brazil)', 'pt-PT' => 'Portuguese (Portugal)', 'ro' => 'Romanian', 'ru' => 'Russian', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'sv' => 'Swedish', 'ta' => 'Tamil', 'te' => 'Telugu', 'th' => 'Thai', 'tr' => 'Turkish', 'uk' => 'Ukrainian', 'ur' => 'Urdu', 'vi' => 'Vietnamese', 'zh-CN' => 'Chinese (Simplified)', 'zh-HK' => 'Chinese (Hong Kong)', 'zh-TW' => 'Chinese (Traditional)', ); } /** * Renders a