{"id":52368,"date":"2016-11-28T20:41:01","date_gmt":"2016-11-28T20:41:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/wp-bannerize-pro\/"},"modified":"2026-04-11T12:16:26","modified_gmt":"2026-04-11T12:16:26","slug":"wp-bannerize-pro","status":"publish","type":"plugin","link":"https:\/\/mk.wordpress.org\/plugins\/wp-bannerize-pro\/","author":901442,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.13.0","stable_tag":"1.13.0","tested":"6.9.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"WP Bannerize Pro","header_author":"Giovambattista Fazioli","header_description":"","assets_banners_color":"c19468","last_updated":"2026-04-11 12:16:26","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.paypal.com\/donate\/?hosted_button_id=L77YYA8AVH2UW","header_plugin_uri":"https:\/\/bannerize.vercel.app\/","header_author_uri":"https:\/\/undolog.substack.com\/","rating":4.9,"author_block_rating":0,"active_installs":900,"downloads":43317,"num_ratings":10,"support_threads":2,"support_threads_resolved":2,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"gfazioli","date":"2016-11-28 20:41:01"},"1.0.1":{"tag":"1.0.1","author":"gfazioli","date":"2016-11-29 08:22:05"},"1.0.3":{"tag":"1.0.3","author":"gfazioli","date":"2016-12-13 11:38:47"},"1.0.4":{"tag":"1.0.4","author":"gfazioli","date":"2017-01-17 09:23:24"},"1.0.5":{"tag":"1.0.5","author":"gfazioli","date":"2017-01-20 16:57:34"},"1.0.6":{"tag":"1.0.6","author":"gfazioli","date":"2017-01-31 16:54:06"},"1.1.0":{"tag":"1.1.0","author":"gfazioli","date":"2017-02-04 13:05:24"},"1.10.0":{"tag":"1.10.0","author":"gfazioli","date":"2025-03-03 08:43:05"},"1.11.0":{"tag":"1.11.0","author":"gfazioli","date":"2025-08-25 09:32:44"},"1.11.1":{"tag":"1.11.1","author":"gfazioli","date":"2026-01-20 09:05:31"},"1.12.0":{"tag":"1.12.0","author":"gfazioli","date":"2026-03-31 09:38:38"},"1.13.0":{"tag":"1.13.0","author":"gfazioli","date":"2026-04-11 12:16:26"},"1.2.0":{"tag":"1.2.0","author":"gfazioli","date":"2017-03-11 17:02:27"},"1.2.1":{"tag":"1.2.1","author":"gfazioli","date":"2017-03-15 16:50:48"},"1.2.2":{"tag":"1.2.2","author":"gfazioli","date":"2017-03-22 11:48:03"},"1.2.3":{"tag":"1.2.3","author":"gfazioli","date":"2017-05-27 12:19:09"},"1.2.4":{"tag":"1.2.4","author":"gfazioli","date":"2017-06-11 09:14:30"},"1.2.5":{"tag":"1.2.5","author":"gfazioli","date":"2018-01-05 17:53:48"},"1.2.6":{"tag":"1.2.6","author":"gfazioli","date":"2018-03-16 17:22:20"},"1.2.7":{"tag":"1.2.7","author":"gfazioli","date":"2018-03-19 08:52:38"},"1.2.8":{"tag":"1.2.8","author":"gfazioli","date":"2019-01-04 11:02:22"},"1.3.0":{"tag":"1.3.0","author":"gfazioli","date":"2019-01-06 10:14:57"},"1.3.1":{"tag":"1.3.1","author":"gfazioli","date":"2019-01-08 16:53:20"},"1.3.3":{"tag":"1.3.3","author":"gfazioli","date":"2019-01-15 12:08:26"},"1.4.0":{"tag":"1.4.0","author":"gfazioli","date":"2019-02-01 15:22:03"},"1.5.0":{"tag":"1.5.0","author":"gfazioli","date":"2019-12-13 16:33:35"},"1.5.2":{"tag":"1.5.2","author":"gfazioli","date":"2019-12-14 12:25:52"},"1.5.3":{"tag":"1.5.3","author":"gfazioli","date":"2021-07-30 12:50:52"},"1.5.4":{"tag":"1.5.4","author":"gfazioli","date":"2021-09-03 14:14:36"},"1.5.5":{"tag":"1.5.5","author":"gfazioli","date":"2021-09-06 11:41:28"},"1.5.6":{"tag":"1.5.6","author":"gfazioli","date":"2021-09-07 12:32:27"},"1.5.7":{"tag":"1.5.7","author":"gfazioli","date":"2021-09-08 12:36:24"},"1.6.0":{"tag":"1.6.0","author":"gfazioli","date":"2021-10-20 14:44:50"},"1.6.1":{"tag":"1.6.1","author":"gfazioli","date":"2021-12-08 16:57:18"},"1.6.10":{"tag":"1.6.10","author":"gfazioli","date":"2024-03-07 17:40:28"},"1.6.11":{"tag":"1.6.11","author":"gfazioli","date":"2024-03-08 06:57:16"},"1.6.5":{"tag":"1.6.5","author":"gfazioli","date":"2022-02-03 08:00:56"},"1.6.6":{"tag":"1.6.6","author":"gfazioli","date":"2022-06-28 13:41:12"},"1.6.7":{"tag":"1.6.7","author":"gfazioli","date":"2022-07-21 16:14:36"},"1.6.8":{"tag":"1.6.8","author":"gfazioli","date":"2022-07-27 08:03:21"},"1.6.9":{"tag":"1.6.9","author":"gfazioli","date":"2022-07-27 12:07:30"},"1.7.0":{"tag":"1.7.0","author":"gfazioli","date":"2024-04-03 15:39:40"},"1.7.1":{"tag":"1.7.1","author":"gfazioli","date":"2024-05-21 08:09:13"},"1.7.2":{"tag":"1.7.2","author":"gfazioli","date":"2024-05-25 08:24:28"},"1.7.3":{"tag":"1.7.3","author":"gfazioli","date":"2024-05-27 10:08:04"},"1.7.4":{"tag":"1.7.4","author":"gfazioli","date":"2024-05-27 11:31:44"},"1.7.5":{"tag":"1.7.5","author":"gfazioli","date":"2024-05-28 12:01:34"},"1.7.6":{"tag":"1.7.6","author":"gfazioli","date":"2024-06-18 20:05:15"},"1.8.0":{"tag":"1.8.0","author":"gfazioli","date":"2024-07-08 11:58:23"},"1.9.0":{"tag":"1.9.0","author":"gfazioli","date":"2024-07-29 14:18:18"},"1.9.1":{"tag":"1.9.1","author":"gfazioli","date":"2024-08-09 13:23:01"},"1.9.3":{"tag":"1.9.3","author":"gfazioli","date":"2024-08-27 15:05:27"},"1.9.4":{"tag":"1.9.4","author":"gfazioli","date":"2024-11-15 18:19:50"}},"upgrade_notice":{"1.13.0":"<p>Adds WebP image support and fixes PHP 7.4 compatibility. Recommended update for all users.<\/p>","1.12.0":"<p>Major security update with SQL injection, XSS, and SSRF fixes. Bug fixes for Gutenberg block, layout, analytics, and CSV export. Recommended update for all users.<\/p>","1.11.0":"<p>Security update with SSRF protection for external banner images. Recommended update.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":1,"5":9},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3503931,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3503931,"resolution":"256x256","location":"assets","locale":""},"icon-512x512.png":{"filename":"icon-512x512.png","revision":3503931,"resolution":"512x512","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3503931,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3503931,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3503934,"resolution":false,"location":"assets","locale":"","contents":"{\"landingPage\":\"\\\/wp-admin\\\/edit.php?post_type=wp_bannerize\",\"preferredVersions\":{\"php\":\"7.4\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"features\":{\"networking\":true},\"steps\":[{\"step\":\"installPlugin\",\"options\":{\"activate\":true},\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"wp-bannerize-pro\"}},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"}]}"}},"all_blocks":{"wp-bannerize\/block":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"wp-bannerize\/block","title":"Bannerize","textdomain":"wp-bannerize","icon":"smiley","category":"widgets","example":{},"description":"Display a list of banners in accordance with the settings below.","attributes":{"numbers":{"type":"number","default":1},"campaigns":{"type":"array","default":[]},"banners":{"type":"array","default":[]},"orderby":{"type":"string","enum":["menu_order","rand"],"default":"menu_order"}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","viewScript":["file:.\/view.js","example-shared-view-script"],"render":"file:.\/render.php","keywords":["ab967f"]}},"tagged_versions":["1.0.0","1.0.1","1.0.3","1.0.4","1.0.5","1.0.6","1.1.0","1.10.0","1.11.0","1.11.1","1.12.0","1.13.0","1.2.0","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5","1.2.6","1.2.7","1.2.8","1.3.0","1.3.1","1.3.3","1.4.0","1.5.0","1.5.2","1.5.3","1.5.4","1.5.5","1.5.6","1.5.7","1.6.0","1.6.1","1.6.10","1.6.11","1.6.5","1.6.6","1.6.7","1.6.8","1.6.9","1.7.0","1.7.1","1.7.2","1.7.3","1.7.4","1.7.5","1.7.6","1.8.0","1.9.0","1.9.1","1.9.3","1.9.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3114247,"resolution":"1","location":"assets","locale":""},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3114247,"resolution":"10","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3114247,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3114247,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3114247,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3114247,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3114247,"resolution":"6","location":"assets","locale":""},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3114247,"resolution":"7","location":"assets","locale":""},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3114247,"resolution":"8","location":"assets","locale":""},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3114247,"resolution":"9","location":"assets","locale":""}},"screenshots":{"1":"Add new banner by local media library","2":"Add new banner text","3":"Real time preview","4":"Date range rules","5":"Enable impressions and click for single banner","6":"Banner campaigns","7":"Analytics overview","8":"Single report with filters","9":"Settings","10":"Widget"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[321,368,232,784,2501],"plugin_category":[35,36,45],"plugin_contributors":[79032],"plugin_business_model":[],"class_list":["post-52368","plugin","type-plugin","status-publish","hentry","plugin_tags-ads","plugin_tags-advertising","plugin_tags-analytics","plugin_tags-banner","plugin_tags-campaign","plugin_category-advertising","plugin_category-analytics","plugin_category-ecommerce","plugin_contributors-gfazioli","plugin_committers-gfazioli"],"banners":{"banner":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/banner-772x250.png?rev=3503931","banner_2x":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/banner-1544x500.png?rev=3503931","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/icon-128x128.png?rev=3503931","icon_2x":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/icon-256x256.png?rev=3503931","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-1.png?rev=3114247","caption":"Add new banner by local media library"},{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-2.png?rev=3114247","caption":"Add new banner text"},{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-3.png?rev=3114247","caption":"Real time preview"},{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-4.png?rev=3114247","caption":"Date range rules"},{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-5.png?rev=3114247","caption":"Enable impressions and click for single banner"},{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-6.png?rev=3114247","caption":"Banner campaigns"},{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-7.png?rev=3114247","caption":"Analytics overview"},{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-8.png?rev=3114247","caption":"Single report with filters"},{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-9.png?rev=3114247","caption":"Settings"},{"src":"https:\/\/ps.w.org\/wp-bannerize-pro\/assets\/screenshot-10.png?rev=3114247","caption":"Widget"}],"raw_content":"<!--section=description-->\n<p>Bannerize is a WordPress plugin for creating and managing advertising banners with built-in analytics. Create image, HTML, or text banners, organize them into campaigns, and track impressions, clicks, and click-through rates to measure the effectiveness of your advertising.<\/p>\n\n<p>For full documentation, visit the <a href=\"https:\/\/bannerize.vercel.app\">Bannerize website<\/a>.<\/p>\n\n<h3>Banner Types<\/h3>\n\n<ul>\n<li><strong>Image Banners<\/strong> \u2014 Upload from your WordPress media library or link to external image URLs<\/li>\n<li><strong>HTML Banners<\/strong> \u2014 Use the rich text editor to create custom HTML, embed third-party ad code, iframes, or video players<\/li>\n<li><strong>Text Banners<\/strong> \u2014 Simple text-based banners with full formatting support<\/li>\n<\/ul>\n\n<h3>Display Methods<\/h3>\n\n<ul>\n<li><strong>Gutenberg Block<\/strong> \u2014 Native block editor integration with campaign and banner selection<\/li>\n<li><strong>Shortcode<\/strong> \u2014 <code>[wp_bannerize_pro]<\/code> with filtering by campaign, order, layout, device, and geolocation<\/li>\n<li><strong>Widget<\/strong> \u2014 Dedicated sidebar widget with all configuration options<\/li>\n<li><strong>PHP Function<\/strong> \u2014 <code>wp_bannerize_pro()<\/code> and <code>get_wp_bannerize_pro()<\/code> for theme templates<\/li>\n<\/ul>\n\n<h3>Analytics<\/h3>\n\n<ul>\n<li><strong>Impressions Tracking<\/strong> \u2014 Records every banner view with timestamp, referrer, IP, and user agent<\/li>\n<li><strong>Clicks Tracking<\/strong> \u2014 Records every banner click with the same contextual data<\/li>\n<li><strong>CTR Calculation<\/strong> \u2014 Automatic click-through rate computation<\/li>\n<li><strong>Trend Charts<\/strong> \u2014 Visualize performance over time (hourly, daily, weekly, monthly)<\/li>\n<li><strong>Top Performers<\/strong> \u2014 Rankings of best-performing banners and campaigns<\/li>\n<li><strong>Export<\/strong> \u2014 Download analytics data in CSV or SQL format<\/li>\n<li><strong>Auto Cleanup<\/strong> \u2014 Configurable data retention policies<\/li>\n<\/ul>\n\n<h3>Advanced Features<\/h3>\n\n<ul>\n<li><strong>Campaigns<\/strong> \u2014 Organize banners into campaigns for grouped display and filtering<\/li>\n<li><strong>Scheduling<\/strong> \u2014 Set start and end dates for time-limited promotions<\/li>\n<li><strong>Performance Limits<\/strong> \u2014 Set maximum impressions and clicks per banner<\/li>\n<li><strong>Drag &amp; Drop Sorting<\/strong> \u2014 Reorder banners with ease<\/li>\n<li><strong>Device Targeting<\/strong> \u2014 Show banners only on mobile or desktop<\/li>\n<li><strong>Geolocation<\/strong> \u2014 Target banners by visitor country (via IPStack)<\/li>\n<li><strong>User Roles<\/strong> \u2014 Three built-in roles: Banners Manager, Campaigns Manager, Campaigns Viewer<\/li>\n<li><strong>Custom Templates<\/strong> \u2014 Override banner and campaign archive templates<\/li>\n<\/ul>\n\n<h3>Dashboard Widget<\/h3>\n\n<p>A compact dashboard widget showing key banner performance metrics at a glance.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the entire content of plugin archive to your <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress (deactivate and reactivate if you're upgrading).<\/li>\n<li>Done. Enjoy.<\/li>\n<\/ol>\n\n<p>For detailed instructions, see the <a href=\"https:\/\/bannerize.vercel.app\/docs\/getting-started\/installation\">installation guide<\/a>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"1.%20what%20is%20bannerize%3F\"><h3>1. What is Bannerize?<\/h3><\/dt>\n<dd><p>Bannerize is a WordPress banner management plugin with built-in analytics. It helps you create, organize, and track the performance of advertising banners on your site.<\/p><\/dd>\n<dt id=\"2.%20where%20can%20i%20find%20the%20documentation%3F\"><h3>2. Where can I find the documentation?<\/h3><\/dt>\n<dd><p>Full documentation, guides, and release notes are available at <a href=\"https:\/\/bannerize.vercel.app\">bannerize.vercel.app<\/a>.<\/p><\/dd>\n<dt id=\"3.%20what%20banner%20formats%20are%20supported%3F\"><h3>3. What banner formats are supported?<\/h3><\/dt>\n<dd><p>Bannerize supports three types: local images (from your media library), remote images (external URLs), and HTML\/text banners (custom HTML, ad code, iframes).<\/p><\/dd>\n<dt id=\"4.%20how%20do%20i%20display%20banners%3F\"><h3>4. How do I display banners?<\/h3><\/dt>\n<dd><p>You can display banners using a Gutenberg block, shortcode (<code>[wp_bannerize_pro]<\/code>), sidebar widget, or PHP function (<code>wp_bannerize_pro()<\/code>).<\/p><\/dd>\n<dt id=\"5.%20can%20i%20track%20banner%20performance%3F\"><h3>5. Can I track banner performance?<\/h3><\/dt>\n<dd><p>Yes. Bannerize tracks impressions, clicks, and click-through rate (CTR) for every banner. View analytics in the Bannerize dashboard and export data in CSV or SQL format.<\/p><\/dd>\n<dt id=\"6.%20can%20i%20customize%20the%20html%20output%3F\"><h3>6. Can I customize the HTML output?<\/h3><\/dt>\n<dd><p>Yes. Use the <code>wp_bannerize_classes<\/code> filter to add custom CSS classes, or configure custom templates in Settings. See <a href=\"https:\/\/bannerize.vercel.app\/docs\/display-banners\/customize-output\">Customize Output<\/a>.<\/p><\/dd>\n<dt id=\"7.%20does%20bannerize%20support%20geolocation%3F\"><h3>7. Does Bannerize support geolocation?<\/h3><\/dt>\n<dd><p>Yes. With an IPStack API key, you can target banners by visitor country using the <code>[wp_bannerize_pro_geo]<\/code> shortcode or the widget geo field.<\/p><\/dd>\n<dt id=\"8.%20can%20i%20request%20a%20new%20feature%3F\"><h3>8. Can I request a new feature?<\/h3><\/dt>\n<dd><p>Yes! Please submit feature requests at <a href=\"https:\/\/wordpress.org\/support\/plugin\/wp-bannerize-pro\/\">the support forum<\/a>.<\/p><\/dd>\n<dt id=\"9.%20can%20i%20report%20a%20bug%3F\"><h3>9. Can I report a bug?<\/h3><\/dt>\n<dd><p>Yes! Please report bugs at <a href=\"https:\/\/wordpress.org\/support\/plugin\/wp-bannerize-pro\/\">the support forum<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h3>1.13.0<\/h3>\n\n<p>Feature, Security &amp; Compatibility Update<\/p>\n\n<h4>New Features<\/h4>\n\n<ul>\n<li>Added WebP image format support for local and remote banners<\/li>\n<li>WebP banners can now be uploaded from the media library or linked via external URLs<\/li>\n<li>Updated remote image validation to accept image\/webp content type<\/li>\n<\/ul>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>Hardened analytics queries: campaign and banner ID filters now use $wpdb-&gt;prepare() placeholders instead of string interpolation<\/li>\n<li>Fixed invalid SQL placeholder (%1s) in analytics cleanup LIMIT clause, replaced with %d<\/li>\n<li>Hardened meta key JOINs in banner query builder with $wpdb-&gt;prepare() for all meta_key values<\/li>\n<li>Fixed SQL export using unescaped table name in INSERT statements<\/li>\n<li>Added capability check (manage_banners) to admin error notice display<\/li>\n<li>Used esc_html__() for translatable admin notice output<\/li>\n<\/ul>\n\n<h4>Bug Fixes<\/h4>\n\n<ul>\n<li>Fixed PHP 8.0+ function str_starts_with() usage that broke compatibility with PHP 7.4<\/li>\n<li>Fixed duplicate entries in image MIME types array<\/li>\n<li>Fixed uninitialized $width and $height variables when image size detection fails<\/li>\n<li>Fixed potential fatal error when mime type is not detected during banner save<\/li>\n<li>Fixed string-to-integer comparison in banner list column for max impressions\/clicks<\/li>\n<li>Fixed Gutenberg block missing \"type\" field for orderby attribute in block.json causing REST API warnings<\/li>\n<li>Fixed fatal error \"read property ID on null\" in getBannerClasses() when banner post is null<\/li>\n<li>Fixed esc_attr() used instead of esc_html() for impressions\/clicks column output<\/li>\n<li>Fixed incorrect sanitization order (absint on esc_attr result) in pagination input<\/li>\n<\/ul>\n\n<h4>Improvements<\/h4>\n\n<ul>\n<li>Redesigned horizontal layout with modern flexbox and responsive 2-column grid on wide screens, single column on mobile<\/li>\n<li>Vertical layout now uses flexbox with consistent gap spacing<\/li>\n<li>Banner images are fully responsive with max-width: 100% and auto height<\/li>\n<li>Refactored banner query meta key JOINs from repetitive code to loop-based construction<\/li>\n<li>Removed dead code: commented-out create_function() reference<\/li>\n<li>Refreshed readme.txt with structured description, expanded FAQ, and documentation links<\/li>\n<li>Rewrote README.md with badges, features, tech stack, and project structure<\/li>\n<\/ul>\n\n<h3>1.12.0<\/h3>\n\n<p>Security, Bug Fixes &amp; Improvements<\/p>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>Fixed SQL injection vulnerabilities in analytics queries (impressions, clicks, CTR trends)<\/li>\n<li>Fixed SQL injection in the legacy importer controller<\/li>\n<li>Fixed XSS in banner rendering: added proper escaping for image src, alt, title, link href, and target attributes<\/li>\n<li>Fixed XSS in text banner rendering: added escaping for width\/height style attributes<\/li>\n<li>Fixed stored XSS risk: sanitized IP address and User-Agent before saving to the database<\/li>\n<li>Fixed SSRF in image size detection: replaced raw cURL and getimagesize() with wp_remote_get()<\/li>\n<li>Fixed SSRF in remote image validation: replaced raw cURL with wp_remote_head()<\/li>\n<li>Hardened options update endpoint with schema validation, key whitelist, and sanitize_file_name() for template paths<\/li>\n<li>Hardened wp_loaded banner endpoint: added post type check, ID validation, null safety, and wp_kses_post() output filtering<\/li>\n<li>Removed full plugin options exposure from public frontend<\/li>\n<li>Used wp_json_encode() for all inline script output to prevent script injection<\/li>\n<\/ul>\n\n<h4>Bug Fixes<\/h4>\n\n<ul>\n<li>Fixed Gutenberg block not filtering by campaign<\/li>\n<li>Fixed banner layout always forced to vertical regardless of the layout parameter<\/li>\n<li>Fixed banner preview meta box not appearing in the editor<\/li>\n<li>Fixed analytics data not deleted when a banner is permanently removed<\/li>\n<li>Fixed cron cleanup events not cleared when tracking is disabled or plugin is deactivated<\/li>\n<li>Fixed N+1 query issue: banner click\/impression counts with value 0 no longer trigger unnecessary COUNT queries<\/li>\n<li>Fixed resetOptions calling a non-existent AJAX action<\/li>\n<li>Fixed DataTable crash when a banner has no campaigns assigned<\/li>\n<li>Fixed CSV export using incorrect escape sequence instead of RFC 4180 standard<\/li>\n<\/ul>\n\n<h4>Improvements<\/h4>\n\n<ul>\n<li>Replaced remove_all_filters('parse_query') with explicit suppress_filters<\/li>\n<li>Replaced deprecated get_terms() positional arguments with array syntax<\/li>\n<li>Replaced date() with gmdate() for WordPress coding standards<\/li>\n<li>Aligned all SQL queries to use %i placeholder for table identifiers<\/li>\n<li>Removed all debug error_log() calls and console.log() from production code<\/li>\n<li>Migrated CPT meta box registration to registerMetaBoxes()<\/li>\n<\/ul>\n\n<h3>1.11.0<\/h3>\n\n<p>Security &amp; Enhancement Updates<\/p>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>Added SSRF protection for external banner image URLs<\/li>\n<li>Added wp_bannerize_is_remote_image() validation method<\/li>\n<li>Only allows JPEG, PNG, and GIF formats from external sources<\/li>\n<li>Added admin error notice when invalid image URLs are submitted<\/li>\n<\/ul>\n\n<h4>Improvements<\/h4>\n\n<ul>\n<li>Standardized code formatting and indentation<\/li>\n<li>Added user-friendly error messages for invalid banner image URLs<\/li>\n<\/ul>","raw_excerpt":"Bannerize simplifies banner creation and management. Track views and clicks to gauge campaign success.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/52368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=52368"}],"author":[{"embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/gfazioli"}],"wp:attachment":[{"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=52368"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=52368"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=52368"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=52368"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=52368"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mk.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=52368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}