{"id":183314,"date":"2023-12-12T13:06:38","date_gmt":"2023-12-12T13:06:38","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/wpxero-iframe\/"},"modified":"2026-08-26T17:36:30","modified_gmt":"2026-08-26T17:36:30","slug":"wpxero-iframe","status":"publish","type":"plugin","link":"https:\/\/sah.wordpress.org\/plugins\/wpxero-iframe\/","author":21159831,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.1","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Iframe Block \u2013 Easy Embed Block for YouTube, Vimeo & More","header_author":"WPXERO","header_description":"Wpxero iframe for  WordPress Users. You can use this block to embed iframe, video, audio, maps, google map, etc.","assets_banners_color":"6c6c99","last_updated":"2026-08-26 17:36:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/addonium\/wpxero-iframe","header_author_uri":"https:\/\/wpxero.com","rating":0,"author_block_rating":0,"active_installs":10,"downloads":1168,"num_ratings":0,"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":"wpxero","date":"2025-04-15 15:10:28"},"1.0.1":{"tag":"1.0.1","author":"wpxero","date":"2025-04-15 15:10:28"},"1.0.2":{"tag":"1.0.2","author":"wpxero","date":"2026-05-06 15:48:16"},"1.0.3":{"tag":"1.0.3","author":"wpxero","date":"2026-05-24 02:07:41"},"1.1.0":{"tag":"1.1.0","author":"wpxero","date":"2026-08-26 17:36:30"}},"upgrade_notice":{"1.1.0":"<p>Fixes lazy-load reload loops and false YouTube detection, adds responsive aspect ratios and YouTube privacy mode. Existing blocks are migrated automatically. Requires WordPress 6.5+.<\/p>","1.0.4":"<p>Compatibility release for WordPress 7.1. No functional changes \u2014 safe drop-in update.<\/p>","1.0.3":"<p>Maintenance release: updated build tooling and rebuilt block assets.<\/p>","1.0.2":"<p>Adds optional SEO captions, semantic figure markup, and a noscript fallback link for embeds.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3667461,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3667461,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3667461,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3667536,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3667543,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/post.php?post=2&action=edit\",\"preferredVersions\":{\"php\":\"8.0\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"wpxero-iframe\"},\"options\":{\"activate\":true}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Iframe Block\",\"blogdescription\":\"Embed iframe, video, audio, maps, google map, etc.\"}}]}"}},"all_blocks":{"wpxero-iframe\/iframe":{"apiVersion":3,"name":"wpxero-iframe\/iframe","version":"1.1.0","title":"Iframe & embed (YouTube, Vimeo, maps)","category":"wpxero-iframe","description":"Embed responsive HTTPS iframes for YouTube, Vimeo, Google Maps, audio, booking tools, and more. Add an optional visible caption and accessible title for SEO and screen readers.","supports":{"html":false,"anchor":true},"keywords":["iframe","embed","video","youtube","vimeo","maps","google maps","form"],"attributes":{"iframe_url":{"type":"string","default":""},"iframe_title":{"type":"string","default":""},"iframe_caption":{"type":"string","default":""},"iframe_height":{"type":"number","default":350},"iframe_allowfullscreen":{"type":"boolean","default":false},"iframe_scrolling":{"type":"string","default":"no"},"iframe_sandbox":{"type":"string","default":""},"iframe_id":{"type":"string","default":""},"iframe_class":{"type":"string","default":""},"iframe_name":{"type":"string","default":""},"iframe_style":{"type":"string","default":""},"lazyload":{"type":"boolean","default":false},"threshold":{"type":"number","default":0},"live":{"type":"boolean","default":false},"alignments":{"type":"string","default":"center"},"aspect_ratio":{"type":"string","default":""},"privacy_mode":{"type":"boolean","default":false}},"textdomain":"wpxero-iframe","editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","style":"file:.\/style-index.css","example":{"attributes":{"iframe_url":"https:\/\/www.youtube.com\/watch?v=dQw4w9WgXcQ","iframe_caption":"Video embedded with the Iframe Block.","aspect_ratio":"16 \/ 9"}}}},"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3","1.1.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Block placeholder and URL field in the editor.","2":"Inspector settings: URL, aspect ratio, privacy mode, lazy-loading, SEO fields.","3":"Front-end output with optional caption under the iframe."}},"plugin_section":[],"plugin_tags":[230,1571,1860,1609,1610],"plugin_category":[50,56],"plugin_contributors":[223308],"plugin_business_model":[],"class_list":["post-183314","plugin","type-plugin","status-publish","hentry","plugin_tags-embed","plugin_tags-google-maps","plugin_tags-iframe","plugin_tags-vimeo","plugin_tags-youtube","plugin_category-media","plugin_category-social-and-sharing","plugin_contributors-wpxero","plugin_committers-wpxero"],"banners":{"banner":"https:\/\/ps.w.org\/wpxero-iframe\/assets\/banner-772x250.jpg?rev=3667536","banner_2x":"https:\/\/ps.w.org\/wpxero-iframe\/assets\/banner-1544x500.jpg?rev=3667461","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wpxero-iframe\/assets\/icon-128x128.png?rev=3667461","icon_2x":"https:\/\/ps.w.org\/wpxero-iframe\/assets\/icon-256x256.png?rev=3667461","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Iframe Block<\/strong> adds one dedicated block for every external embed that has no first-party core block: videos, maps, audio players, dashboards, booking tools, donation widgets, LMS players, calendars and forms.<\/p>\n\n<p>Paste a link, pick a ratio, publish. The block converts YouTube and Vimeo links to their proper player URLs automatically, so a plain <code>youtu.be\/\u2026<\/code> share link or a Vimeo unlisted link just works.<\/p>\n\n<p><strong>What you get<\/strong><\/p>\n\n<ul>\n<li><strong>Responsive aspect ratios<\/strong> \u2014 16:9, 4:3, 1:1, 21:9 and 9:16 reserve the space before the embed loads, so nothing jumps around while the page renders. Fixed pixel heights are still available for maps, forms and dashboards.<\/li>\n<li><strong>Smart URL handling<\/strong> \u2014 YouTube watch, share, Shorts, live and embed links, playlists and start times (<code>?t=1m30s<\/code>) are normalised. Vimeo watch, channel, group and unlisted (hash) links become proper player URLs.<\/li>\n<li><strong>Privacy mode<\/strong> \u2014 one toggle switches YouTube to <code>youtube-nocookie.com<\/code>, so no viewing cookies are set until playback starts.<\/li>\n<li><strong>Lazy-loading that behaves<\/strong> \u2014 each block gets its own load margin, embeds load once and never reload on scroll, and the small helper script is only enqueued on pages that actually contain a lazy embed. Optional \"watch for dynamic content\" also covers embeds inserted later by sliders, tabs or infinite scroll.<\/li>\n<li><strong>SEO and accessibility markup<\/strong> \u2014 semantic <code>figure<\/code> \/ <code>figcaption<\/code>, a required accessible <code>title<\/code> on every iframe, and a <code>noscript<\/code> fallback link to the embed for crawlers and script-less visitors.<\/li>\n<li><strong>Safe by default<\/strong> \u2014 only <code>http(s)<\/code> URLs are accepted, inline styles are filtered for known XSS vectors, <code>sandbox<\/code> tokens are validated, and <code>referrerpolicy=\"strict-origin-when-cross-origin\"<\/code> is always set.<\/li>\n<\/ul>\n\n<p>Pair it with your SEO plugin (Yoast, Rank Math, SEOPress, AIOSEO, The SEO Framework) for meta tags, schema and sitemaps.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin from <strong>Plugins &gt; Add New<\/strong>, or upload the ZIP.<\/li>\n<li>Edit a post or page in the block editor.<\/li>\n<li>Insert <strong>Iframe &amp; embed (YouTube, Vimeo, maps)<\/strong>, or search for \"iframe\".<\/li>\n<li>Paste a URL and press <strong>Embed<\/strong>.<\/li>\n<li>Optional: set an aspect ratio, an accessible <strong>Title<\/strong>, a visible <strong>Caption<\/strong>, and enable lazy-loading under <strong>Performance<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20does%20the%20editor%20show%20a%20thumbnail%20instead%20of%20the%20player%3F\"><h3>Why does the editor show a thumbnail instead of the player?<\/h3><\/dt>\n<dd><p>YouTube and Vimeo refuse to play inside the admin screen (YouTube reports \"Error 153\"), so the block shows the official poster image while editing. The real player renders on the published page.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20unlisted%20or%20private%20videos%3F\"><h3>Does this work with unlisted or private videos?<\/h3><\/dt>\n<dd><p>Unlisted Vimeo links that carry a hash (<code>vimeo.com\/123456789\/abc123<\/code>) are supported - the hash is passed to the player. Private videos that require a login cannot be embedded by any plugin.<\/p><\/dd>\n<dt id=\"will%20lazy-loading%20break%20my%20slider%20or%20tab%20content%3F\"><h3>Will lazy-loading break my slider or tab content?<\/h3><\/dt>\n<dd><p>No. Enable <strong>Watch for dynamic content<\/strong> and embeds inserted after page load are picked up too. Embeds are loaded once and are never reloaded when they scroll back into view.<\/p><\/dd>\n<dt id=\"can%20i%20embed%20any%20website%3F\"><h3>Can I embed any website?<\/h3><\/dt>\n<dd><p>Only sites that allow embedding. Many services (banks, Google Search, some social networks) send <code>X-Frame-Options<\/code> or a frame-ancestors policy that blocks all iframes - that is enforced by the browser and cannot be overridden by a plugin.<\/p><\/dd>\n<dt id=\"is%20the%20caption%20required%3F\"><h3>Is the caption required?<\/h3><\/dt>\n<dd><p>No, but it helps: it is output as a real <code>&lt;figcaption&gt;<\/code>, giving readers and search engines context for the embed.<\/p><\/dd>\n<dt id=\"will%20updating%20change%20my%20existing%20blocks%3F\"><h3>Will updating change my existing blocks?<\/h3><\/dt>\n<dd><p>No. Markup shipped by earlier versions is kept as a registered deprecation, so old embeds keep validating and are migrated silently the next time you edit them.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<p><strong>Fixed<\/strong><\/p>\n\n<ul>\n<li>Lazy-loaded embeds with \"live observe\" enabled reloaded themselves every time they scrolled back into view. Embeds now load exactly once.<\/li>\n<li>The load margin is applied per block again. Previously the largest value on the page was applied to every lazy embed, with a hidden 50px minimum.<\/li>\n<li>\"Live observe\" now does what it promises: it detects embeds inserted after page load (sliders, tabs, AJAX) instead of only re-observing existing ones. Renamed to <strong>Watch for dynamic content<\/strong>.<\/li>\n<li>URLs from other hosts that merely looked like YouTube links (any <code>\/embed\/&lt;11 characters&gt;<\/code> path) were rewritten to YouTube. Detection is now host-based.<\/li>\n<li>Vimeo channel, group, player and unlisted (hash) links are recognised instead of being embedded as a page that refuses framing.<\/li>\n<li>YouTube start times (<code>?t=90<\/code>, <code>?t=1m30s<\/code>) and playlists are preserved in the embed URL.<\/li>\n<li>The block icon no longer renders as an 800px hard-coded black square; it inherits the editor colour.<\/li>\n<li>Editor strings are now translatable at runtime (<code>wp_set_script_translations<\/code> was missing).<\/li>\n<li>The <code>render_block<\/code> filter no longer type-hints its arguments, which could fatal when another plugin returned <code>null<\/code>, and the lazy helper script is only enqueued for genuinely lazy embeds.<\/li>\n<li>Typing an unusable URL now shows an inline error instead of silently rendering an empty frame.<\/li>\n<\/ul>\n\n<p><strong>Added<\/strong><\/p>\n\n<ul>\n<li>Responsive aspect ratios: 16:9, 4:3, 1:1, 21:9, 9:16.<\/li>\n<li>Privacy mode for YouTube (<code>youtube-nocookie.com<\/code>).<\/li>\n<li><strong>Replace URL<\/strong> toolbar button, provider badge, and inline validation in the editor.<\/li>\n<li>Block deprecation support, so future markup changes cannot invalidate existing posts.<\/li>\n<li>Skeleton placeholder while a lazy embed waits for the viewport (respects <code>prefers-reduced-motion<\/code>).<\/li>\n<\/ul>\n\n<p><strong>Changed<\/strong><\/p>\n\n<ul>\n<li>Requires WordPress 6.5 or newer (block API v3).<\/li>\n<li>The front-end helper script is loaded with <code>defer<\/code>.<\/li>\n<li>Build tooling updated to <code>@wordpress\/scripts<\/code> 34 and ESLint 9 flat config.<\/li>\n<li><code>allow<\/code> now includes <code>fullscreen<\/code>; <code>data-live<\/code> is only emitted on lazy embeds.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Compatibility: tested with WordPress 7.1 (block API v3, no deprecated APIs in use).<\/li>\n<li>Compatibility: verified alongside Elementor 4.1 and WooCommerce 10.8 \u2014 the block renders unchanged inside Elementor's block widget and on WooCommerce templates.<\/li>\n<li>Housekeeping: plugin header now declares <code>Tested up to<\/code>; block and package versions synced to the plugin version.<\/li>\n<li>No functional or markup changes.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Updated @wordpress\/scripts and development dependencies; rebuilt block editor assets.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>SEO improvements: optional caption as <code>&lt;figcaption&gt;<\/code>, <code>&lt;figure&gt;<\/code> wrapper, <code>&lt;noscript&gt;<\/code> HTTPS link fallback, expanded block keywords and readme tags for discoverability.<\/li>\n<li>WordPress 7.0 readiness; PHP <strong>7.4<\/strong> minimum; hardened URLs; fixed YouTube detection; native lazy-load + IntersectionObserver; scoped front-end script; i18n bootstrap.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Compatibility updates for WordPress 6.8<\/li>\n<li>Minor improvements and optimizations<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release with core features<\/li>\n<\/ul>","raw_excerpt":"Embed responsive YouTube, Vimeo, Google Maps and other iframes from the block editor, with captions, aspect ratios, privacy mode and lazy-loading.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/183314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=183314"}],"author":[{"embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpxero"}],"wp:attachment":[{"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=183314"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=183314"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=183314"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=183314"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=183314"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=183314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}