{"id":226470,"date":"2025-05-26T14:32:57","date_gmt":"2025-05-26T14:32:57","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/id-popup\/"},"modified":"2026-03-21T11:34:13","modified_gmt":"2026-03-21T11:34:13","slug":"id-popup","status":"publish","type":"plugin","link":"https:\/\/gl.wordpress.org\/plugins\/id-popup\/","author":18443543,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.5","stable_tag":"1.5","tested":"6.7.5","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"ID Popup","header_author":"InDesignMedia","header_description":"A plugin to display a responsive popup image, rodblock, advertise popup with scheduling and customization options.","assets_banners_color":"e4f3f4","last_updated":"2026-03-21 11:34:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/indesignmedia.net","rating":5,"author_block_rating":0,"active_installs":10,"downloads":1017,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"indesignmedia","date":"2025-05-26 14:32:40"},"1.4":{"tag":"1.4","author":"indesignmedia","date":"2026-03-21 11:20:48"},"1.5":{"tag":"1.5","author":"indesignmedia","date":"2026-03-21 11:34:13"}},"upgrade_notice":{"1.5":"<p>Minor update to readme description and tags for repository compatibility.<\/p>","1.4":"","1.2":"<p>Major architecture upgrade introducing multiple popup support via Custom Post Type. Your existing settings are automatically migrated to a new &quot;Default Popup&quot; post on first admin load \u2014 no manual steps required.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3487741,"resolution":"128x128","location":"assets","locale":""},"icon-265x265.jpg":{"filename":"icon-265x265.jpg","revision":3487732,"resolution":"265x265","location":"assets","locale":""},"icon-512x512.png":{"filename":"icon-512x512.png","revision":3487741,"resolution":"512x512","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3487732,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3487732,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.4","1.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3487732,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3300817,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3300817,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3300817,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"<strong>Popup List<\/strong> \u2014 The Popups admin screen showing all created popups with status.","2":"<strong>Media Setup<\/strong> \u2014 Upload desktop and mobile images using the WordPress Media Library with live preview and remove button.","3":"<strong>Display Rules<\/strong> \u2014 Dropdown with all targeting options including WooCommerce product rules.","4":"<strong>Appearance &amp; Behavior<\/strong> \u2014 Configure delay, overlay, auto-close, and target URL.","5":"<strong>Live Popup<\/strong> \u2014 Example of the popup displayed on the frontend with overlay."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[1045,8772,29688,55649],"plugin_category":[35],"plugin_contributors":[194132],"plugin_business_model":[],"class_list":["post-226470","plugin","type-plugin","status-publish","hentry","plugin_tags-popup-plugin","plugin_tags-responsive-popup","plugin_tags-roadblock","plugin_tags-woocommerce-popup","plugin_category-advertising","plugin_contributors-indesignmedia","plugin_committers-indesignmedia"],"banners":{"banner":"https:\/\/ps.w.org\/id-popup\/assets\/banner-772x250.jpg?rev=3487732","banner_2x":"https:\/\/ps.w.org\/id-popup\/assets\/banner-1544x500.jpg?rev=3487732","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/id-popup\/assets\/icon-128x128.png?rev=3487741","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/id-popup\/assets\/screenshot-1.png?rev=3487732","caption":"<strong>Popup List<\/strong> \u2014 The Popups admin screen showing all created popups with status."},{"src":"https:\/\/ps.w.org\/id-popup\/assets\/screenshot-2.png?rev=3300817","caption":"<strong>Media Setup<\/strong> \u2014 Upload desktop and mobile images using the WordPress Media Library with live preview and remove button."},{"src":"https:\/\/ps.w.org\/id-popup\/assets\/screenshot-3.png?rev=3300817","caption":"<strong>Display Rules<\/strong> \u2014 Dropdown with all targeting options including WooCommerce product rules."},{"src":"https:\/\/ps.w.org\/id-popup\/assets\/screenshot-4.png?rev=3300817","caption":"<strong>Appearance &amp; Behavior<\/strong> \u2014 Configure delay, overlay, auto-close, and target URL."}],"raw_content":"<!--section=description-->\n<p><strong>ID Popup<\/strong> is a powerful, lightweight WordPress plugin for displaying fully customizable and responsive image popups on your website. Built on a <strong>Custom Post Type<\/strong> architecture, you can create and manage <strong>unlimited independent popups<\/strong>, each with their own settings, display rules, and scheduling.<\/p>\n\n<p>Whether you're running a flash sale, announcing a new product, or displaying a promotional banner, ID Popup gives you complete control over when, where, and to whom your popups appear.<\/p>\n\n<h3>Key Features<\/h3>\n\n<p><strong>Multiple Popups<\/strong>\n* Create unlimited independent popups, each with their own individual settings.\n* Manage all popups from a dedicated <strong>Popups<\/strong> menu in the WordPress admin.<\/p>\n\n<p><strong>Smart Display Rules<\/strong>\n* Show on the <strong>Entire Website<\/strong>, <strong>Home Page Only<\/strong>, <strong>All Pages<\/strong>, or <strong>All Single Posts<\/strong>.\n* Target <strong>Specific Page(s)<\/strong> or <strong>Specific Post(s)<\/strong> using a live-search Select2 picker.\n* <strong>WooCommerce Support<\/strong>: Display on <strong>All Product Pages<\/strong> or target <strong>Specific Product Page(s)<\/strong> \u2014 only shown when WooCommerce is active.<\/p>\n\n<p><strong>Responsive Image Support<\/strong>\n* Upload separate images for <strong>Desktop<\/strong> and <strong>Mobile<\/strong> devices via the native WordPress Media Library.\n* If no mobile image is set, the popup is automatically <strong>suppressed on mobile devices<\/strong>.\n* If no desktop image is set, the popup is automatically <strong>suppressed on desktop devices<\/strong>.\n* Remove images with a single click using the built-in remove (\u00d7) button.<\/p>\n\n<p><strong>Popup Scheduling<\/strong>\n* Set independent <strong>Start Date &amp; Time<\/strong> and <strong>End Date &amp; Time<\/strong> for each popup.\n* Each date bound is evaluated independently \u2014 set only a start date, only an end date, or both.<\/p>\n\n<p><strong>Appearance &amp; Behavior<\/strong>\n* Configurable <strong>Delay Before Opening<\/strong> (default: 3 seconds).\n* Auto-close timer \u2014 set to 0 to disable auto-close entirely (default: 15 seconds).\n* Customizable <strong>Overlay Color<\/strong> and <strong>Overlay Opacity<\/strong>.\n* Linkable popup image with <strong>Target URL<\/strong> (opens in a new tab, with <code>rel=\"noopener noreferrer\"<\/code>).\n* <strong>Desktop Max Width<\/strong> control in pixels (default: 900px).<\/p>\n\n<p><strong>Native WordPress Integration<\/strong>\n* Built on WordPress <strong>Custom Post Type<\/strong> \u2014 no custom database tables.\n* Uses the native <strong>WordPress Media Uploader<\/strong> \u2014 no third-party upload dependencies.\n* <strong>Select2<\/strong> live search for selecting specific pages, posts, or products.\n* Automatic one-time <strong>data migration<\/strong> from older single-setting versions.<\/p>\n\n<h3>Use Cases<\/h3>\n\n<ul>\n<li>Flash sales and limited-time promotions<\/li>\n<li>New product announcements<\/li>\n<li>Email list opt-ins and lead capture<\/li>\n<li>WooCommerce product-specific upsells<\/li>\n<li>Event announcements and countdowns<\/li>\n<li>Site-wide notices and alerts<\/li>\n<\/ul>\n\n<h3>Support<\/h3>\n\n<p>For assistance, documentation, or to report bugs, visit the <a href=\"https:\/\/indesignmedia.net\/contact-us\/\">ID Popup Support Page<\/a>.<\/p>\n\n<p>For further documentation and usage guides, please visit our <a href=\"https:\/\/indesignmedia.net\/plugins\/id-popup\">official documentation<\/a>.<\/p>\n\n<h3>License<\/h3>\n\n<p>ID Popup is licensed under the <strong>GPLv2<\/strong> or later. You can freely redistribute and modify it as per the terms of the license.<\/p>\n\n<p>The full license can be found here: <a href=\"https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\">GPLv2 License<\/a><\/p>\n\n<!--section=installation-->\n<ol>\n<li><p><strong>Upload the Plugin<\/strong><\/p>\n\n<ul>\n<li>Download the plugin ZIP file.<\/li>\n<li>Go to <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong> in your WordPress admin.<\/li>\n<li>Select the <code>id-popup.zip<\/code> file and click <strong>Install Now<\/strong>.<\/li>\n<\/ul><\/li>\n<li><p><strong>Activate the Plugin<\/strong><\/p>\n\n<ul>\n<li>Click <strong>Activate<\/strong> after installation.<\/li>\n<\/ul><\/li>\n<li><p><strong>Create Your First Popup<\/strong><\/p>\n\n<ul>\n<li>Navigate to <strong>Popups &gt; Add New<\/strong> in the WordPress admin sidebar.<\/li>\n<li>Give your popup a title, upload images, configure display rules and scheduling, then click <strong>Publish<\/strong>.<\/li>\n<\/ul><\/li>\n<li><p><strong>Adding More Popups<\/strong><\/p>\n\n<ul>\n<li>Go to <strong>Popups &gt; Add New<\/strong> again. Each popup is fully independent with its own settings.<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20i%20create%20multiple%20popups%3F\"><h3>Can I create multiple popups?<\/h3><\/dt>\n<dd><p>Yes! Version 1.4 introduced a full <strong>Custom Post Type<\/strong> architecture. You can create unlimited independent popups, each with its own images, display rules, and schedule, all managed from the <strong>Popups<\/strong> menu in your admin sidebar.<\/p><\/dd>\n<dt id=\"can%20i%20use%20different%20images%20for%20desktop%20and%20mobile%3F\"><h3>Can I use different images for desktop and mobile?<\/h3><\/dt>\n<dd><p>Yes. You can upload separate images for desktop and mobile in the <strong>Media Setup<\/strong> section of each popup. If one is missing, the popup is automatically hidden on that device type \u2014 no broken images, no empty containers.<\/p><\/dd>\n<dt id=\"can%20i%20schedule%20the%20popup%20to%20appear%20only%20on%20specific%20dates%3F\"><h3>Can I schedule the popup to appear only on specific dates?<\/h3><\/dt>\n<dd><p>Yes. Set a <strong>Start Date &amp; Time<\/strong> and\/or <strong>End Date &amp; Time<\/strong> for each popup. Each boundary is evaluated independently \u2014 you can have an end-date-only popup that phases out on a deadline without requiring a start date.<\/p><\/dd>\n<dt id=\"can%20i%20target%20specific%20pages%2C%20posts%2C%20or%20woocommerce%20products%3F\"><h3>Can I target specific pages, posts, or WooCommerce products?<\/h3><\/dt>\n<dd><p>Yes. Use the <strong>Display Rules<\/strong> dropdown to select <strong>Specific Page(s)<\/strong>, <strong>Specific Post(s)<\/strong>, or (if WooCommerce is active) <strong>Specific Product Page(s)<\/strong>. A live Select2 search lets you search and choose items by name without needing to know their IDs.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%3F\"><h3>Does it work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. When WooCommerce is active, two additional display rules appear in the dropdown: <strong>All Product Pages<\/strong> and <strong>Specific Product Page(s)<\/strong>, allowing you to target your WooCommerce store with surgical precision.<\/p><\/dd>\n<dt id=\"how%20does%20auto%20close%20work%3F\"><h3>How does Auto Close work?<\/h3><\/dt>\n<dd><p>The <strong>Auto Close After (s)<\/strong> field sets a timer in seconds after which the popup automatically closes. Set it to <strong>0<\/strong> to disable auto-close entirely and keep the popup open until the user manually closes it.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20had%20the%20old%20single-settings%20version%20installed%3F\"><h3>What happens if I had the old single-settings version installed?<\/h3><\/dt>\n<dd><p>The plugin automatically detects and migrates your old settings into a new popup post called \"Default Popup\" on the first admin load after upgrading. No data is lost.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5<\/h4>\n\n<p><em>Released: March 2026<\/em>\n* Updated short description and tags.\n* Synchronised plugin version with stable tag.<\/p>\n\n<h4>1.4<\/h4>\n\n<p><strong>Security Hardening<\/strong>\n* Added <code>wp_die()<\/code> after <code>wp_send_json_error()<\/code> in AJAX handler to prevent continued execution after unauthorized access.\n* Whitelisted the <code>type<\/code> parameter in the AJAX search handler against known post types \u2014 unknown types are rejected with <code>wp_die()<\/code>.\n* Switched <code>popup_link<\/code> sanitization from <code>sanitize_text_field()<\/code> to <code>esc_url_raw()<\/code> \u2014 correct WordPress standard for URL fields stored in the database.\n* Added strict allowlist validation for <code>display_rules<\/code> using <code>in_array()<\/code> with type checking.\n* Cast all <code>specific_ids<\/code> to integers using <code>intval<\/code> \u2014 eliminates any possibility of string injection through ID fields.\n* Applied <code>esc_html()<\/code> to post titles and <code>absint()<\/code> to IDs in AJAX JSON responses.\n* Applied <code>esc_attr()<\/code> to <code>desktop_max_width<\/code> in inline style output.<\/p>\n\n<p><strong>Bug Fixes<\/strong>\n* Fixed auto-close value of <code>0<\/code> not working \u2014 <code>parseInt(0) || 15000<\/code> was incorrectly evaluating to <code>15000<\/code>. Now uses <code>isNaN()<\/code> check so <code>0<\/code> correctly disables auto-close.\n* Fixed mobile skip logic \u2014 <code>data()<\/code> returns a string but was compared with <code>=== 0<\/code> (integer). Wrapped with <code>parseInt()<\/code> for correct type coercion.\n* Fixed scheduling logic \u2014 previously required both start AND end dates to evaluate; now each date boundary is checked independently.\n* Removed dead <code>$preview_style<\/code> PHP variable that was computed but never used.<\/p>\n\n<p><strong>Performance<\/strong>\n* Added <code>no_found_rows: true<\/code> and <code>update_post_term_cache: false<\/code> to the frontend <code>WP_Query<\/code> to skip unnecessary database queries.\n* Popup HTML is now skipped in PHP entirely if neither desktop nor mobile images are set.<\/p>\n\n<h4>1.3<\/h4>\n\n<p><em>Released: March 2026<\/em><\/p>\n\n<p><strong>New: WooCommerce Display Rules<\/strong>\n* Added <strong>All Product Pages<\/strong> display rule \u2014 shows popup on any WooCommerce single product page.\n* Added <strong>Specific Product Page(s)<\/strong> display rule \u2014 target individual WooCommerce products by name using the Select2 search interface.\n* WooCommerce rules are only rendered in the admin dropdown when WooCommerce is active (<code>class_exists('WooCommerce')<\/code>).\n* AJAX search handler now supports <code>product<\/code> post type when <code>specific_products<\/code> rule is selected.<\/p>\n\n<p><strong>Select2 Improvements<\/strong>\n* Placeholder text dynamically updates based on selected display rule: \"Search pages\u2026\", \"Search posts\u2026\", or \"Search products\u2026\".\n* Select2 search field now appears for <code>specific_products<\/code> rule in addition to <code>specific_pages<\/code> and <code>specific_posts<\/code>.<\/p>\n\n<p><strong>Display Rule Precision<\/strong>\n* \"All Single Posts\" now uses <code>is_singular('post')<\/code> instead of <code>is_single()<\/code> \u2014 correctly excludes custom post types and WooCommerce products.\n* \"Specific Post(s)\" rule now uses <code>is_singular('post')<\/code> + <code>get_queried_object_id()<\/code> matching \u2014 consistent with the specific pages and products pattern.\n* \"Specific Page(s)\" now uses <code>get_queried_object_id()<\/code> for ID matching instead of passing an array to <code>is_page()<\/code>.<\/p>\n\n<h4>1.2<\/h4>\n\n<p><em>Released: March 2026<\/em><\/p>\n\n<p><strong>Multiple Popups Architecture (Major Feature)<\/strong>\n* Migrated from a single WordPress Options API settings page to a <strong>Custom Post Type<\/strong> (<code>id_popup<\/code>).\n* Each popup is now an independent WordPress post with its own title, settings, and lifecycle.\n* Added dedicated <strong>Popups<\/strong> menu item in the WordPress admin sidebar with a custom dashicon.\n* Three separate native WordPress Meta Boxes replace the single settings form: <strong>Media Setup<\/strong>, <strong>Display Rules &amp; Scheduling<\/strong>, and <strong>Appearance &amp; Behavior<\/strong>.\n* Meta box headers styled with the plugin's red theme using CSS targeting native WP postbox elements.\n* Added automatic one-time data migration from the old <code>id_popup_settings<\/code> option into a new \"Default Popup\" post \u2014 no data loss on upgrade.<\/p>\n\n<p><strong>Frontend Multi-Popup Support<\/strong>\n* Frontend now uses <code>WP_Query<\/code> to loop all published <code>id_popup<\/code> posts.\n* Each popup evaluated independently for scheduling and display rules.\n* HTML output switched from singleton IDs (<code>#id-popup<\/code>) to classes (<code>.id-popup-container<\/code>, <code>.id-popup-overlay<\/code>) to support multiple simultaneous popups on one page.\n* Per-popup delay and auto-close timings passed via <code>data-delay<\/code> and <code>data-autoclose<\/code> attributes \u2014 no global JS variables.<\/p>\n\n<p><strong>Image Handling<\/strong>\n* Each popup independently skips rendering if no image is configured for the current device type.\n* Device detection (<code>data-has-desktop<\/code>, <code>data-has-mobile<\/code>) evaluated fresh per popup per page load.<\/p>\n\n<h4>1.1<\/h4>\n\n<p><em>Released: March 2026<\/em><\/p>\n\n<p><strong>WordPress Media Library Integration<\/strong>\n* Replaced plain URL input fields with the native <strong>WordPress Media Uploader<\/strong>.\n* Plugin now stores WordPress <strong>Attachment IDs<\/strong> instead of raw image URLs \u2014 more robust, survives media library reorganization.\n* Image URLs are dynamically resolved at render time using <code>wp_get_attachment_image_url()<\/code>.\n* Added <code>attachment_url_to_postid()<\/code> fallback for any legacy string URL values still in the database.\n* Added live image previews in the admin for both desktop and mobile images.\n* Added remove (\u00d7) button on image thumbnails \u2014 clears the attachment ID and hides the preview without a page reload.<\/p>\n\n<p><strong>Display Rules Expansion<\/strong>\n* Added <strong>All Pages<\/strong> display rule.\n* Added <strong>All Single Posts<\/strong> display rule.\n* Added <strong>Specific Page(s)<\/strong> display rule with Select2 live search.\n* Added <strong>Specific Post(s)<\/strong> display rule with Select2 live search.\n* \"Specific Page\/Post\" field dynamically shows\/hides based on the selected rule (hidden by default).<\/p>\n\n<p><strong>Select2 Integration<\/strong>\n* Integrated Select2 library for the specific page\/post ID selection.\n* AJAX-powered live search for pages and posts.\n* Selected items displayed as removable pill tags.\n* Automatically clears selections when an incompatible display rule is chosen.<\/p>\n\n<p><strong>Field Defaults<\/strong>\n* Desktop Max Width defaults to 900px.\n* Auto Close defaults to 15 seconds.\n* Delay Before Opening defaults to 3 seconds.\n* Target URL defaults to <code>#<\/code>.<\/p>\n\n<h4>1.0<\/h4>\n\n<p><em>Released: 2024<\/em><\/p>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Responsive popup image support for desktop and mobile.<\/li>\n<li>Popup scheduling with start and end dates.<\/li>\n<li>Display location control: entire site, homepage, or single post.<\/li>\n<li>Overlay color and opacity controls.<\/li>\n<li>Linkable popup image.<\/li>\n<li>Auto-close timer.<\/li>\n<li>Popup delay setting.<\/li>\n<\/ul>","raw_excerpt":"Professional WordPress popup plugin \u2014 display responsive image popups with advanced display rules, WooCommerce support, and flexible scheduling.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/226470","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=226470"}],"author":[{"embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/indesignmedia"}],"wp:attachment":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=226470"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=226470"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=226470"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=226470"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=226470"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=226470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}