{"id":331457,"date":"2026-07-06T23:22:06","date_gmt":"2026-07-06T23:22:06","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/unique-query-loop-extension\/"},"modified":"2026-07-17T05:30:16","modified_gmt":"2026-07-17T05:30:16","slug":"silvaitamar-duplicate-post-exclusion-query-loop","status":"publish","type":"plugin","link":"https:\/\/mya.wordpress.org\/plugins\/silvaitamar-duplicate-post-exclusion-query-loop\/","author":13947743,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.0.1","requires":"6.7","requires_php":"7.4","requires_plugins":null,"header_name":"Duplicate Post Exclusion for Query Loop Block","header_author":"Itamar Silva","header_description":"Prevent duplicate posts across multiple Query Loop blocks on the same page.","assets_banners_color":"f1f6fd","last_updated":"2026-07-17 05:30:16","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/silvaitamar\/wp-duplicate-post-exclusion-query-loop","header_author_uri":"https:\/\/github.com\/silvaitamar","rating":0,"author_block_rating":0,"active_installs":0,"downloads":111,"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":"itamarsilvacc","date":"2026-06-30 22:44:40"},"1.0.1":{"tag":"1.0.1","author":"itamarsilvacc","date":"2026-07-17 03:09:49"},"1.0.2":{"tag":"1.0.2","author":"itamarsilvacc","date":"2026-07-17 05:30:16"}},"upgrade_notice":{"1.0.2":"<p>Documentation and search metadata only. No functional changes.<\/p>","1.0.1":"<p>Display name updated to &quot;Duplicate Post Exclusion for Query Loop Block&quot;. No action needed; the slug and functionality stay the same.<\/p>","1.0.0":"<p>Initial public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3592000,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3592000,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500-es_ES.png":{"filename":"banner-1544x500-es_ES.png","revision":3592000,"resolution":"1544x500","location":"assets","locale":"es_ES","width":1544,"height":500},"banner-1544x500-pt_BR.png":{"filename":"banner-1544x500-pt_BR.png","revision":3592000,"resolution":"1544x500","location":"assets","locale":"pt_BR","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3592000,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-es_ES.png":{"filename":"banner-772x250-es_ES.png","revision":3592000,"resolution":"772x250","location":"assets","locale":"es_ES","width":772,"height":250},"banner-772x250-pt_BR.png":{"filename":"banner-772x250-pt_BR.png","revision":3592000,"resolution":"772x250","location":"assets","locale":"pt_BR","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3592000,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3611018,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installTheme\",\"themeData\":{\"resource\":\"wordpress.org\\\/themes\",\"slug\":\"twentytwentyfive\"},\"options\":{\"activate\":true}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"silvaitamar-duplicate-post-exclusion-query-loop\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire_once 'wordpress\\\/wp-load.php';\\n$d = array (\\n  'cats' => \\n  array (\\n    'harbor' => 'Harbor',\\n    'routes' => 'Routes',\\n    'desk' => 'Desk',\\n  ),\\n  'posts' => \\n  array (\\n    0 => \\n    array (\\n      'title' => 'Desk: how we cover the waterfront',\\n      'name' => 'desk-how-we-cover-the-waterfront',\\n      'date' => '2026-07-06 12:00:00',\\n      'excerpt' => 'A note from the editors on our approach to covering Northline Harbor\\\\'s waterfront \\u2014 what we prioritize, what we skip, and why.',\\n      'content' => '<!-- wp:paragraph --><p>Every week the Northline Press newsroom receives more tips about waterfront developments than we can realistically cover. This piece is an attempt to be transparent about how we decide what goes in the paper and what stays in the inbox.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:paragraph --><p>Our working rule is simple: we cover events and decisions that affect how people move through, work in, or enjoy the harbor area. Infrastructure changes, schedule disruptions, public events, and community initiatives all qualify. We generally hold off on speculative pieces until something is confirmed by at least two independent sources. We are a small team covering a very active waterfront, so we appreciate your patience and your tips.<\\\/p><!-- \\\/wp:paragraph -->',\\n      'cat' => 'desk',\\n    ),\\n    1 => \\n    array (\\n      'title' => 'Rain delayed the shore cleanup drive',\\n      'name' => 'rain-delayed-the-shore-cleanup-drive',\\n      'date' => '2026-07-07 09:00:00',\\n      'excerpt' => 'Saturday\\\\'s shore cleanup at Gull Point was postponed due to heavy rain. Organizers have rescheduled for next weekend.',\\n      'content' => '<!-- wp:paragraph --><p>Heavy overnight rain forced organizers of the quarterly shore cleanup at Gull Point to postpone Saturday\\\\'s event. The team, coordinated by the Northline Harbor Volunteers Network, has rescheduled for the following Saturday at the same time, eight o\\\\'clock in the morning.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:paragraph --><p>Registered volunteers will receive an update by email. New participants can sign up at the community center on Dock Street. Equipment including gloves and collection bags will be provided.<\\\/p><!-- \\\/wp:paragraph -->',\\n      'cat' => 'routes',\\n    ),\\n    2 => \\n    array (\\n      'title' => 'Museum courtyard hosts open sketch night',\\n      'name' => 'museum-courtyard-hosts-open-sketch-night',\\n      'date' => '2026-07-08 16:00:00',\\n      'excerpt' => 'The Northline Maritime Museum is opening its courtyard every Thursday evening for a free community sketch night through August.',\\n      'content' => '<!-- wp:paragraph --><p>The Northline Maritime Museum launched its summer sketch night series last Thursday, inviting residents and visitors to draw freely in the museum\\\\'s stone courtyard. The sessions run from six to eight in the evening, every Thursday through August, and are free of charge.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:paragraph --><p>Participants bring their own materials. Museum staff occasionally set out a rotating still-life arrangement using objects from storage. Around forty people attended the opening session, ranging from beginners to seasoned illustrators.<\\\/p><!-- \\\/wp:paragraph -->',\\n      'cat' => 'routes',\\n    ),\\n    3 => \\n    array (\\n      'title' => 'Harbor bridge lights test tonight',\\n      'name' => 'harbor-bridge-lights-test-tonight',\\n      'date' => '2026-07-09 14:00:00',\\n      'excerpt' => 'Engineers will test the new LED array on the Harbor Bridge after dark tonight. Residents near the waterfront can expect brief flashes.',\\n      'content' => '<!-- wp:paragraph --><p>Engineers from the Northline Harbor infrastructure team will run a full test of the newly installed LED array on the Harbor Bridge this evening, beginning at nine-thirty. Residents living close to the waterfront may notice brief, intermittent light sequences lasting up to forty minutes.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:paragraph --><p>The lights are part of a navigation safety upgrade approved earlier this year. If tonight\\\\'s test is successful, permanent activation is scheduled for the following weekend.<\\\/p><!-- \\\/wp:paragraph -->',\\n      'cat' => 'harbor',\\n    ),\\n    4 => \\n    array (\\n      'title' => 'Library late hours expand this month',\\n      'name' => 'library-late-hours-expand-this-month',\\n      'date' => '2026-07-10 08:45:00',\\n      'excerpt' => 'Northline Harbor Public Library will stay open until 9 PM on weekdays through the end of the month to support summer reading programs.',\\n      'content' => '<!-- wp:paragraph --><p>The Northline Harbor Public Library announced extended weekday hours through the end of July, keeping its doors open until nine o\\\\'clock in the evening to accommodate the summer reading program and a new evening study hall for local students.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:paragraph --><p>Branch manager Delia Worne said demand for quiet evening space has grown steadily. Participants in the youth reading program can pick up their July reading logs at the front desk.<\\\/p><!-- \\\/wp:paragraph -->',\\n      'cat' => 'harbor',\\n    ),\\n    5 => \\n    array (\\n      'title' => 'Coastal walkway repair begins Monday',\\n      'name' => 'coastal-walkway-repair-begins-monday',\\n      'date' => '2026-07-11 11:00:00',\\n      'excerpt' => 'Crews will close a half-kilometer section of the Northline coastal walkway starting Monday for drainage and surface repairs.',\\n      'content' => '<!-- wp:paragraph --><p>A half-kilometer section of the Northline coastal walkway between Gull Point and the South Jetty will be closed to pedestrians starting Monday, as municipal crews begin long-awaited drainage and surface repairs. The project is expected to last three weeks, weather permitting.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:paragraph --><p>Detours via Shore Lane are marked. Cyclists are asked to dismount through the detour zone. The walkway is one of the busiest pedestrian routes in Northline Harbor, attracting an estimated four hundred daily users during summer months.<\\\/p><!-- \\\/wp:paragraph -->',\\n      'cat' => 'routes',\\n    ),\\n    6 => \\n    array (\\n      'title' => 'Coffee carts reopen on Market Row',\\n      'name' => 'coffee-carts-reopen-on-market-row',\\n      'date' => '2026-07-12 10:00:00',\\n      'excerpt' => 'After a two-week closure for pavement work, the beloved coffee cart row along Market Street is back and busier than ever.',\\n      'content' => '<!-- wp:paragraph --><p>The cluster of independent coffee carts that line Market Row in central Northline Harbor reopened Thursday morning after a two-week hiatus caused by pavement resurfacing work. Queues formed before seven o\\\\'clock at the Dockside Roasters cart, which added a new single-origin cold brew to its menu.<\\\/p><!-- \\\/wp:paragraph -->',\\n      'cat' => 'harbor',\\n    ),\\n    7 => \\n    array (\\n      'title' => 'Weekend ferry schedule changes again',\\n      'name' => 'weekend-ferry-schedule-changes-again',\\n      'date' => '2026-07-13 09:30:00',\\n      'excerpt' => 'The Northline Harbor ferry authority has adjusted weekend departure times for the third time this season, citing crew availability.',\\n      'content' => '<!-- wp:paragraph -->\\n<p>Passengers crossing to Inlet Cove this weekend should check revised timetables before heading to the dock. The Northline Harbor Ferry Authority announced a third round of schedule changes on Wednesday, trimming two departures on Saturday and shifting the last Sunday crossing thirty minutes earlier.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n<!-- wp:paragraph -->\\n<p>A spokesperson cited crew availability and ongoing vessel maintenance as the primary reasons. A printed schedule will be posted at all four harbor kiosks by Friday morning.<\\\/p>\\n<!-- \\\/wp:paragraph -->',\\n      'cat' => 'harbor',\\n    ),\\n    8 => \\n    array (\\n      'title' => 'Harbor fog returns to Pier 4',\\n      'name' => 'harbor-fog-returns-to-pier-4',\\n      'date' => '2026-07-14 08:00:00',\\n      'excerpt' => 'Thick morning fog blanketed Pier 4 again this week, prompting the harbor authority to extend foghorn schedules through the weekend.',\\n      'content' => '<!-- wp:paragraph -->\\n<p>Thick morning fog settled over Pier 4 in Northline Harbor on Tuesday, reducing visibility to under thirty meters by six o\\\\'clock. The harbor authority issued an advisory extending foghorn schedules through Sunday, asking smaller vessels to delay departure until conditions improved.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n<!-- wp:paragraph -->\\n<p>Harbormaster Gail Trenmore said the fog pattern is consistent with late-season inversions common to the bay. No incidents were reported, though two ferry crossings were delayed by approximately twenty minutes.<\\\/p>\\n<!-- \\\/wp:paragraph -->',\\n      'cat' => 'harbor',\\n    ),\\n  ),\\n  'home' => '<!-- wp:group {\\\"style\\\":{\\\"spacing\\\":{\\\"padding\\\":{\\\"top\\\":\\\"var:preset|spacing|30\\\",\\\"bottom\\\":\\\"var:preset|spacing|30\\\",\\\"left\\\":\\\"var:preset|spacing|40\\\",\\\"right\\\":\\\"var:preset|spacing|40\\\"}},\\\"border\\\":{\\\"radius\\\":\\\"4px\\\"}},\\\"backgroundColor\\\":\\\"accent-5\\\",\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group has-accent-5-background-color has-background\\\" style=\\\"border-radius:4px;padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--40)\\\"><!-- wp:paragraph {\\\"style\\\":{\\\"typography\\\":{\\\"fontSize\\\":\\\"var:preset|font-size|small\\\"}}} -->\\n<p style=\\\"font-size:var(--wp--preset--font-size--small)\\\"><strong>Demo notice:<\\\/strong> This is fictional sample content for demonstrating a WordPress plugin. Not a real publication. Do not treat names, places, or events as factual.<\\\/p>\\n<!-- \\\/wp:paragraph --><\\\/div>\\n<!-- \\\/wp:group -->\\n\\n<!-- wp:group {\\\"style\\\":{\\\"spacing\\\":{\\\"padding\\\":{\\\"top\\\":\\\"var:preset|spacing|40\\\",\\\"bottom\\\":\\\"0\\\"}}},\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group\\\" style=\\\"padding-top:var(--wp--preset--spacing--40);padding-bottom:0\\\"><!-- wp:heading {\\\"level\\\":1,\\\"style\\\":{\\\"typography\\\":{\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"700\\\"}},\\\"fontSize\\\":\\\"x-large\\\"} -->\\n<h1 class=\\\"wp-block-heading has-x-large-font-size\\\" style=\\\"font-style:normal;font-weight:700\\\">Northline Press<\\\/h1>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph {\\\"textColor\\\":\\\"contrast-2\\\"} -->\\n<p class=\\\"has-contrast-2-color has-text-color\\\">News from Northline Harbor \\u2014 local, independent, fictional.<\\\/p>\\n<!-- \\\/wp:paragraph --><\\\/div>\\n<!-- \\\/wp:group -->\\n\\n<!-- wp:group {\\\"style\\\":{\\\"spacing\\\":{\\\"padding\\\":{\\\"top\\\":\\\"var:preset|spacing|50\\\",\\\"bottom\\\":\\\"var:preset|spacing|20\\\"}}},\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group\\\" style=\\\"padding-top:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--20)\\\"><!-- wp:heading {\\\"style\\\":{\\\"typography\\\":{\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"700\\\",\\\"textTransform\\\":\\\"uppercase\\\",\\\"letterSpacing\\\":\\\"0.08em\\\"}},\\\"fontSize\\\":\\\"small\\\"} -->\\n<h2 class=\\\"wp-block-heading has-small-font-size\\\" style=\\\"font-style:normal;font-weight:700;letter-spacing:0.08em;text-transform:uppercase\\\">Latest<\\\/h2>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:separator {\\\"style\\\":{\\\"spacing\\\":{\\\"margin\\\":{\\\"top\\\":\\\"var:preset|spacing|10\\\",\\\"bottom\\\":\\\"var:preset|spacing|30\\\"}}},\\\"backgroundColor\\\":\\\"contrast\\\"} -->\\n<hr class=\\\"wp-block-separator has-text-color has-contrast-color has-alpha-channel-opacity has-contrast-background-color has-background\\\" style=\\\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--30)\\\"\\\/>\\n<!-- \\\/wp:separator --><\\\/div>\\n<!-- \\\/wp:group -->\\n\\n<!-- wp:query {\\\"queryId\\\":0,\\\"query\\\":{\\\"perPage\\\":3,\\\"pages\\\":0,\\\"offset\\\":0,\\\"postType\\\":\\\"post\\\",\\\"order\\\":\\\"desc\\\",\\\"orderBy\\\":\\\"date\\\",\\\"author\\\":\\\"\\\",\\\"search\\\":\\\"\\\",\\\"exclude\\\":[],\\\"sticky\\\":\\\"\\\",\\\"inherit\\\":false},\\\"layout\\\":{\\\"type\\\":\\\"default\\\"},\\\"uniqueOnPage\\\":true} -->\\n<div class=\\\"wp-block-query\\\"><!-- wp:post-template {\\\"style\\\":{\\\"spacing\\\":{\\\"blockGap\\\":\\\"var:preset|spacing|30\\\"}},\\\"layout\\\":{\\\"type\\\":\\\"grid\\\",\\\"columnCount\\\":3}} -->\\n<!-- wp:post-featured-image {\\\"isLink\\\":true,\\\"aspectRatio\\\":\\\"3\\\/2\\\"} \\\/-->\\n\\n<!-- wp:post-title {\\\"isLink\\\":true,\\\"style\\\":{\\\"typography\\\":{\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"600\\\"}},\\\"fontSize\\\":\\\"medium\\\"} \\\/-->\\n\\n<!-- wp:post-date {\\\"metadata\\\":{\\\"bindings\\\":{\\\"datetime\\\":{\\\"source\\\":\\\"core\\\/post-data\\\",\\\"args\\\":{\\\"field\\\":\\\"date\\\"}}}},\\\"style\\\":{\\\"typography\\\":{\\\"fontSize\\\":\\\"var:preset|font-size|small\\\"}},\\\"textColor\\\":\\\"contrast-2\\\"} \\\/-->\\n\\n<!-- wp:post-excerpt {\\\"moreText\\\":\\\"\\\",\\\"excerptLength\\\":20,\\\"style\\\":{\\\"typography\\\":{\\\"fontSize\\\":\\\"var:preset|font-size|small\\\"}}} \\\/-->\\n<!-- \\\/wp:post-template --><\\\/div>\\n<!-- \\\/wp:query -->\\n\\n<!-- wp:group {\\\"style\\\":{\\\"spacing\\\":{\\\"padding\\\":{\\\"top\\\":\\\"var:preset|spacing|50\\\",\\\"bottom\\\":\\\"var:preset|spacing|20\\\"}}},\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group\\\" style=\\\"padding-top:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--20)\\\"><!-- wp:heading {\\\"style\\\":{\\\"typography\\\":{\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"700\\\",\\\"textTransform\\\":\\\"uppercase\\\",\\\"letterSpacing\\\":\\\"0.08em\\\"}},\\\"fontSize\\\":\\\"small\\\"} -->\\n<h2 class=\\\"wp-block-heading has-small-font-size\\\" style=\\\"font-style:normal;font-weight:700;letter-spacing:0.08em;text-transform:uppercase\\\">Harbor<\\\/h2>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:separator {\\\"style\\\":{\\\"spacing\\\":{\\\"margin\\\":{\\\"top\\\":\\\"var:preset|spacing|10\\\",\\\"bottom\\\":\\\"var:preset|spacing|30\\\"}}},\\\"backgroundColor\\\":\\\"contrast\\\"} -->\\n<hr class=\\\"wp-block-separator has-text-color has-contrast-color has-alpha-channel-opacity has-contrast-background-color has-background\\\" style=\\\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--30)\\\"\\\/>\\n<!-- \\\/wp:separator --><\\\/div>\\n<!-- \\\/wp:group -->\\n\\n<!-- wp:query {\\\"queryId\\\":1,\\\"query\\\":{\\\"perPage\\\":3,\\\"pages\\\":0,\\\"offset\\\":0,\\\"postType\\\":\\\"post\\\",\\\"order\\\":\\\"desc\\\",\\\"orderBy\\\":\\\"date\\\",\\\"author\\\":\\\"\\\",\\\"search\\\":\\\"\\\",\\\"exclude\\\":[],\\\"sticky\\\":\\\"\\\",\\\"inherit\\\":false,\\\"taxQuery\\\":{\\\"include\\\":{\\\"category\\\":[__HARBOR__]}}},\\\"layout\\\":{\\\"type\\\":\\\"default\\\"},\\\"uniqueOnPage\\\":true} -->\\n<div class=\\\"wp-block-query\\\"><!-- wp:post-template {\\\"style\\\":{\\\"spacing\\\":{\\\"blockGap\\\":\\\"var:preset|spacing|30\\\"}},\\\"layout\\\":{\\\"type\\\":\\\"grid\\\",\\\"columnCount\\\":3}} -->\\n<!-- wp:post-featured-image {\\\"isLink\\\":true,\\\"aspectRatio\\\":\\\"3\\\/2\\\"} \\\/-->\\n\\n<!-- wp:post-title {\\\"isLink\\\":true,\\\"style\\\":{\\\"typography\\\":{\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"600\\\"}},\\\"fontSize\\\":\\\"medium\\\"} \\\/-->\\n\\n<!-- wp:post-date {\\\"metadata\\\":{\\\"bindings\\\":{\\\"datetime\\\":{\\\"source\\\":\\\"core\\\/post-data\\\",\\\"args\\\":{\\\"field\\\":\\\"date\\\"}}}},\\\"style\\\":{\\\"typography\\\":{\\\"fontSize\\\":\\\"var:preset|font-size|small\\\"}},\\\"textColor\\\":\\\"contrast-2\\\"} \\\/-->\\n\\n<!-- wp:post-excerpt {\\\"moreText\\\":\\\"\\\",\\\"excerptLength\\\":20,\\\"style\\\":{\\\"typography\\\":{\\\"fontSize\\\":\\\"var:preset|font-size|small\\\"}}} \\\/-->\\n<!-- \\\/wp:post-template --><\\\/div>\\n<!-- \\\/wp:query -->\\n\\n<!-- wp:group {\\\"style\\\":{\\\"spacing\\\":{\\\"padding\\\":{\\\"top\\\":\\\"var:preset|spacing|50\\\",\\\"bottom\\\":\\\"var:preset|spacing|20\\\"}}},\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group\\\" style=\\\"padding-top:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--20)\\\"><!-- wp:heading {\\\"style\\\":{\\\"typography\\\":{\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"700\\\",\\\"textTransform\\\":\\\"uppercase\\\",\\\"letterSpacing\\\":\\\"0.08em\\\"}},\\\"fontSize\\\":\\\"small\\\"} -->\\n<h2 class=\\\"wp-block-heading has-small-font-size\\\" style=\\\"font-style:normal;font-weight:700;letter-spacing:0.08em;text-transform:uppercase\\\">Routes<\\\/h2>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:separator {\\\"style\\\":{\\\"spacing\\\":{\\\"margin\\\":{\\\"top\\\":\\\"var:preset|spacing|10\\\",\\\"bottom\\\":\\\"var:preset|spacing|30\\\"}}},\\\"backgroundColor\\\":\\\"contrast\\\"} -->\\n<hr class=\\\"wp-block-separator has-text-color has-contrast-color has-alpha-channel-opacity has-contrast-background-color has-background\\\" style=\\\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--30)\\\"\\\/>\\n<!-- \\\/wp:separator --><\\\/div>\\n<!-- \\\/wp:group -->\\n\\n<!-- wp:query {\\\"queryId\\\":2,\\\"query\\\":{\\\"perPage\\\":3,\\\"pages\\\":0,\\\"offset\\\":0,\\\"postType\\\":\\\"post\\\",\\\"order\\\":\\\"desc\\\",\\\"orderBy\\\":\\\"date\\\",\\\"author\\\":\\\"\\\",\\\"search\\\":\\\"\\\",\\\"exclude\\\":[],\\\"sticky\\\":\\\"\\\",\\\"inherit\\\":false,\\\"taxQuery\\\":{\\\"include\\\":{\\\"category\\\":[__ROUTES__]}}},\\\"layout\\\":{\\\"type\\\":\\\"default\\\"},\\\"uniqueOnPage\\\":true} -->\\n<div class=\\\"wp-block-query\\\"><!-- wp:post-template {\\\"style\\\":{\\\"spacing\\\":{\\\"blockGap\\\":\\\"var:preset|spacing|30\\\"}},\\\"layout\\\":{\\\"type\\\":\\\"grid\\\",\\\"columnCount\\\":3}} -->\\n<!-- wp:post-featured-image {\\\"isLink\\\":true,\\\"aspectRatio\\\":\\\"3\\\/2\\\"} \\\/-->\\n\\n<!-- wp:post-title {\\\"isLink\\\":true,\\\"style\\\":{\\\"typography\\\":{\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"600\\\"}},\\\"fontSize\\\":\\\"medium\\\"} \\\/-->\\n\\n<!-- wp:post-date {\\\"metadata\\\":{\\\"bindings\\\":{\\\"datetime\\\":{\\\"source\\\":\\\"core\\\/post-data\\\",\\\"args\\\":{\\\"field\\\":\\\"date\\\"}}}},\\\"style\\\":{\\\"typography\\\":{\\\"fontSize\\\":\\\"var:preset|font-size|small\\\"}},\\\"textColor\\\":\\\"contrast-2\\\"} \\\/-->\\n\\n<!-- wp:post-excerpt {\\\"moreText\\\":\\\"\\\",\\\"excerptLength\\\":20,\\\"style\\\":{\\\"typography\\\":{\\\"fontSize\\\":\\\"var:preset|font-size|small\\\"}}} \\\/-->\\n<!-- \\\/wp:post-template --><\\\/div>\\n<!-- \\\/wp:query -->\\n\\n<!-- wp:group {\\\"style\\\":{\\\"spacing\\\":{\\\"padding\\\":{\\\"top\\\":\\\"var:preset|spacing|50\\\",\\\"bottom\\\":\\\"var:preset|spacing|20\\\"}}},\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group\\\" style=\\\"padding-top:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--20)\\\"><!-- wp:heading {\\\"style\\\":{\\\"typography\\\":{\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"700\\\",\\\"textTransform\\\":\\\"uppercase\\\",\\\"letterSpacing\\\":\\\"0.08em\\\"}},\\\"fontSize\\\":\\\"small\\\"} -->\\n<h2 class=\\\"wp-block-heading has-small-font-size\\\" style=\\\"font-style:normal;font-weight:700;letter-spacing:0.08em;text-transform:uppercase\\\">Desk<\\\/h2>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:separator {\\\"style\\\":{\\\"spacing\\\":{\\\"margin\\\":{\\\"top\\\":\\\"var:preset|spacing|10\\\",\\\"bottom\\\":\\\"var:preset|spacing|30\\\"}}},\\\"backgroundColor\\\":\\\"contrast\\\"} -->\\n<hr class=\\\"wp-block-separator has-text-color has-contrast-color has-alpha-channel-opacity has-contrast-background-color has-background\\\" style=\\\"margin-top:var(--wp--preset--spacing--10);margin-bottom:var(--wp--preset--spacing--30)\\\"\\\/>\\n<!-- \\\/wp:separator --><\\\/div>\\n<!-- \\\/wp:group -->\\n\\n<!-- wp:query {\\\"queryId\\\":3,\\\"query\\\":{\\\"perPage\\\":3,\\\"pages\\\":0,\\\"offset\\\":0,\\\"postType\\\":\\\"post\\\",\\\"order\\\":\\\"desc\\\",\\\"orderBy\\\":\\\"date\\\",\\\"author\\\":\\\"\\\",\\\"search\\\":\\\"\\\",\\\"exclude\\\":[],\\\"sticky\\\":\\\"\\\",\\\"inherit\\\":false,\\\"taxQuery\\\":{\\\"include\\\":{\\\"category\\\":[__DESK__]}}},\\\"layout\\\":{\\\"type\\\":\\\"default\\\"},\\\"uniqueOnPage\\\":true} -->\\n<div class=\\\"wp-block-query\\\"><!-- wp:post-template {\\\"style\\\":{\\\"spacing\\\":{\\\"blockGap\\\":\\\"var:preset|spacing|30\\\"}},\\\"layout\\\":{\\\"type\\\":\\\"default\\\"}} -->\\n<!-- wp:post-title {\\\"isLink\\\":true,\\\"style\\\":{\\\"typography\\\":{\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"600\\\"}},\\\"fontSize\\\":\\\"medium\\\"} \\\/-->\\n\\n<!-- wp:post-date {\\\"metadata\\\":{\\\"bindings\\\":{\\\"datetime\\\":{\\\"source\\\":\\\"core\\\/post-data\\\",\\\"args\\\":{\\\"field\\\":\\\"date\\\"}}}},\\\"style\\\":{\\\"typography\\\":{\\\"fontSize\\\":\\\"var:preset|font-size|small\\\"}},\\\"textColor\\\":\\\"contrast-2\\\"} \\\/-->\\n\\n<!-- wp:post-excerpt {\\\"moreText\\\":\\\"\\\",\\\"excerptLength\\\":25,\\\"style\\\":{\\\"typography\\\":{\\\"fontSize\\\":\\\"var:preset|font-size|small\\\"}}} \\\/-->\\n<!-- \\\/wp:post-template --><\\\/div>\\n<!-- \\\/wp:query -->\\n\\n<!-- wp:spacer {\\\"height\\\":\\\"var:preset|spacing|50\\\"} -->\\n<div style=\\\"height:var(--wp--preset--spacing--50)\\\" aria-hidden=\\\"true\\\" class=\\\"wp-block-spacer\\\"><\\\/div>\\n<!-- \\\/wp:spacer -->',\\n  'options' => \\n  array (\\n    'blogname' => 'Northline Press (demo)',\\n    'blogdescription' => 'Sample editorial site for plugin preview \\u2014 fictional content only',\\n  ),\\n);\\n\\r\\nforeach ( array( 'hello-world' => 'post', 'sample-page' => 'page' ) as $slug => $type ) {\\r\\n\\t$default = get_page_by_path( $slug, OBJECT, $type );\\r\\n\\tif ( $default ) {\\r\\n\\t\\twp_delete_post( $default->ID, true );\\r\\n\\t}\\r\\n}\\r\\n\\r\\n$cat_ids = array();\\r\\nforeach ( $d['cats'] as $slug => $name ) {\\r\\n\\t$existing = get_term_by( 'slug', $slug, 'category' );\\r\\n\\tif ( $existing ) {\\r\\n\\t\\t$cat_ids[ $slug ] = (int) $existing->term_id;\\r\\n\\t} else {\\r\\n\\t\\t$t = wp_insert_term( $name, 'category', array( 'slug' => $slug ) );\\r\\n\\t\\t$cat_ids[ $slug ] = is_wp_error( $t ) ? 0 : (int) $t['term_id'];\\r\\n\\t}\\r\\n}\\r\\n\\r\\nforeach ( $d['posts'] as $p ) {\\r\\n\\tif ( get_page_by_path( $p['name'], OBJECT, 'post' ) ) {\\r\\n\\t\\tcontinue;\\r\\n\\t}\\r\\n\\t$pid = wp_insert_post(\\r\\n\\t\\tarray(\\r\\n\\t\\t\\t'post_title'   => $p['title'],\\r\\n\\t\\t\\t'post_name'    => $p['name'],\\r\\n\\t\\t\\t'post_content' => $p['content'],\\r\\n\\t\\t\\t'post_excerpt' => $p['excerpt'],\\r\\n\\t\\t\\t'post_status'  => 'publish',\\r\\n\\t\\t\\t'post_type'    => 'post',\\r\\n\\t\\t\\t'post_date'    => $p['date'],\\r\\n\\t\\t\\t'post_author'  => 1,\\r\\n\\t\\t)\\r\\n\\t);\\r\\n\\tif ( $pid && ! is_wp_error( $pid ) && isset( $cat_ids[ $p['cat'] ] ) ) {\\r\\n\\t\\twp_set_post_terms( $pid, array( $cat_ids[ $p['cat'] ] ), 'category' );\\r\\n\\t}\\r\\n}\\r\\n\\r\\n$home_markup = strtr(\\r\\n\\t$d['home'],\\r\\n\\tarray(\\r\\n\\t\\t'__HARBOR__' => (string) $cat_ids['harbor'],\\r\\n\\t\\t'__ROUTES__' => (string) $cat_ids['routes'],\\r\\n\\t\\t'__DESK__'   => (string) $cat_ids['desk'],\\r\\n\\t)\\r\\n);\\r\\n\\r\\n$home = get_page_by_path( 'home', OBJECT, 'page' );\\r\\nif ( $home ) {\\r\\n\\t$home_id = (int) $home->ID;\\r\\n\\twp_update_post( array( 'ID' => $home_id, 'post_content' => $home_markup ) );\\r\\n} else {\\r\\n\\t$home_id = wp_insert_post(\\r\\n\\t\\tarray(\\r\\n\\t\\t\\t'post_title'   => 'Home',\\r\\n\\t\\t\\t'post_name'    => 'home',\\r\\n\\t\\t\\t'post_content' => $home_markup,\\r\\n\\t\\t\\t'post_status'  => 'publish',\\r\\n\\t\\t\\t'post_type'    => 'page',\\r\\n\\t\\t)\\r\\n\\t);\\r\\n}\\r\\n\\r\\nupdate_post_meta( $home_id, '_wp_page_template', 'page-no-title' );\\r\\n\\r\\nupdate_option( 'blogname', $d['options']['blogname'] );\\r\\nupdate_option( 'blogdescription', $d['options']['blogdescription'] );\\r\\nupdate_option( 'show_on_front', 'page' );\\r\\nupdate_option( 'page_on_front', $home_id );\\r\\nupdate_option( 'permalink_structure', '\\\/%postname%\\\/' );\\r\\nflush_rewrite_rules();\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3592000,"resolution":"1","location":"assets","locale":"","width":1024,"height":509}},"screenshots":{"1":"The \"Make posts unique on page\" toggle in the Query Loop block sidebar."}},"plugin_section":[],"plugin_tags":[148857,271975,10218,213445,271976],"plugin_category":[],"plugin_contributors":[269658],"plugin_business_model":[],"class_list":["post-331457","plugin","type-plugin","status-publish","hentry","plugin_tags-block-editor","plugin_tags-deduplication","plugin_tags-duplicate-posts","plugin_tags-query-loop","plugin_tags-unique-posts","plugin_contributors-itamarsilvacc","plugin_committers-itamarsilvacc"],"banners":{"banner":"https:\/\/ps.w.org\/silvaitamar-duplicate-post-exclusion-query-loop\/assets\/banner-772x250.png?rev=3592000","banner_2x":"https:\/\/ps.w.org\/silvaitamar-duplicate-post-exclusion-query-loop\/assets\/banner-1544x500.png?rev=3592000","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/silvaitamar-duplicate-post-exclusion-query-loop\/assets\/icon-128x128.png?rev=3592000","icon_2x":"https:\/\/ps.w.org\/silvaitamar-duplicate-post-exclusion-query-loop\/assets\/icon-256x256.png?rev=3592000","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/silvaitamar-duplicate-post-exclusion-query-loop\/assets\/screenshot-1.png?rev=3592000","caption":"The \"Make posts unique on page\" toggle in the Query Loop block sidebar."}],"raw_content":"<!--section=description-->\n<p><strong>Duplicate Post Exclusion for Query Loop Block<\/strong> adds a toggle to the native <code>core\/query<\/code> (Query Loop) block so posts already shown by another Query Loop on the same page are not displayed again.<\/p>\n\n<p>This is automatic deduplication for the block editor: when you place several Query Loops on one page (for example a featured list above a recent-posts list), each enabled loop skips the posts already rendered above it, keeping every post unique on the page.<\/p>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>Edit a Query Loop block in the block editor.<\/li>\n<li>In the sidebar, enable <strong>Make posts unique on page<\/strong>.<\/li>\n<li>Enable the same option on any other Query Loops that should respect prior results.<\/li>\n<li>On the front end, each enabled loop excludes post IDs already rendered by previous enabled loops.<\/li>\n<\/ol>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Extends the core Query Loop block \u2014 no custom block or variation required.<\/li>\n<li>Uses official hooks: <code>query_loop_block_query_vars<\/code> and <code>render_block<\/code>.<\/li>\n<li>No extra database queries; only adjusts existing query arguments.<\/li>\n<li>Per-request in-memory registry (no transients or options).<\/li>\n<li>Compatible with Query Loop variations such as Advanced Query Loop.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.7 or later<\/li>\n<li>PHP 7.4 or later<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>silvaitamar-duplicate-post-exclusion-query-loop<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Edit a Query Loop block and enable <strong>Make posts unique on page<\/strong> in the block sidebar.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20prevent%20duplicate%20posts%20in%20query%20loop%20blocks%3F\"><h3>How do I prevent duplicate posts in Query Loop blocks?<\/h3><\/dt>\n<dd><p>Edit each Query Loop block and enable <strong>Make posts unique on page<\/strong> in the block sidebar. On the front end, every enabled loop excludes the posts already shown by the loops above it, so each post appears only once on the page.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20separate%20block%3F\"><h3>Do I need a separate block?<\/h3><\/dt>\n<dd><p>No. The plugin extends the native <code>core\/query<\/code> block only.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>No. The plugin adds no extra database queries. It only adjusts the <code>post__not_in<\/code> argument of the queries your Query Loops already run, using a per-request in-memory registry.<\/p><\/dd>\n<dt id=\"does%20this%20affect%20the%20editor%20preview%3F\"><h3>Does this affect the editor preview?<\/h3><\/dt>\n<dd><p>No. Cross-loop exclusion runs on the front end only. The editor preview uses the REST API and does not simulate exclusion between multiple loops on the same page.<\/p><\/dd>\n<dt id=\"do%20query%20loops%20without%20the%20option%20participate%3F\"><h3>Do Query Loops without the option participate?<\/h3><\/dt>\n<dd><p>No. Only loops with <strong>Make posts unique on page<\/strong> enabled register and exclude posts.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20advanced%20query%20loop%20or%20other%20query%20loop%20variations%3F\"><h3>Does this work with Advanced Query Loop or other Query Loop variations?<\/h3><\/dt>\n<dd><p>Yes. Variations register on the native <code>core\/query<\/code> block. This plugin extends the same block and uses official render hooks, so it works alongside extensions like Advanced Query Loop.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20%22inherit%20query%20from%20template%22%3F\"><h3>Does it work with \"Inherit query from template\"?<\/h3><\/dt>\n<dd><p>Partially. A Query Loop set to inherit the template query renders from the global query and does not pass through the <code>query_loop_block_query_vars<\/code> filter. Such an inherited loop still registers the posts it shows, so a later custom loop will exclude them. However, exclusion is not applied to the inherited loop itself (it will not hide posts shown by an earlier loop). Full support for inherited queries is planned for a future release.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Documentation only: improved the readme for search discoverability (refined tags, short description, and description) and added two FAQ entries. No functional changes.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Renamed the plugin display name to \"Duplicate Post Exclusion for Query Loop Block\". The plugin slug, text domain, and functionality are unchanged.<\/li>\n<li>Bundled the Spanish (Spain) translation.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: <code>uniqueOnPage<\/code> attribute, front-end exclusion, and rendered post registry.<\/li>\n<\/ul>","raw_excerpt":"Prevent duplicate posts across multiple Query Loop blocks on the same page \u2014 automatic deduplication, no extra queries.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/331457","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=331457"}],"author":[{"embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/itamarsilvacc"}],"wp:attachment":[{"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=331457"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=331457"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=331457"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=331457"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=331457"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mya.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=331457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}