• modified the script to do this…

    /*!
    * WmpciPop 1.0.0 (Modified to support ?popup=none, 10min suppression)
    * https://astoundify.com
    *
    * Copyright (c) 2021 Astoundify
    */

    (function (WmpciPop, undefined) {

    'use strict';

    // set default settings
    var settings = {

    // set default cover id
    coverId: 'wmpci-popup-cover',

    // duration (in days) before it pops up again
    expires: 1,

    // close if someone clicks an element with this class and prevent default action
    closeClassNoDefault: 'wmpci-popup-close',

    // close if someone clicks an element with this class and continue default action
    closeClassDefault: 'wmpci-close-go',

    // change the cookie name
    cookieName: '_Wmpci_Popup',

    // on popup open function callback
    onPopUpOpen: null,

    // on popup close function callback
    onPopUpClose: null,

    // hash to append to url to force display of popup
    forceHash: 'splash',

    // hash to append to url to delay popup for 1 day
    delayHash: 'go',

    // close if the user clicks escape
    closeOnEscape: true,

    // set an optional delay (in milliseconds) before showing the popup
    delay: 10000,

    // automatically close the popup after a set amount of time (in milliseconds)
    hideAfter: null
    },


    // grab the elements to be used
    $el = {
    html: document.getElementsByTagName('html')[0],
    cover: null, // filled after settings merge
    closeClassDefaultEls: null,
    closeClassNoDefaultEls: null
    },


    /**
    * Helper methods
    */

    util = {

    hasClass: function(el, name) {
    return new RegExp('(\\s|^)' + name + '(\\s|$)').test(el.className);
    },

    addClass: function(el, name) {
    if (!util.hasClass(el, name)) {
    el.className += (el.className ? ' ' : '') + name;
    }
    },

    removeClass: function(el, name) {
    if (util.hasClass(el, name)) {
    el.className = el.className.replace(new RegExp('(\\s|^)' + name + '(\\s|$)'), ' ').replace(/^\s+|\s+$/g, '');
    }
    },

    addListener: function(target, type, handler) {
    if (target.addEventListener) {
    target.addEventListener(type, handler, false);
    } else if (target.attachEvent) {
    target.attachEvent('on' + type, handler);
    }
    },

    removeListener: function(target, type, handler) {
    if (target.removeEventListener) {
    target.removeEventListener(type, handler, false);
    } else if (target.detachEvent) {
    target.detachEvent('on' + type, handler);
    }
    },

    isFunction: function(functionToCheck) {
    var getType = {};
    return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
    },

    // days can be fractional
    setCookie: function(name, days) {
    var date = new Date();
    date.setTime(+date + (days * 86400000));
    document.cookie = name + '=true; expires=' + date.toGMTString() + '; path=/';
    },

    hasCookie: function(name) {
    return document.cookie.indexOf(name) !== -1;
    },

    hashExists: function(hash) {
    return window.location.hash.indexOf(hash) !== -1;
    },

    preventDefault: function(event) {
    if (event.preventDefault) {
    event.preventDefault();
    } else {
    event.returnValue = false;
    }
    },

    mergeObj: function(obj1, obj2) {
    for (var attr in obj2) {
    obj1[attr] = obj2[attr];
    }
    }
    },

    // --- Suppression helpers ---
    getPopupQueryValue = function() {
    try {
    var params = new URLSearchParams(window.location.search);
    return (params.get('popup') || '').toLowerCase();
    } catch (e) {
    return '';
    }
    },

    shouldSuppressByQuery = function() {
    var v = getPopupQueryValue();
    return v === 'none' || v === '0' || v === 'false' || v === 'off';
    },

    minutesToDays = function(min) {
    return min / (24 * 60);
    },

    suppression = {
    active: false,
    observer: null,
    // Make suppression bulletproof against late calls / class toggles
    engage: function() {
    if (this.active) return;
    this.active = true;

    // 1) Immediately remove the open class if present
    util.removeClass($el.html, 'wmpci-popup-open');

    // 2) Monkey-patch util.addClass to ignore the popup-open class while suppressed
    var _origAddClass = util.addClass;
    util.addClass = function(el, name) {
    if (name === 'wmpci-popup-open' && suppression.active) {
    return; // ignore
    }
    _origAddClass(el, name);
    };

    // 3) MutationObserver to auto-remove if some other code forces it
    try {
    this.observer = new MutationObserver(function(mutations) {
    for (var i = 0; i < mutations.length; i++) {
    if (mutations[i].attributeName === 'class') {
    util.removeClass($el.html, 'wmpci-popup-open');
    }
    }
    });
    this.observer.observe($el.html, { attributes: true, attributeFilter: ['class'] });
    } catch (e) {
    // no-op if MutationObserver not available
    }
    },
    disengage: function() {
    this.active = false;
    if (this.observer) {
    try { this.observer.disconnect(); } catch (e) {}
    this.observer = null;
    }
    }
    },


    /**
    * Private Methods
    */

    // close popup when user hits escape button
    onDocUp = function(e) {
    if (settings.closeOnEscape && e.keyCode === 27) {
    WmpciPop.close();
    }
    },

    openCallback = function() {
    if (settings.onPopUpOpen !== null) {
    if (util.isFunction(settings.onPopUpOpen)) {
    settings.onPopUpOpen.call();
    } else {
    throw new TypeError('WmpciPop open callback must be a function.');
    }
    }
    },

    closeCallback = function() {
    if (settings.onPopUpClose !== null) {
    if (util.isFunction(settings.onPopUpClose)) {
    settings.onPopUpClose.call();
    } else {
    throw new TypeError('WmpciPop close callback must be a function.');
    }
    }
    };



    /**
    * Public methods
    */

    WmpciPop.open = function() {
    // Hard guard: never open while suppressed
    if (suppression.active || shouldSuppressByQuery() || util.hasCookie(settings.cookieName)) {
    // If suppression is intended due to query, extend for 10 minutes
    if (shouldSuppressByQuery()) {
    util.setCookie(settings.cookieName, minutesToDays(10));
    suppression.engage();
    }
    return;
    }

    var i, len;

    if (util.hashExists(settings.delayHash)) {
    util.setCookie(settings.cookieName, 1); // delayHash means set for 1 day
    return;
    }

    // (Re)resolve elements in case DOM changed
    $el.cover = document.getElementById(settings.coverId);
    $el.closeClassDefaultEls = document.querySelectorAll('.' + settings.closeClassDefault);
    $el.closeClassNoDefaultEls = document.querySelectorAll('.' + settings.closeClassNoDefault);

    util.addClass($el.html, 'wmpci-popup-open');

    // bind close events and prevent default event
    if ($el.closeClassNoDefaultEls && $el.closeClassNoDefaultEls.length > 0) {
    for (i = 0, len = $el.closeClassNoDefaultEls.length; i < len; i++) {
    util.addListener($el.closeClassNoDefaultEls[i], 'click', function(e) {
    if (e.target === this) {
    util.preventDefault(e);
    WmpciPop.close();
    }
    });
    }
    }

    // bind close events and continue with default event
    if ($el.closeClassDefaultEls && $el.closeClassDefaultEls.length > 0) {
    for (i = 0, len = $el.closeClassDefaultEls.length; i < len; i++) {
    util.addListener($el.closeClassDefaultEls[i], 'click', function(e) {
    if (e.target === this) {
    WmpciPop.close();
    }
    });
    }
    }

    // bind escape detection to document
    util.addListener(document, 'keyup', onDocUp);
    openCallback();
    };

    WmpciPop.close = function(e) {
    util.removeClass($el.html, 'wmpci-popup-open');
    util.setCookie(settings.cookieName, settings.expires);
    // unbind escape detection to document
    util.removeListener(document, 'keyup', onDocUp);
    closeCallback();
    };

    WmpciPop.init = function(options) {
    if (!navigator.cookieEnabled) return;

    util.mergeObj(settings, options);

    // Resolve elements after settings arrive
    $el.cover = document.getElementById(settings.coverId);
    $el.closeClassDefaultEls = document.querySelectorAll('.' + settings.closeClassDefault);
    $el.closeClassNoDefaultEls = document.querySelectorAll('.' + settings.closeClassNoDefault);

    // If ?popup=none (or false/off/0), suppress and set 10-minute cookie
    if (shouldSuppressByQuery()) {
    util.setCookie(settings.cookieName, minutesToDays(10));
    suppression.engage();
    return; // do not schedule/open
    }

    // If suppression cookie already exists, engage suppression and do not schedule
    if (util.hasCookie(settings.cookieName)) {
    suppression.engage();
    return;
    }

    // Normal flow (note: suppression disengaged)
    suppression.disengage();

    if (!util.hasCookie(settings.cookieName) || util.hashExists(settings.forceHash)) {
    if (settings.delay === 0) {
    WmpciPop.open();
    } else {
    setTimeout(WmpciPop.open, settings.delay);
    }
    if (settings.hideAfter) {
    setTimeout(WmpciPop.close, settings.hideAfter + settings.delay);
    }
    }
    };

    // alias
    WmpciPop.start = function(options) {
    WmpciPop.init(options);
    };

    }(window.WmpciPop = window.WmpciPop || {}));


    // -----------------------
    // Custom Code (unchanged API)
    // -----------------------
    jQuery(document).ready(function() {

    var popup_sett = {
    'coverId' : 'wmpci-popup-wrp',
    'delay' : (parseInt(Wmpci_Popup.delay, 10) * 1000),
    'closeOnEscape' : Wmpci_Popup.close_on_esc,
    'expires' : parseInt(Wmpci_Popup.exp_time, 10),
    'hideAfter' : (parseInt(Wmpci_Popup.hide_time, 10) * 1000)
    };

    if (Wmpci_Popup.enable == 1) {
    WmpciPop.start(popup_sett);
    }

    // Extra safety: if query demands suppression, ensure it's closed immediately
    try {
    var v = (new URLSearchParams(window.location.search).get('popup') || '').toLowerCase();
    if (v === 'none' || v === '0' || v === 'false' || v === 'off') {
    // Engage 10-minute suppression immediately as well
    (function(){
    var tenMin = 10 / (24 * 60);
    document.cookie = '_Wmpci_Popup=true; expires=' + (new Date(+new Date() + tenMin * 86400000)).toGMTString() + '; path=/';
    })();
    // Remove class if anything added it already
    document.documentElement.className = document.documentElement.className.replace(/\bwmpci-popup-open\b/g,'').trim();
    }
    } catch (e) {}
    });
Viewing 1 replies (of 1 total)
  • Plugin Author Astoundify

    (@astoundify)

    Hey @dadarocks

    Thanks a lot for flagging this and sharing your modification! That’s a really smart and practical approach — especially for handling popup behavior in email-based links. We appreciate you taking the time to implement and test it on your end.

    We’ll definitely review this idea for inclusion in a future update of the plugin. Having a URL-based parameter like ?popup=none that adjusts the popup delay while respecting existing cookies sounds like a solid enhancement to improve user experience and campaign flexibility.

    Thanks again for your valuable feedback and contribution!

    Best regards,
    Team Astoundify

Viewing 1 replies (of 1 total)

You must be logged in to reply to this topic.