WS_OK_7.4.33
<?php
/**
* Plugin Name: Simple Banner
* Plugin URI: https://github.com/rpetersen29/simple-banner
* Description: Display a simple banner at the top or bottom of your website. Now with multi-banner support
* Version: 3.2.0
* Author: Ryan Petersen
* Author URI: http://rpetersen29.github.io/
* License: GPLv3
*
* @package Simple Banner
* @version 3.2.0
* @author Ryan Petersen <rpetersen.dev@gmail.com>
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
define ('SB_VERSION', '3.2.0');
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),
'simple_banner_text' => get_option('simple_banner_text' . $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 ? '<button id="simple-banner-close-button" class="simple-banner-button">✕</button>' : '';
if (!$disabled_on_current_page && !$closed_cookie) {
echo '<div id="simple-banner" class="simple-banner"><div class="simple-banner-text"><span>'
. get_option('simple_banner_text' . $banner_id)
. '</span></div>'
. $closed_button
. '</div>';
}
}
// 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 '<div class="simple-banner simple-banner-text" style="display:none !important"></div>';
}
// 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 '<style id="simple-banner-hide" type="text/css">.simple-banner'.$banner_id.'{display:none;}</style>';
}
if ($i === 1 && !$banner_is_disabled && !$closed_cookie && get_option('header_margin' . $banner_id) != ""){
echo '<style id="simple-banner-header-margin'.$banner_id.'" type="text/css">header{margin-top:' . get_option('header_margin' . $banner_id) . ';}</style>';
}
if ($i === 1 && !$banner_is_disabled && !$closed_cookie && get_option('header_padding' . $banner_id) != ""){
echo '<style id="simple-banner-header-padding'.$banner_id.'" type="text/css" >header{padding-top:' . get_option('header_padding' . $banner_id) . ';}</style>';
}
if (get_option('simple_banner_position' . $banner_id) != ""){
if (get_option('simple_banner_position' . $banner_id) == 'footer'){
echo '<style id="simple-banner-position'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.'{position:fixed;bottom:0;}</style>';
} else {
echo '<style id="simple-banner-position'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.'{position:' . get_option('simple_banner_position' . $banner_id) . ';}</style>';
}
}
if (get_option('simple_banner_font_size' . $banner_id) != ""){
echo '<style id="simple-banner-font-size'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.' .simple-banner-text'.$banner_id.'{font-size:' . get_option('simple_banner_font_size' . $banner_id) . ';}</style>';
}
if (get_option('simple_banner_color' . $banner_id) != ""){
echo '<style id="simple-banner-background-color'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.'{background:' . get_option('simple_banner_color' . $banner_id) . ';}</style>';
} else {
echo '<style id="simple-banner-background-color'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.'{background: #024985;}</style>';
}
if (get_option('simple_banner_text_color' . $banner_id) != ""){
echo '<style id="simple-banner-text-color'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.' .simple-banner-text'.$banner_id.'{color:' . get_option('simple_banner_text_color' . $banner_id) . ';}</style>';
} else {
echo '<style id="simple-banner-text-color'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.' .simple-banner-text'.$banner_id.'{color: #ffffff;}</style>';
}
if (get_option('simple_banner_link_color' . $banner_id) != ""){
echo '<style id="simple-banner-link-color'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.' .simple-banner-text'.$banner_id.' a{color:' . get_option('simple_banner_link_color' . $banner_id) . ';}</style>';
} else {
echo '<style id="simple-banner-link-color'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.' .simple-banner-text'.$banner_id.' a{color:#f16521;}</style>';
}
if (get_option('simple_banner_z_index' . $banner_id) != ""){
echo '<style id="simple-banner-z-index'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.'{z-index:' . get_option('simple_banner_z_index' . $banner_id) . ';}</style>';
} else {
echo '<style id="simple-banner-z-index'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.'{z-index: 99999;}</style>';
}
if (get_option('simple_banner_close_color' . $banner_id) != ""){
echo '<style id="simple-banner-close-color'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.' .simple-banner-button'.$banner_id.'{color:' . get_option('simple_banner_close_color' . $banner_id) . ';}</style>';
}
if (get_option('simple_banner_custom_css' . $banner_id) != ""){
echo '<style id="simple-banner-custom-css'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.'{'. get_option('simple_banner_custom_css' . $banner_id) . '}</style>';
}
if (get_option('simple_banner_scrolling_custom_css'.$banner_id.'' . $banner_id) != ""){
echo '<style id="simple-banner-scrolling-custom-css" type="text/css">.simple-banner'.$banner_id.'.simple-banner-scrolling'.$banner_id.'{'. get_option('simple_banner_scrolling_custom_css' . $banner_id) . '}</style>';
}
if (get_option('simple_banner_text_custom_css' . $banner_id) != ""){
echo '<style id="simple-banner-text-custom-css'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.' .simple-banner-text'.$banner_id.'{'. get_option('simple_banner_text_custom_css' . $banner_id) . '}</style>';
}
if (get_option('simple_banner_button_css' . $banner_id) != ""){
echo '<style id="simple-banner-button-css'.$banner_id.'" type="text/css">.simple-banner'.$banner_id.' .simple-banner-button'.$banner_id.'{'. get_option('simple_banner_button_css' . $banner_id) . '}</style>';
}
$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 '<style id="simple-banner-site-custom-css'.$banner_id.''.$banner_id.'" type="text/css">'. get_option('site_custom_css' . $banner_id) . '</style>';
} else if ($i === 1) {
// put a dummy element to see if css is being bundled
echo '<style id="simple-banner-site-custom-css-dummy'.$banner_id.'" type="text/css"></style>';
}
$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 '<script id="simple-banner-site-custom-js'.$banner_id.''.$banner_id.'" type="text/javascript">'. get_option('site_custom_js' . $banner_id) . '</script>';
} else if ($i === 1) {
// put a dummy element to see if scripts are being bundled
echo '<script id="simple-banner-site-custom-js-dummy'.$banner_id.'" type="text/javascript"></script>';
}
}
}
add_action('admin_menu', 'simple_banner_menu');
function simple_banner_menu() {
$manage_simple_banner = 'manage_simple_banner';
$manage_options = 'manage_options';
$permissions_array = get_option('permissions_array');
// Add permissions for other roles
foreach (get_editable_roles() as $role_name => $role_info) {
if ( $role_name !== 'administrator') {
if (in_array($role_name, explode(",", $permissions_array))) {
$add_role = get_role( $role_name );
$add_role->add_cap( $manage_simple_banner );
$add_role->add_cap( $manage_options );
} else {
$remove_role = get_role( $role_name );
// only remove capabilities if they were previously added
if ($remove_role->has_cap( $manage_simple_banner )){
$remove_role->remove_cap( $manage_simple_banner );
$remove_role->remove_cap( $manage_options );
}
}
}
}
add_menu_page('Simple Banner Settings', 'Simple Banner', $manage_options, 'simple-banner-settings', 'simple_banner_settings_page', 'dashicons-megaphone');
}
//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' => 'wp_filter_nohtml_kses'
)
);
// 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_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);
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;
}
$is_pro_currently_enabled = esc_attr( get_option('pro_version_enabled') );
$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);
// TODO: Figure out what to do with these
// also get the error and response code
// $errors = curl_error($ch);
// $json_errors = json_decode($errors);
// gumroad returns a 404 on invalid license code
// e.g. {"success":false,"message":"That license does not exist for the provided product."}
// $response = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$json = json_decode($result);
$success = $json->{'success'};
// check if license is active
// if error or unknown response return current value
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 if ($success === false) {
return false;
}
return $is_pro_currently_enabled;
}
function my_custom_tinymce_config( $settings ) {
// This JS runs inside the TinyMCE 'setup' configuration
$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' );
function simple_banner_settings_page() {
?>
<?php
$is_verified = is_license_verified();
update_option('pro_version_enabled', $is_verified);
?>
<!-- Simple Banner Default Stylesheet -->
<link rel="stylesheet" href="<?php echo SB_PLUGIN_URL .'simple-banner.css' ?>" />
<!-- Admin Styles -->
<link rel="stylesheet" href="<?php echo SB_PLUGIN_URL .'admin/styles/main.css' ?>" />
<link rel="stylesheet" href="<?php echo SB_PLUGIN_URL .'admin/styles/preview-banner.css' ?>" />
<script type="text/javascript" src="<?php echo SB_PLUGIN_URL .'vendors/purify.min.js' ?>"></script>
<div class="wrap simple-banner-admin">
<div class="sb-header">
<h1>Simple Banner Settings</h1>
<a class="button button-primary button-hero" href="https://www.paypal.me/rpetersenDev" target="_blank">
Donate
</a>
</div>
<div class="sb-intro">
<p>Create and manage banners for your website.</p>
<p>Links must use HTML <code><a></code> tags. e.g. <code>This is a <a href="http://www.wordpress.com">Link to Wordpress</a></code>.</p>
</div>
<!-- Banner Previews -->
<div class="sb-previews">
<?php for ($i = 1; $i <= get_num_banners(); $i++) {
$banner_id = get_banner_id($i);
include 'preview_banner.php';
} ?>
<p class="sb-note"><em>Note: Styles may vary based on your theme's CSS.</em></p>
</div>
<!-- Settings Form -->
<form class="sb-settings-form" method="post" action="options.php">
<?php settings_fields( 'simple-banner-settings-group' ); ?>
<!-- Multi-banner Selector -->
<div class="sb-banner-selector">
<h3>Multi-Banner Support</h3>
<p>Display up to 5 banners on your site.</p>
<div class="sb-selector-controls">
<label for="banner_selector">Select Banner:</label>
<select id="banner_selector" <?php echo get_num_banners() === 1 ? 'disabled' : '' ?>>
<?php for ($i = 1; $i <= get_num_banners(); $i++) {
$value = $i === 1 ? '' : '_' . $i;
echo '<option value="' . $value . '">Banner #' . $i . '</option>';
} ?>
</select>
<?php if (!get_option('pro_version_enabled')): ?>
<a class="button-primary" href="https://rpetersendev.gumroad.com/l/simple-banner" target="_blank">
Purchase Pro License
</a>
<?php endif; ?>
</div>
</div>
<?php
for ($i = 1; $i <= get_num_banners(); $i++) {
$banner_id = get_banner_id($i);
include 'free_features.php';
include 'pro_features.php';
}
?>
<?php include 'pro_features_general_settings.php' ?>
<!-- Mobile Alert -->
<div class="sb-mobile-alert">
<strong>Mobile Testing Reminder:</strong> Always test your banners on mobile devices as theme headers often change their CSS for mobile views.
</div>
<!-- Cache Clear Hidden Field -->
<?php
// Flip value to ensure changed value on every save
$cache_value = get_option('simple_banner_clear_cache') ? '' : '1';
echo '<input type="hidden" name="simple_banner_clear_cache" value="' . $cache_value . '" />';
?>
<!-- Save Changes Button -->
<!-- <?php submit_button('Save Changes', 'primary', 'submit', false, array('class' => 'sb-save-button')); ?> -->
<?php submit_button(); ?>
</form>
</div>
<!-- Script to apply styles to Preview Banner -->
<script type="text/javascript">
// START MULTI BANNER
const num_banners = <?php echo get_num_banners(); ?>;
for (let i = 1; i <= num_banners; i++) {
const banner_id = i === 1 ? '' : `_${i}`;
const style_font_size = document.createElement('style');
const style_background_color = document.createElement('style');
const style_link_color = document.createElement('style');
const style_text_color = document.createElement('style');
const style_close_color = document.createElement('style');
const style_custom_css = document.createElement('style');
const style_custom_text_css = document.createElement('style');
const style_custom_button_css = document.createElement('style');
// Banner Text
const hrefRegex = /href\=[\'\"](?!http|https)([^\/].*?)[\'\"]/gsi;
const scriptStyleRegex = /<(script|style)[^>]*?>.*?<\/(script|style)>/gsi;
function stripBannerText(string) {
let strippedString = string;
while (strippedString.match(scriptStyleRegex)) {
strippedString = strippedString.replace(scriptStyleRegex, '')
};
const secureString = strippedString.replace(hrefRegex, "href=\"https://$1\"");
return DOMPurify.sanitize(secureString);
}
document.getElementById(`preview_banner_text${banner_id}`).innerHTML = document.getElementById(`simple_banner_text${banner_id}`).value != "" ?
'<span>'+stripBannerText(document.getElementById(`simple_banner_text${banner_id}`).value)+'</span>' :
'<span>This is what your banner will look like with a <a href="/">link</a>.</span>';
const onBannerTextChangeHandler = function(e){
document.getElementById(`preview_banner_text${banner_id}`).innerHTML = e.target.value != "" ? '<span>'+stripBannerText(e.target.value)+'</span>' : '<span>This is what your banner will look like with a <a href="/">link</a>.</span>';
};
document.getElementById(`simple_banner_text${banner_id}`).oninput=onBannerTextChangeHandler;
// Close Button
const closeButton = `<button id="simple-banner-close-button${banner_id}" class="simple-banner-button${banner_id}">✕</button>`;
const closeButtonChecked = document.getElementById(`close_button_enabled${banner_id}`).checked;
const closeButtonInitialValue = closeButtonChecked ? closeButton : '';
document.getElementById(`preview_banner${banner_id}`).innerHTML = document.getElementById(`preview_banner${banner_id}`).innerHTML + closeButtonInitialValue;
document.getElementById(`close_button_enabled${banner_id}`).onchange=function(e){
const str = document.getElementById(`preview_banner${banner_id}`).innerHTML;
if (e.target.checked) {
document.getElementById(`preview_banner${banner_id}`).innerHTML = str + closeButton;
} else {
const res = str.replace(closeButton, '');
document.getElementById(`preview_banner${banner_id}`).innerHTML = res;
}
};
// Font Size
style_font_size.type = 'text/css';
style_font_size.id = `preview_banner_font_size${banner_id}`;
style_font_size.appendChild(document.createTextNode(`.simple-banner${banner_id} .simple-banner-text${banner_id}{font-size:` + (document.getElementById(`simple_banner_font_size${banner_id}`).value || '1em') + ';line-height:1.55;}'));
document.getElementsByTagName('head')[0].appendChild(style_font_size);
document.getElementById(`simple_banner_font_size${banner_id}`).onchange=function(e){
const child = document.getElementById(`preview_banner_font_size${banner_id}`);
if (child){child.innerText = "";child.id='';}
const style_dynamic = document.createElement('style');
style_dynamic.type = 'text/css';
style_dynamic.id = `preview_banner_font_size${banner_id}`;
style_dynamic.appendChild(
document.createTextNode(
`.simple-banner${banner_id} .simple-banner-text${banner_id}{font-size:` + (document.getElementById(`simple_banner_font_size${banner_id}`).value || '1em') + ';line-height:1.55;}'
)
);
document.getElementsByTagName('head')[0].appendChild(style_dynamic);
};
// Background Color
style_background_color.type = 'text/css';
style_background_color.id = `preview_banner_background_color${banner_id}`;
style_background_color.appendChild(document.createTextNode(`.simple-banner${banner_id}{background:` + (document.getElementById(`simple_banner_color${banner_id}`).value || '#024985') + '}'));
document.getElementsByTagName('head')[0].appendChild(style_background_color);
document.getElementById(`simple_banner_color${banner_id}`).onchange=function(e){
document.getElementById(`simple_banner_color_show${banner_id}`).value = e.target.value || '#024985';
const child = document.getElementById(`preview_banner_background_color${banner_id}`);
if (child){child.innerText = "";child.id='';}
const style_dynamic = document.createElement('style');
style_dynamic.type = 'text/css';
style_dynamic.id = `preview_banner_background_color${banner_id}`;
style_dynamic.appendChild(
document.createTextNode(
`.simple-banner${banner_id}{background:` + (document.getElementById(`simple_banner_color${banner_id}`).value || '#024985') + '}'
)
);
document.getElementsByTagName('head')[0].appendChild(style_dynamic);
};
document.getElementById(`simple_banner_color_show${banner_id}`).onchange=function(e){
document.getElementById(`simple_banner_color${banner_id}`).value = e.target.value;
document.getElementById(`simple_banner_color${banner_id}`).dispatchEvent(new Event('change'));
};
// Text Color
style_text_color.type = 'text/css';
style_text_color.id = `preview_banner_text_color${banner_id}`;
style_text_color.appendChild(document.createTextNode(`.simple-banner${banner_id} .simple-banner-text${banner_id}{color:` + (document.getElementById(`simple_banner_text_color${banner_id}`).value || '#ffffff') + '}'));
document.getElementsByTagName('head')[0].appendChild(style_text_color);
document.getElementById(`simple_banner_text_color${banner_id}`).onchange=function(e){
document.getElementById(`simple_banner_text_color_show${banner_id}`).value = e.target.value || '#ffffff';
const child = document.getElementById(`preview_banner_text_color${banner_id}`);
if (child){child.innerText = "";child.id='';}
const style_dynamic = document.createElement('style');
style_dynamic.type = 'text/css';
style_dynamic.id = `preview_banner_text_color${banner_id}`;
style_dynamic.appendChild(
document.createTextNode(
`.simple-banner${banner_id} .simple-banner-text${banner_id}{color:` + (document.getElementById(`simple_banner_text_color${banner_id}`).value || '#ffffff') + '}'
)
);
document.getElementsByTagName('head')[0].appendChild(style_dynamic);
};
document.getElementById(`simple_banner_text_color_show${banner_id}`).onchange=function(e){
document.getElementById(`simple_banner_text_color${banner_id}`).value = e.target.value;
document.getElementById(`simple_banner_text_color${banner_id}`).dispatchEvent(new Event('change'));
};
// Link Color
style_link_color.type = 'text/css';
style_link_color.id = `preview_banner_link_color${banner_id}`;
style_link_color.appendChild(document.createTextNode(`.simple-banner${banner_id} .simple-banner-text${banner_id} a{color:` + (document.getElementById(`simple_banner_link_color${banner_id}`).value || '#f16521') + '}'));
document.getElementsByTagName('head')[0].appendChild(style_link_color);
document.getElementById(`simple_banner_link_color${banner_id}`).onchange=function(e){
document.getElementById(`simple_banner_link_color_show${banner_id}`).value = e.target.value || '#f16521';
const child = document.getElementById(`preview_banner_link_color${banner_id}`);
if (child){child.innerText = "";child.id='';}
const style_dynamic = document.createElement('style');
style_dynamic.type = 'text/css';
style_dynamic.id = `preview_banner_link_color${banner_id}`;
style_dynamic.appendChild(
document.createTextNode(
`.simple-banner${banner_id} .simple-banner-text${banner_id} a{color:` + (document.getElementById(`simple_banner_link_color${banner_id}`).value || '#f16521') + '}'
)
);
document.getElementsByTagName('head')[0].appendChild(style_dynamic);
};
document.getElementById(`simple_banner_link_color_show${banner_id}`).onchange=function(e){
document.getElementById(`simple_banner_link_color${banner_id}`).value = e.target.value;
document.getElementById(`simple_banner_link_color${banner_id}`).dispatchEvent(new Event('change'));
};
// Close Color
style_close_color.type = 'text/css';
style_close_color.id = `preview_banner_close_color${banner_id}`;
style_close_color.appendChild(document.createTextNode(`.simple-banner${banner_id} .simple-banner-button${banner_id}{color:` + (document.getElementById(`simple_banner_close_color${banner_id}`).value || 'black') + '}'));
document.getElementsByTagName('head')[0].appendChild(style_close_color);
document.getElementById(`simple_banner_close_color${banner_id}`).onchange=function(e){
document.getElementById(`simple_banner_close_color_show${banner_id}`).value = e.target.value || 'black';
const child = document.getElementById(`preview_banner_close_color${banner_id}`);
if (child){child.innerText = "";child.id='';}
const style_dynamic = document.createElement('style');
style_dynamic.type = 'text/css';
style_dynamic.id = `preview_banner_close_color${banner_id}`;
style_dynamic.appendChild(
document.createTextNode(
`.simple-banner${banner_id} .simple-banner-button${banner_id}{color:` + (document.getElementById(`simple_banner_close_color${banner_id}`).value || 'black') + '}'
)
);
document.getElementsByTagName('head')[0].appendChild(style_dynamic);
};
document.getElementById(`simple_banner_close_color_show${banner_id}`).onchange=function(e){
document.getElementById(`simple_banner_close_color${banner_id}`).value = e.target.value;
document.getElementById(`simple_banner_close_color${banner_id}`).dispatchEvent(new Event('change'));
};
// Custom CSS
style_custom_css.type = 'text/css';
style_custom_css.id = `preview_banner_custom_stylesheet${banner_id}`;
style_custom_css.appendChild(document.createTextNode(`.simple-banner${banner_id}{`+document.getElementById(`simple_banner_custom_css${banner_id}`).value+'}'));
document.getElementsByTagName('head')[0].appendChild(style_custom_css);
document.getElementById(`simple_banner_custom_css${banner_id}`).onchange=function(){
const child = document.getElementById(`preview_banner_custom_stylesheet${banner_id}`);
if (child){child.innerText = "";child.id='';}
const style_dynamic = document.createElement('style');
style_dynamic.type = 'text/css';
style_dynamic.id = `preview_banner_custom_stylesheet${banner_id}`;
style_dynamic.appendChild(
document.createTextNode(
`.simple-banner${banner_id}{`+document.getElementById(`simple_banner_custom_css${banner_id}`).value+'}'
)
);
document.getElementsByTagName('head')[0].appendChild(style_dynamic);
};
// Custom Text CSS
style_custom_text_css.type = 'text/css';
style_custom_text_css.id = `preview_banner_custom_text_stylesheet${banner_id}`;
style_custom_text_css.appendChild(document.createTextNode(`.simple-banner${banner_id} .simple-banner-text${banner_id}{`+document.getElementById(`simple_banner_text_custom_css${banner_id}`).value+'}'));
document.getElementsByTagName('head')[0].appendChild(style_custom_text_css);
document.getElementById(`simple_banner_text_custom_css${banner_id}`).onchange=function(){
const child = document.getElementById(`preview_banner_custom_text_stylesheet${banner_id}`);
if (child){child.innerText = "";child.id='';}
const style_dynamic = document.createElement('style');
style_dynamic.type = 'text/css';
style_dynamic.id = `preview_banner_custom_text_stylesheet${banner_id}`;
style_dynamic.appendChild(
document.createTextNode(
`.simple-banner${banner_id} .simple-banner-text${banner_id}{`+document.getElementById(`simple_banner_text_custom_css${banner_id}`).value+'}'
)
);
document.getElementsByTagName('head')[0].appendChild(style_dynamic);
};
// Custom Button CSS
style_custom_button_css.type = 'text/css';
style_custom_button_css.id = `preview_banner_custom_button_stylesheet${banner_id}`;
style_custom_button_css.appendChild(document.createTextNode(`.simple-banner${banner_id} .simple-banner-button${banner_id}{`+document.getElementById(`simple_banner_button_css${banner_id}`).value+'}'));
document.getElementsByTagName('head')[0].appendChild(style_custom_button_css);
document.getElementById(`simple_banner_button_css${banner_id}`).onchange=function(){
const child = document.getElementById(`preview_banner_custom_button_stylesheet${banner_id}`);
if (child){child.innerText = "";child.id='';}
const style_dynamic = document.createElement('style');
style_dynamic.type = 'text/css';
style_dynamic.id = `preview_banner_custom_button_stylesheet${banner_id}`;
style_dynamic.appendChild(
document.createTextNode(
`.simple-banner${banner_id} .simple-banner-button${banner_id}{`+document.getElementById(`simple_banner_button_css${banner_id}`).value+'}'
)
);
document.getElementsByTagName('head')[0].appendChild(style_dynamic);
};
// Disabled Pages
document.getElementById(`simple_banner_pro_disabled_pages${banner_id}`).onclick=function(e){
let disabledPagesArray = [];
Array.from(document.getElementById(`simple_banner_pro_disabled_pages${banner_id}`).getElementsByTagName('input')).forEach(function(e) {
if (e.checked) {
disabledPagesArray.push(e.value);
}
});
document.getElementById(`disabled_pages_array${banner_id}`).value = disabledPagesArray;
};
}
// Fixed Preview Banner on scroll
function fixedBanner() {
for (let i = 1; i <= num_banners; i++) {
const banner_id = i === 1 ? '' : `_${i}`;
const elementContainer = document.getElementById(`preview_banner_outer_container${banner_id}`);
const elementTarget = document.getElementById(`preview_banner_inner_container${banner_id}`);
if (window.scrollY > (elementContainer.offsetTop)) {
elementTarget.style.position = 'fixed';
elementTarget.style.width = '80.5%';
elementTarget.style.top = '40px';
} else {
elementTarget.style.position = 'relative';
elementTarget.style.width = '';
elementTarget.style.top = '0';
}
}
}
window.onscroll = fixedBanner;
// remove banner text newlines on submit
document.getElementById('submit').onclick=function(e){
for (let i = 1; i <= num_banners; i++) {
const banner_id = i === 1 ? '' : `_${i}`;
document.getElementById(`simple_banner_text${banner_id}`).value = document.getElementById(`simple_banner_text${banner_id}`).value.replace(/\n/g, "");
}
};
// Permissions
// Permissions only shown to administrators so need to wrap in if statement in order to ensure no errors
if (document.getElementById('simple_banner_pro_permissions')) {
document.getElementById('simple_banner_pro_permissions').onclick=function(e){
let permissionsArray = [];
Array.from(document.getElementById('simple_banner_pro_permissions').getElementsByTagName('input')).forEach(function(e) {
if (e.checked) {
permissionsArray.push(e.value);
}
});
document.getElementById('permissions_array').value = permissionsArray;
};
}
// Switch Banners
document.getElementById('banner_selector').onchange=function(e){
document.querySelectorAll('.simple-banner-settings-section').forEach(section => section.style.display = 'none');
document.getElementById(`free_section${e.target.value}`).style.display = 'block';
document.getElementById(`pro_section${e.target.value}`).style.display = 'block';
document.getElementById(`preview_banner_outer_container${e.target.value}`).style.display = 'block';
}
</script>
<?php
}
/**
* Clear 3rd party cache on save
*/
// Hack: Set hidden variable to always change on save
// TODO: Find better way of making sure cache is cleared on save
add_action( 'add_option_simple_banner_clear_cache', 'clear_all_caches', 10, 2 );
add_action( 'update_option_simple_banner_clear_cache', 'clear_all_caches', 10, 3 );
/**
* Arguments here aren't used currently. And $option value is optional due to
* "add_option_{$option}" only passing in two arguments.
*/
function clear_all_caches($old_value, $value, $option = 'simple_banner_clear_cache') {
try {
clearW3TotalCache();
clearWPSuperCache();
clearWPEngineCache();
clearWPFastestCache();
clearWPRocket();
clearAutoOptimizeCache();
clearLiteSpeedCache();
clearHummingbirdCache();
return true;
} catch (Exception $e) {
return 1;
}
}
function clearW3TotalCache() {
if (function_exists('w3tc_flush_all')) {
w3tc_flush_all();
}
}
function clearWPSuperCache() {
if (function_exists('wp_cache_clean_cache')) {
global $file_prefix, $supercachedir;
if (empty($supercachedir) && function_exists('get_supercache_dir')) {
$supercachedir = get_supercache_dir();
}
wp_cache_clean_cache($file_prefix);
}
}
function clearWPEngineCache() {
if (!class_exists('WpeCommon')) {
return;
}
$methods = [
'purge_memcached',
'clear_maxcdn_cache',
'purge_varnish_cache'
];
foreach ($methods as $method) {
if (method_exists('WpeCommon', $method)) {
// WpeCommon::$method();
}
}
}
function clearWPFastestCache() {
global $wp_fastest_cache;
if (method_exists('WpFastestCache', 'deleteCache') && !empty($wp_fastest_cache)) {
$wp_fastest_cache->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();
}
}
}
}
?>