*/ // Prevent direct access if (!defined('ABSPATH')) { exit; } define ('SB_VERSION', '3.3.3'); define('SB_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('SB_PLUGIN_URL', plugin_dir_url(__FILE__)); register_activation_hook( __FILE__, 'simple_banner_activate' ); function simple_banner_activate() { add_action('admin_menu', 'simple_banner_menu'); } function is_checked($option_value) { return $option_value ? 'checked ' : ''; } // Disabled Pages/Posts functions function get_disabled_pages_array($banner_id) { return array_filter(explode(',', get_option('disabled_pages_array' . $banner_id))); } function get_post_object() { return get_posts(array('include' => array(get_the_ID()))); } function get_is_current_page_a_post() { return !empty(get_post_object()); } function get_disabled_on_posts($banner_id) { return get_option('disabled_on_posts' . $banner_id); } function get_is_removed_before_date($banner_id) { $start_after_date = get_option('simple_banner_start_after_date' . $banner_id); if (!$start_after_date) return false; $curr_date = new DateTime('now', new DateTimeZone('UTC')); $start_date = new DateTime($start_after_date); // Compare the dates if ($curr_date < $start_date) { return true; } return false; } function get_is_removed_after_date($banner_id) { $remove_after_date = get_option('simple_banner_remove_after_date' . $banner_id); if (!$remove_after_date) return false; $curr_date = new DateTime('now', new DateTimeZone('UTC')); $end_date = new DateTime($remove_after_date); // Compare the dates if ($curr_date > $end_date) { return true; } return false; } function get_disabled_on_current_page($banner_id) { $disabled_on_current_page = (!empty(get_disabled_pages_array($banner_id)) && in_array(get_the_ID(), get_disabled_pages_array($banner_id))) || (get_disabled_on_posts($banner_id) && get_is_current_page_a_post()) || get_is_removed_before_date($banner_id) || get_is_removed_after_date($banner_id); return $disabled_on_current_page; } add_action( 'wp_enqueue_scripts', 'simple_banner' ); function simple_banner() { // Enqueue the style wp_register_style('simple-banner-style', SB_PLUGIN_URL .'simple-banner.css', '', SB_VERSION); wp_enqueue_style('simple-banner-style'); // Set Script parameters $script_params = array( // General settings 'pro_version_enabled' => get_option('pro_version_enabled'), // debug specific parameters 'debug_mode' => get_option('simple_banner_debug_mode'), 'id' => get_the_ID(), 'version' => SB_VERSION, ); $banner_params = array(); for ($i = 1; $i <= get_num_banners(); $i++) { $banner_id = get_banner_id($i); $disabled_on_current_page = get_disabled_on_current_page($banner_id); $banner_params[] = array( 'hide_simple_banner' => get_option('hide_simple_banner' . $banner_id), 'simple_banner_prepend_element' => get_option('simple_banner_prepend_element' . $banner_id), 'simple_banner_position' => get_option('simple_banner_position' . $banner_id), 'header_margin' => $i === 1 ? get_option('header_margin' . $banner_id) : '', 'header_padding' => $i === 1 ? get_option('header_padding' . $banner_id) : '', 'wp_body_open_enabled' => $i === 1 ? get_option('wp_body_open_enabled' . $banner_id) : '', 'wp_body_open' => function_exists('wp_body_open'), 'simple_banner_z_index' => get_option('simple_banner_z_index' . $banner_id), 'disabled_on_current_page' => $disabled_on_current_page, 'disabled_pages_array' => get_disabled_pages_array($banner_id), 'is_current_page_a_post' => get_is_current_page_a_post(), 'disabled_on_posts' => get_disabled_on_posts($banner_id), 'simple_banner_disabled_page_paths' => get_option('simple_banner_disabled_page_paths' . $banner_id), 'simple_banner_font_size' => get_option('simple_banner_font_size' . $banner_id), 'simple_banner_color' => get_option('simple_banner_color' . $banner_id), 'simple_banner_text_color' => get_option('simple_banner_text_color' . $banner_id), 'simple_banner_link_color' => get_option('simple_banner_link_color' . $banner_id), 'simple_banner_close_color' => get_option('simple_banner_close_color' . $banner_id), 'simple_banner_text' => $disabled_on_current_page ? '' : get_option('simple_banner_text' . $banner_id), 'simple_banner_custom_css' => get_option('simple_banner_custom_css' . $banner_id), 'simple_banner_scrolling_custom_css' => get_option('simple_banner_scrolling_custom_css' . $banner_id), 'simple_banner_text_custom_css' => get_option('simple_banner_text_custom_css' . $banner_id), 'simple_banner_button_css' => get_option('simple_banner_button_css' . $banner_id), 'site_custom_css' => get_option('site_custom_css' . $banner_id), 'keep_site_custom_css' => get_option('keep_site_custom_css' . $banner_id), 'site_custom_js' => get_option('site_custom_js' . $banner_id), 'keep_site_custom_js' => get_option('keep_site_custom_js' . $banner_id), 'close_button_enabled' => get_option('close_button_enabled' . $banner_id), 'close_button_expiration' => get_option('close_button_expiration' . $banner_id), 'close_button_cookie_set' => isset($_COOKIE['simplebannerclosed' . $banner_id]), 'current_date' => new DateTime('now', new DateTimeZone('UTC')), 'start_date' => new DateTime(get_option('simple_banner_start_after_date' . $banner_id)), 'end_date' => new DateTime(get_option('simple_banner_remove_after_date' . $banner_id)), 'simple_banner_start_after_date' => get_option('simple_banner_start_after_date' . $banner_id), 'simple_banner_remove_after_date' => get_option('simple_banner_remove_after_date' . $banner_id), 'simple_banner_insert_inside_element' => get_option('simple_banner_insert_inside_element' . $banner_id), ); } $script_params['banner_params'] = $banner_params; // Enqueue the script wp_register_script('simple-banner-script', SB_PLUGIN_URL . 'simple-banner.js', array( 'jquery' ), SB_VERSION); wp_add_inline_script('simple-banner-script', 'const simpleBannerScriptParams = ' . wp_json_encode($script_params), 'before'); wp_enqueue_script('simple-banner-script'); } // Use `wp_body_open` action // For now only enabled on Banner #1 if ( function_exists( 'wp_body_open' ) && get_option('wp_body_open_enabled') ) { add_action( 'wp_body_open', 'simple_banner_body_open' ); } function simple_banner_body_open() { // Forcing the banner id concept for refactoring later with multiple ids $banner_id = get_banner_id(1); // if not disabled use wp_body_open $disabled_on_current_page = get_disabled_on_current_page($banner_id); $close_button_enabled = get_option('close_button_enabled' . $banner_id); $closed_cookie = $close_button_enabled && isset($_COOKIE['simplebannerclosed']); $closed_button = $close_button_enabled ? '' : ''; if (!$disabled_on_current_page && !$closed_cookie) { echo '
'; } } // Prevent CSS removal from optimizer plugins by putting a dummy item in the DOM add_action( 'wp_footer', 'prevent_css_removal'); function prevent_css_removal(){ echo ''; } // Add custom CSS/JS add_action( 'wp_head', 'simple_banner_custom_options'); function simple_banner_custom_options() { $pro_enabled = get_option('pro_version_enabled'); for ($i = 1; $i <= get_num_banners(); $i++) { // TODO: Make this all one script $banner_id = get_banner_id($i); $closed_cookie = get_option('close_button_enabled' . $banner_id) && isset($_COOKIE['simplebannerclosed' . $banner_id]); $disabled_on_current_page = get_disabled_on_current_page($banner_id); $banner_is_disabled = $disabled_on_current_page || get_option('hide_simple_banner' . $banner_id) == "yes"; if ($banner_is_disabled || $closed_cookie){ echo ''; } if ($i === 1 && !$banner_is_disabled && !$closed_cookie && get_option('header_margin' . $banner_id) != ""){ echo ''; } if ($i === 1 && !$banner_is_disabled && !$closed_cookie && get_option('header_padding' . $banner_id) != ""){ echo ''; } if (get_option('simple_banner_position' . $banner_id) != ""){ if (get_option('simple_banner_position' . $banner_id) == 'footer'){ echo ''; } else { echo ''; } } if (get_option('simple_banner_font_size' . $banner_id) != ""){ echo ''; } if (get_option('simple_banner_color' . $banner_id) != ""){ echo ''; } else { echo ''; } if (get_option('simple_banner_text_color' . $banner_id) != ""){ echo ''; } else { echo ''; } if (get_option('simple_banner_link_color' . $banner_id) != ""){ echo ''; } else { echo ''; } if (get_option('simple_banner_z_index' . $banner_id) != ""){ echo ''; } else { echo ''; } if (get_option('simple_banner_close_color' . $banner_id) != ""){ echo ''; } if (get_option('simple_banner_custom_css' . $banner_id) != ""){ echo ''; } if (get_option('simple_banner_scrolling_custom_css'.$banner_id.'' . $banner_id) != ""){ echo ''; } if (get_option('simple_banner_text_custom_css' . $banner_id) != ""){ echo ''; } if (get_option('simple_banner_button_css' . $banner_id) != ""){ echo ''; } $remove_site_custom_css = ($banner_is_disabled || $closed_cookie) && get_option('keep_site_custom_css' . $banner_id) == ""; if (!$remove_site_custom_css && get_option('site_custom_css' . $banner_id) != "" && $pro_enabled) { echo ''; } else if ($i === 1) { // put a dummy element to see if css is being bundled echo ''; } $remove_site_custom_js = ($banner_is_disabled || $closed_cookie) && get_option('keep_site_custom_js' . $banner_id) == ""; if (!$remove_site_custom_js && get_option('site_custom_js' . $banner_id) != "" && $pro_enabled) { echo ''; } else if ($i === 1) { // put a dummy element to see if scripts are being bundled echo ''; } } } /** * Grant manage_simple_banner at runtime instead of storing it on roles. * Computing it per request means a newly permitted role sees the menu on its * very next page load, and no core capability is ever handed out. */ add_filter('user_has_cap', 'simple_banner_grant_capability', 10, 4); function simple_banner_grant_capability($allcaps, $caps, $args, $user) { if (!in_array('manage_simple_banner', $caps, true)) { return $allcaps; } if (!empty($allcaps['manage_options'])) { $allcaps['manage_simple_banner'] = true; return $allcaps; } $permitted_roles = array_filter(explode(',', (string) get_option('permissions_array'))); if (array_intersect((array) $user->roles, $permitted_roles)) { $allcaps['manage_simple_banner'] = true; } return $allcaps; } /** * Versions <= 3.3.2 stored manage_options (and manage_simple_banner) on every * permitted role. Strip them from any role still carrying the plugin's cap. */ add_action('admin_init', 'simple_banner_remove_legacy_role_caps'); function simple_banner_remove_legacy_role_caps() { foreach (wp_roles()->role_objects as $role_name => $role) { if ($role_name === 'administrator' || !$role->has_cap('manage_simple_banner')) { continue; } $role->remove_cap('manage_simple_banner'); $role->remove_cap('manage_options'); } } // options.php checks manage_options by default; let banner editors save this settings group. add_filter('option_page_capability_simple-banner-settings-group', 'simple_banner_settings_capability'); function simple_banner_settings_capability() { return 'manage_simple_banner'; } add_action('admin_menu', 'simple_banner_menu'); function simple_banner_menu() { add_menu_page('Simple Banner Settings', 'Simple Banner', 'manage_simple_banner', 'simple-banner-settings', 'simple_banner_settings_page', 'dashicons-megaphone'); } // Only admins may change who gets access; anyone else's submission keeps the stored value. function simple_banner_sanitize_permissions_array($value) { if (!current_user_can('manage_options')) { return get_option('permissions_array'); } return wp_filter_nohtml_kses($value); } // Site-wide JS runs for every visitor (including admins), so only users trusted with raw script may change it. function simple_banner_can_edit_site_custom_js() { return current_user_can('manage_options') || current_user_can('unfiltered_html'); } //script input sanitization function function theme_slug_sanitize_js_code($input){ return base64_encode($input); } //output escape function function theme_slug_escape_js_output($input){ return esc_textarea( base64_decode($input) ); } // get number of banners function get_num_banners(){ return get_option('pro_version_enabled') ? 5 : 1; } function get_banner_id($i){ return $i === 1 ? '' : '_' . $i; } add_action( 'admin_init', 'simple_banner_settings' ); function simple_banner_settings() { // Register common settings register_setting( 'simple-banner-settings-group', 'pro_version_activation_code', array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'pro_version_enabled', array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_pro_license_key', array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_debug_mode', array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'permissions_array', array( 'sanitize_callback' => 'simple_banner_sanitize_permissions_array' ) ); // Register banner 1 only settings register_setting( 'simple-banner-settings-group', 'header_margin', array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'header_padding', array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'wp_body_open_enabled', array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_clear_cache', array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); for ($i = 1; $i <= get_num_banners(); $i++) { /** * Settings for first banner will have no suffix for backwards compatibility * and banners added afterwards will have _{NUMBER} */ $banner_id = get_banner_id($i); register_setting( 'simple-banner-settings-group', 'hide_simple_banner' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_nickname' . $banner_id, array( 'sanitize_callback' => 'sanitize_text_field' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_prepend_element' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_font_size' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_color' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_text_color' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_link_color' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_close_color' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_text' . $banner_id, array( 'sanitize_callback' => 'wp_kses_post' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_custom_css' . $banner_id, array( 'sanitize_callback' => 'wp_strip_all_tags' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_scrolling_custom_css' . $banner_id, array( 'sanitize_callback' => 'wp_strip_all_tags' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_text_custom_css' . $banner_id, array( 'sanitize_callback' => 'wp_strip_all_tags' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_button_css' . $banner_id, array( 'sanitize_callback' => 'wp_strip_all_tags' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_position' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_z_index' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'disabled_on_posts' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'disabled_pages_array' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'site_custom_css' . $banner_id, array( 'sanitize_callback' => 'wp_strip_all_tags' ) ); register_setting( 'simple-banner-settings-group', 'keep_site_custom_css' . $banner_id, array( 'sanitize_callback' => 'wp_strip_all_tags' ) ); register_setting( 'simple-banner-settings-group', 'site_custom_js' . $banner_id, array( 'sanitize_callback' => function($value) use ($banner_id) { return simple_banner_can_edit_site_custom_js() ? $value : get_option('site_custom_js' . $banner_id); } ) ); register_setting( 'simple-banner-settings-group', 'keep_site_custom_js' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'close_button_enabled' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'close_button_expiration' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_start_after_date' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_remove_after_date' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_insert_inside_element' . $banner_id, array( 'sanitize_callback' => 'wp_strip_all_tags' ) ); register_setting( 'simple-banner-settings-group', 'simple_banner_disabled_page_paths' . $banner_id, array( 'sanitize_callback' => 'wp_filter_nohtml_kses' ) ); } } function is_license_verified(){ $license_key = esc_attr( get_option('simple_banner_pro_license_key') ); // null check for license if (!$license_key){ return false; } $url = 'https://api.gumroad.com/v2/licenses/verify'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); $data = array( 'product_id' => 'vg6aCpxipQHuI5yvYzSVEA==', 'license_key' => $license_key, 'increment_uses_count' => 'false', ); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); // execute request and get response $result = curl_exec($ch); // Keeping for backwards compatibility // This function has no effect. Prior to PHP 8.0.0, this function was used to close the resource. curl_close($ch); // Safely decode the response. If the request failed, the response is not // valid JSON, or the expected fields are missing, treat it as an // unverified license and return false. This prevents cases where a // blocked or unreachable verification endpoint would otherwise leave // pro enabled indefinitely. try { $json = json_decode($result); if (!is_object($json) || !isset($json->success)) { return false; } $success = $json->{'success'}; } catch (Exception $e) { return false; } // check if license is active if ($success === true) { // now check if cancelled, failed, or ended $subscription_cancelled_at = $json->{'purchase'}->{'subscription_cancelled_at'}; $subscription_failed_at = $json->{'purchase'}->{'subscription_failed_at'}; $subscription_ended_at = $json->{'purchase'}->{'subscription_ended_at'}; $curr_date = new DateTime('now'); if ($subscription_cancelled_at) { $cancelled_date = new DateTime($subscription_cancelled_at); // Compare the dates if ($curr_date > $cancelled_date) { return false; } } if ($subscription_failed_at) { $failed_date = new DateTime($subscription_failed_at); // Compare the dates if ($curr_date > $failed_date) { return false; } } if ($subscription_ended_at) { $ended_date = new DateTime($subscription_ended_at); // Compare the dates if ($curr_date > $ended_date) { return false; } } return true; } else { return false; } } function my_custom_tinymce_config( $settings, $editor_id ) { // Check if the editor ID starts with 'simple_banner_text' if ( 0 !== strpos( $editor_id, 'simple_banner_text' ) ) { return $settings; } // This JS runs inside the TinyMCE 'setup' configuration // This function ensures preview banner can see live changes in `Visual` mode $settings['setup'] = 'function(editor) { editor.on("change keyup input undo redo", function(e) { // 1. Sync Visual content to the hidden textarea editor.save(); // 2. Trigger an onInput event for the banner document.getElementById(editor.id).dispatchEvent(new Event("input", { bubbles: true })) }); }'; return $settings; } add_filter( 'tiny_mce_before_init', 'my_custom_tinymce_config', 10, 2 ); function simple_banner_settings_page() { ?> deleteCache(); } } function clearWPRocket() { if (!function_exists('rocket_clean_domain')) { return; } rocket_clean_domain(); if (function_exists('run_rocket_sitemap_preload')) { run_rocket_sitemap_preload(); } } function clearAutoOptimizeCache() { if (class_exists("autoptimizeCache") && method_exists("autoptimizeCache", "clearall")) { autoptimizeCache::clearall(); } } function clearLiteSpeedCache() { if (class_exists("LiteSpeed_Cache_API") && method_exists("LiteSpeed_Cache_API", "purge_all")) { LiteSpeed_Cache_API::purge_all(); } } function clearHummingbirdCache() { if (!class_exists('\Hummingbird\Core\Utils')) { return; } $modules = \Hummingbird\Core\Utils::get_active_cache_modules(); foreach ($modules as $module => $name) { $mod = \Hummingbird\Core\Utils::get_module($module); if ($mod->is_active()) { if ('minify' === $module) { $mod->clear_files(); } else { $mod->clear_cache(); } } } } ?>