{"id":311482,"date":"2026-05-12T20:43:04","date_gmt":"2026-05-12T20:43:04","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/4wp-smart-link\/"},"modified":"2026-05-18T21:38:53","modified_gmt":"2026-05-18T21:38:53","slug":"4wp-smart-link","status":"publish","type":"plugin","link":"https:\/\/lin.wordpress.org\/plugins\/4wp-smart-link\/","author":17741300,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"6.9.4","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"4WP Smart Link","header_author":"4WP","header_description":"Smart Gutenberg blocks for advanced static and dynamic linking from blocks.","assets_banners_color":"081646","last_updated":"2026-05-18 21:38:53","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/4wp.dev\/plugin\/4wp-smart-link\/","header_author_uri":"https:\/\/4wp.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":181,"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":"4wpdev","date":"2026-05-12 20:51:21"},"1.1.0":{"tag":"1.1.0","author":"4wpdev","date":"2026-05-18 21:38:53"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3536726,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3536726,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3536726,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3536726,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3536774,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/post-new.php?post_type=page\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installTheme\",\"themeZipFile\":{\"resource\":\"wordpress.org\\\/themes\",\"slug\":\"twentytwentyfive\"},\"options\":{\"activate\":true}},{\"step\":\"installPlugin\",\"options\":{\"activate\":true},\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"4wp-smart-link\"}}]}"}},"all_blocks":{"forwp\/smart-link":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"forwp\/smart-link","version":"1.0.0","title":"4WP Smart Link","category":"widgets","icon":"admin-links","description":"Editor extensions for 4WP Smart Link on supported core blocks.","supports":{"html":false,"inserter":false},"textdomain":"4wp-smart-link","editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css"}},"tagged_versions":["1.0.0","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3536746,"resolution":"1","location":"assets","locale":"","width":3838,"height":2138},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3536746,"resolution":"2","location":"assets","locale":"","width":3834,"height":2178},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3536746,"resolution":"3","location":"assets","locale":"","width":3840,"height":2176},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3536746,"resolution":"4","location":"assets","locale":"","width":3834,"height":2170},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3536746,"resolution":"5","location":"assets","locale":"","width":3840,"height":2180}},"screenshots":[]},"plugin_section":[],"plugin_tags":[263435,263433,263434,148076,213445],"plugin_category":[],"plugin_contributors":[262731,262732],"plugin_business_model":[],"class_list":["post-311482","plugin","type-plugin","status-publish","hentry","plugin_tags-block-link","plugin_tags-clickable-cover","plugin_tags-group-block","plugin_tags-gutenberg","plugin_tags-query-loop","plugin_contributors-4wpdev","plugin_contributors-anatolikkk","plugin_committers-4wpdev","plugin_committers-anatolikkk"],"banners":{"banner":"https:\/\/ps.w.org\/4wp-smart-link\/assets\/banner-772x250.png?rev=3536726","banner_2x":"https:\/\/ps.w.org\/4wp-smart-link\/assets\/banner-1544x500.png?rev=3536726","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/4wp-smart-link\/assets\/icon-128x128.png?rev=3536726","icon_2x":"https:\/\/ps.w.org\/4wp-smart-link\/assets\/icon-256x256.png?rev=3536726","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/4wp-smart-link\/assets\/screenshot-1.png?rev=3536746","caption":""},{"src":"https:\/\/ps.w.org\/4wp-smart-link\/assets\/screenshot-2.png?rev=3536746","caption":""},{"src":"https:\/\/ps.w.org\/4wp-smart-link\/assets\/screenshot-3.png?rev=3536746","caption":""},{"src":"https:\/\/ps.w.org\/4wp-smart-link\/assets\/screenshot-4.png?rev=3536746","caption":""},{"src":"https:\/\/ps.w.org\/4wp-smart-link\/assets\/screenshot-5.png?rev=3536746","caption":""}],"raw_content":"<!--section=description-->\n<p>A plugin by <a href=\"https:\/\/4wp.dev\/plugin\/4wp-smart-link\/\">4wp.dev<\/a>.<\/p>\n\n<p><strong>Demo video:<\/strong> https:\/\/www.youtube.com\/watch?v=8ZGojkTl2CM<\/p>\n\n<p>Query Loop cards and layout blocks (<strong>Cover<\/strong>, <strong>Group<\/strong>, <strong>Column<\/strong>) often need a large click target\u2014open the post, a landing page, or a campaign URL\u2014while titles, tags, and buttons inside the card keep their own links. Core does not offer whole-block linking for these containers.<\/p>\n\n<p><strong>4WP Smart Link<\/strong> adds toolbar and inspector controls on <strong>Cover<\/strong>, <strong>Group<\/strong>, and <strong>Column<\/strong> so you can:<\/p>\n\n<ul>\n<li>Set a <strong>custom URL<\/strong> for Cover, Group, or Column.<\/li>\n<li>In a Query Loop, link the block to the <strong>current post<\/strong> (uses the loop item\u2019s post context).<\/li>\n<li>Open the link in a <strong>new tab<\/strong> when you need to, with sensible <code>rel<\/code> handling for <code>target=\"_blank\"<\/code>.<\/li>\n<li>Add optional <strong>relation<\/strong> (<code>rel<\/code>) tokens and an <strong>accessibility label<\/strong> when you need more than the visible text.<\/li>\n<\/ul>\n\n<p>The actual clickable wrapper is added on the <strong>published front end<\/strong> when the URL resolves. If there is no URL, the block output is unchanged.<\/p>\n\n<p><strong>Important:<\/strong> When the block has no other links inside, the front end wraps it in a normal <code>&lt;a&gt;<\/code>. When inner links exist (post title, terms, buttons, etc.), the plugin uses a clickable container (<code>data-forwp-smart-link-url<\/code> + a small front-end script) so link-in-link HTML is never output\u2014inner links keep their own URLs.\n<strong>Theme and integration developers<\/strong><\/p>\n\n<p><strong>Anchor mode<\/strong> (no inner links): wraps markup in <code>&lt;a class=\"forwp-smart-link-wrapper forwp-smart-link-wrapper--{cover|group|column}\"&gt;<\/code> with <code>data-forwp-smart-link<\/code>.<\/p>\n\n<p><strong>Host mode<\/strong> (inner links present): wraps markup in <code>&lt;div class=\"forwp-smart-link-host forwp-smart-link-host--{modifier}\"&gt;<\/code> with <code>data-forwp-smart-link-url<\/code>, optional <code>data-forwp-smart-link-target<\/code>, <code>data-forwp-smart-link-rel<\/code>, and <code>assets\/forwp-smart-link-frontend.js<\/code> for pointer\/keyboard navigation on empty areas.<\/p>\n\n<p>Filters: <code>forwp_smart_link_supported_blocks<\/code>, <code>forwp_smart_link_has_inner_links<\/code>, <code>forwp_smart_link_use_host_mode<\/code>.<\/p>\n\n<p>You may style <code>.forwp-smart-link-wrapper<\/code> globally or scope overrides with the <code>--cover<\/code> modifier. Editor-only UI uses separate <code>forwp-smart-link-cover-panel*<\/code> classes; do not rely on those for front-end styling.<\/p>\n\n<p>Further technical discussion: <a href=\"https:\/\/github.com\/4wpdev\/4wp-smart-link\">4wp-smart-link on GitHub<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>wp-content\/plugins\/<\/code> or install the ZIP through <strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Activate <strong>4WP Smart Link<\/strong> through the Plugins screen.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20blocks%20are%20supported%3F\"><h3>Which blocks are supported?<\/h3><\/dt>\n<dd><p><strong>4WP Smart Link<\/strong> extends <strong>Core Cover<\/strong>, <strong>Group<\/strong>, and <strong>Column<\/strong> (<code>core\/cover<\/code>, <code>core\/group<\/code>, <code>core\/column<\/code>).<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20url%20is%20empty%3F\"><h3>What happens if the URL is empty?<\/h3><\/dt>\n<dd><p>No link wrapper is output; the block renders as usual.<\/p><\/dd>\n<dt id=\"when%20does%20%E2%80%9Cpost%20link%E2%80%9D%20work%3F\"><h3>When does \u201cPost Link\u201d work?<\/h3><\/dt>\n<dd><p>Only when the block is inside a <strong>Query Loop<\/strong> post template (<code>core\/post-template<\/code>). Each loop item supplies the post URL. Outside a Query Loop, use <strong>Custom Link<\/strong> instead.<\/p><\/dd>\n<dt id=\"does%20this%20replace%20native%20cover%20linking%3F\"><h3>Does this replace native Cover linking?<\/h3><\/dt>\n<dd><p>Cover does not provide the same whole-block link semantics; <strong>4WP Smart Link<\/strong> adds anchor or host wrappers on the front end (see Other Notes).<\/p><\/dd>\n<dt id=\"does%20it%20depend%20on%20other%204wp%20plugins%3F\"><h3>Does it depend on other 4WP plugins?<\/h3><\/dt>\n<dd><p>No. It runs standalone.<\/p><\/dd>\n<dt id=\"how%20do%20i%20make%20a%20cover%20block%20clickable%20in%20a%20query%20loop%3F\"><h3>How do I make a Cover block clickable in a Query Loop?<\/h3><\/dt>\n<dd><p>Place a <strong>Cover<\/strong> (or <strong>Group<\/strong> \/ <strong>Column<\/strong>) inside the Query Loop post template. Select the block, open <strong>Smart Link<\/strong> in the toolbar, and choose <strong>Post Link<\/strong> so each card uses that loop item\u2019s permalink. Preview or view the published page to test clicks\u2014the editor canvas does not show the front-end wrapper.<\/p><\/dd>\n<dt id=\"how%20do%20i%20link%20a%20group%20block%20that%20already%20has%20buttons%20or%20post%20title%20inside%3F\"><h3>How do I link a Group block that already has buttons or post title inside?<\/h3><\/dt>\n<dd><p>Enable <strong>Smart Link<\/strong> on the <strong>Group<\/strong> (or <strong>Column<\/strong> \/ <strong>Cover<\/strong>). Inner links (buttons, post title, categories, tags) stay separate and clickable. Clicks on empty areas (image, padding) open the Smart Link URL on the front end without invalid nested <code>&lt;a&gt;<\/code> markup.<\/p><\/dd>\n<dt id=\"how%20do%20i%20create%20clickable%20post%20cards%20in%20gutenberg%3F\"><h3>How do I create clickable post cards in Gutenberg?<\/h3><\/dt>\n<dd><p>Build cards with <strong>Query Loop<\/strong> + <strong>Cover<\/strong> or <strong>Group<\/strong>, add <strong>Smart Link<\/strong> with <strong>Post Link<\/strong>, and optionally place <strong>Post Title<\/strong> or <strong>Post Terms<\/strong> inside the card. Visitors can open the post from the card surface while still using inner links where you added them.<\/p><\/dd>\n<dt id=\"will%20the%20editor%20preview%20match%20the%20front%20end%3F\"><h3>Will the editor preview match the front end?<\/h3><\/dt>\n<dd><p>The link wrapper is applied on the <strong>front end<\/strong> only (via <code>render_block<\/code>). The block canvas does not show the same anchor or host wrapper, so use <strong>Preview<\/strong> or the live page to verify click behavior and theme styles.<\/p><\/dd>\n<dt id=\"accessibility%3A%20card-as-one-link%20pattern\"><h3>Accessibility: card-as-one-link pattern<\/h3><\/dt>\n<dd><p>With no inner links, the whole block is wrapped in one <code>&lt;a&gt;<\/code>. When inner links exist, a <code>role=\"link\"<\/code> host container handles keyboard and pointer clicks on non-interactive areas; inner buttons and anchors stay focusable and separate.<\/p><\/dd>\n<dt id=\"seo%20%60rel%60%20when%20opening%20in%20a%20new%20tab\"><h3>SEO `rel` when opening in a new tab<\/h3><\/dt>\n<dd><p>For <code>target=\"_blank\"<\/code> the plugin adds <code>noopener<\/code> and <code>noreferrer<\/code> to <code>rel<\/code> if missing, while preserving your <code>nofollow<\/code> and other tokens.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Add Smart Link for <strong>Group<\/strong> and <strong>Column<\/strong> (same controls and Query Loop post link as Cover).<\/li>\n<li>Two front-end modes: <code>&lt;a&gt;<\/code> wrap when there are no inner links; clickable host (<code>data-forwp-smart-link-url<\/code> + small JS) when inner links exist\u2014no link-in-link HTML.<\/li>\n<li>Server-side attribute registration (<code>Block_Attributes<\/code>); shared <code>Block_Link<\/code> \/ <code>Block_Inner_Links<\/code> render pipeline.<\/li>\n<li>Public filters: <code>forwp_smart_link_supported_blocks<\/code>, <code>forwp_smart_link_has_inner_links<\/code>, <code>forwp_smart_link_use_host_mode<\/code>.<\/li>\n<li>Editor notices explain host mode when title, terms, buttons, or other inner links are present.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release with Cover block support (custom URL, dynamic Query Loop link, toolbar + inspector).<\/li>\n<li>Documented stable frontend classes (<code>forwp-smart-link-wrapper<\/code> + <code>--cover<\/code>, <code>data-forwp-smart-link<\/code>); editor uses <code>forwp-smart-link-cover-panel*<\/code> classes.<\/li>\n<li>Translation template: <code>languages\/4wp-smart-link.pot<\/code>.<\/li>\n<li>Frontend stylesheet for predictable <code>:focus-visible<\/code> on the link wrapper (<code>assets\/forwp-smart-link-frontend.css<\/code>).<\/li>\n<\/ul>","raw_excerpt":"Make Cover, Group, and Column blocks fully clickable in Gutenberg and Query Loop\u2014no wrapper block, no custom code.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/311482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=311482"}],"author":[{"embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/4wpdev"}],"wp:attachment":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=311482"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=311482"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=311482"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=311482"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=311482"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=311482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}