{"id":191113,"date":"2024-05-13T14:32:07","date_gmt":"2024-05-13T14:32:07","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dynamic-post-grid-elementor-addon\/"},"modified":"2026-07-19T16:50:03","modified_gmt":"2026-07-19T16:50:03","slug":"dynamic-post-grid-elementor-addon","status":"publish","type":"plugin","link":"https:\/\/te.wordpress.org\/plugins\/dynamic-post-grid-elementor-addon\/","author":8205952,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.9.0","stable_tag":"1.9.0","tested":"7.0.2","requires":"5.0","requires_php":"5.6","requires_plugins":null,"header_name":"Dynamic Post Grid \u2013 Gutenberg Blocks, Shortcodes & Elementor Addon","header_author":"DynamicWebLab","header_description":"Elementor page builder addon to display posts in a grid. Useful for generating post grid from your blog posts with multiple options.","assets_banners_color":"6e6ccf","last_updated":"2026-07-19 16:50:03","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/dynamicweblab.com\/","rating":0,"author_block_rating":0,"active_installs":30,"downloads":2832,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"dynamicweblab","date":"2024-05-19 05:21:09"},"1.0.2":{"tag":"1.0.2","author":"dynamicweblab","date":"2024-05-26 18:31:34"},"1.0.3":{"tag":"1.0.3","author":"dynamicweblab","date":"2024-07-28 06:07:31"},"1.0.4":{"tag":"1.0.4","author":"dynamicweblab","date":"2024-07-28 06:08:37"},"1.0.5":{"tag":"1.0.5","author":"dynamicweblab","date":"2024-11-08 16:36:34"},"1.0.6":{"tag":"1.0.6","author":"dynamicweblab","date":"2024-11-06 15:48:19"},"1.0.7":{"tag":"1.0.7","author":"dynamicweblab","date":"2024-11-08 16:38:09"},"1.0.8":{"tag":"1.0.8","author":"dynamicweblab","date":"2024-11-08 17:24:42"},"1.0.9":{"tag":"1.0.9","author":"maidulcu","date":"2025-03-08 05:00:22"},"1.11.0":{"tag":"1.11.0","author":"maidulcu","date":"2026-07-19 16:50:03"},"1.2.0":{"tag":"1.2.0","author":"maidulcu","date":"2025-03-08 05:01:17"},"1.2.1":{"tag":"1.2.1","author":"maidulcu","date":"2025-04-09 15:53:24"},"1.2.2":{"tag":"1.2.2","author":"maidulcu","date":"2025-05-23 12:13:53"},"1.2.3":{"tag":"1.2.3","author":"maidulcu","date":"2025-09-21 13:37:37"},"1.2.4":{"tag":"1.2.4","author":"maidulcu","date":"2025-07-17 03:53:45"},"1.2.5":{"tag":"1.2.5","author":"maidulcu","date":"2025-09-21 13:37:37"},"1.2.6":{"tag":"1.2.6","author":"maidulcu","date":"2025-09-21 13:37:37"},"1.3.0":{"tag":"1.3.0","author":"maidulcu","date":"2026-07-17 18:56:21"},"1.5.0":{"tag":"1.5.0","author":"maidulcu","date":"2026-07-18 04:21:07"},"1.6.0":{"tag":"1.6.0","author":"maidulcu","date":"2026-07-18 07:57:52"},"1.7.0":{"tag":"1.7.0","author":"maidulcu","date":"2026-07-18 13:14:09"},"1.8.0":{"tag":"1.8.0","author":"maidulcu","date":"2026-07-18 13:14:09"},"1.9.0":{"tag":"1.9.0","author":"maidulcu","date":"2026-07-19 16:50:03"}},"upgrade_notice":{"1.9.0":"<p>Advanced Query Tab \u2014 taxonomy queries, date queries, author\/search\/status filters, and critical bug fixes for filters not applying.<\/p>","1.8.0":"<p>Critical fixes: slider now works in shortcodes, Swiper loads correctly, blocks appear in Gutenberg editor, filter + slider combo works, and cache invalidates on settings change.<\/p>","1.7.0":"<p>4 Gutenberg Blocks (Grid, List, Masonry, Filter), numbered pagination, dropdown filter, URL deep-linking, 3 new grid presets, and review prompt.<\/p>","1.6.0":"<p>Masonry and List layouts, 10 hover effects, transient caching, REST API, Abilities API (AI-agent-ready), security hardening, and multiple bug fixes.<\/p>","1.5.0":"<p>AJAX filtering, Load More pagination, Reset to Default, and a modernized admin form layout.<\/p>","1.4.0":"<p>New block types: Slider carousel (Swiper), Button, Price, Rating, and Custom Field. The shortcode builder now loads independently of Elementor.<\/p>","1.3.0":"<p>Major update \u2014 new standalone Shortcode Builder with drag-and-drop blocks, style presets, and WooCommerce support. No changes required for existing Elementor widget users.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3088867,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3092759,"resolution":"1544x500","location":"assets","locale":"","width":1545,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3088869,"resolution":"772x250","location":"assets","locale":"","width":773,"height":250}},"assets_blueprints":{},"all_blocks":{"depg\/filter":{"$schema":"https:\/\/schemas.wp.org\/wp\/6.6\/block.json","apiVersion":3,"name":"depg\/filter","title":"Dynamic Grid Filter","category":"layout","icon":"filter","description":"Standalone filter bar that connects to any grid on the page.","supports":{"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"targetId":{"type":"integer","default":0},"style":{"type":"string","default":"buttons"},"taxonomy":{"type":"string","default":""}},"editorScript":"depg-blocks","editorStyle":"depg-blocks-editor"},"depg\/list":{"$schema":"https:\/\/schemas.wp.org\/wp\/6.6\/block.json","apiVersion":3,"name":"depg\/list","title":"Dynamic List Layout","category":"layout","icon":"list-view","description":"Display posts in a list layout.","supports":{"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"postId":{"type":"integer","default":0},"columns":{"type":"integer","default":0},"perPage":{"type":"integer","default":0},"orderby":{"type":"string","default":""},"order":{"type":"string","default":""},"filter":{"type":"boolean","default":false},"loadMore":{"type":"boolean","default":false},"infiniteScroll":{"type":"boolean","default":false}},"editorScript":"depg-blocks","editorStyle":"depg-blocks-editor"},"depg\/masonry":{"$schema":"https:\/\/schemas.wp.org\/wp\/6.6\/block.json","apiVersion":3,"name":"depg\/masonry","title":"Dynamic Masonry Layout","category":"layout","icon":"grid-view","description":"Display posts in a masonry layout.","supports":{"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"postId":{"type":"integer","default":0},"columns":{"type":"integer","default":0},"perPage":{"type":"integer","default":0},"orderby":{"type":"string","default":""},"order":{"type":"string","default":""},"filter":{"type":"boolean","default":false},"loadMore":{"type":"boolean","default":false},"infiniteScroll":{"type":"boolean","default":false}},"editorScript":"depg-blocks","editorStyle":"depg-blocks-editor"}},"tagged_versions":["1.0.1","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.0.9","1.11.0","1.2.0","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5","1.2.6","1.3.0","1.5.0","1.6.0","1.7.0","1.8.0","1.9.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3092768,"resolution":"1","location":"assets","locale":"","width":1726,"height":1760},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3092768,"resolution":"2","location":"assets","locale":"","width":1748,"height":1570},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3092768,"resolution":"3","location":"assets","locale":"","width":1838,"height":1104},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3612351,"resolution":"4","location":"assets","locale":"","width":2476,"height":1614},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3612351,"resolution":"5","location":"assets","locale":"","width":2466,"height":1710},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3612351,"resolution":"6","location":"assets","locale":"","width":2462,"height":1628},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3612351,"resolution":"7","location":"assets","locale":"","width":2462,"height":1320}},"screenshots":{"1":"Elementor Grid Layout","2":"Elementor List Layout","3":"Elementor Slider Layout","4":"Shortcode Builder \u2014 Post Query and Layout Mode selector","5":"Shortcode Builder \u2014 Layout Canvas with Drag-and-Drop Blocks","6":"Style Presets","7":"Advance \u2014 Meta Query and Cache controll"}},"plugin_section":[],"plugin_tags":[76538,152129,3480,166,286],"plugin_category":[45],"plugin_contributors":[80683],"plugin_business_model":[],"class_list":["post-191113","plugin","type-plugin","status-publish","hentry","plugin_tags-elementor","plugin_tags-gutenberg-blocks","plugin_tags-post-grid","plugin_tags-posts","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-maidulcu","plugin_committers-maidulcu"],"banners":{"banner":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/banner-772x250.png?rev=3088869","banner_2x":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/banner-1544x500.png?rev=3092759","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/icon-256x256.png?rev=3088867","icon_2x":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/icon-256x256.png?rev=3088867","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/screenshot-1.png?rev=3092768","caption":"Elementor Grid Layout"},{"src":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/screenshot-2.png?rev=3092768","caption":"Elementor List Layout"},{"src":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/screenshot-3.png?rev=3092768","caption":"Elementor Slider Layout"},{"src":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/screenshot-4.png?rev=3612351","caption":"Shortcode Builder \u2014 Post Query and Layout Mode selector"},{"src":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/screenshot-5.png?rev=3612351","caption":"Shortcode Builder \u2014 Layout Canvas with Drag-and-Drop Blocks"},{"src":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/screenshot-6.png?rev=3612351","caption":"Style Presets"},{"src":"https:\/\/ps.w.org\/dynamic-post-grid-elementor-addon\/assets\/screenshot-7.png?rev=3612351","caption":"Advance \u2014 Meta Query and Cache controll"}],"raw_content":"<!--section=description-->\n<p>Dynamic Post Grid is a lightweight, SEO-friendly plugin for displaying posts, pages, custom post types, and WooCommerce products in beautiful grid, masonry, list, and slider layouts. It works three ways: as a Gutenberg block, a standalone Shortcode Builder (no page builder needed), and an Elementor widget.<\/p>\n\n<p><strong>What makes this plugin different?<\/strong> Unlike other grid plugins that lock you into fixed templates, Dynamic Post Grid uses a block-based layout builder. Each grid is a JSON document describing individual blocks \u2014 making layouts serializable, exportable, shareable, and composable. Combined with transient caching, REST API, and Abilities API, it's built for performance and developer flexibility.<\/p>\n\n<h3>Core Features<\/h3>\n\n<ul>\n<li><strong>Elementor Widget<\/strong> \u2014 Drag-and-drop post\/product grids directly inside Elementor with 7 layout styles and full styling controls.<\/li>\n<li><strong>Gutenberg Block<\/strong> \u2014 Native Block Editor integration with layout selector and attribute overrides.<\/li>\n<li><strong>Standalone Shortcode Builder<\/strong> \u2014 Build custom post grids with a visual drag-and-drop block editor. No Elementor required.<\/li>\n<li><strong>4 Layout Modes<\/strong> \u2014 Grid, Masonry, List, and Slider layouts with responsive columns.<\/li>\n<li><strong>14 Block Types<\/strong> \u2014 Thumbnail, title, meta, excerpt, read more, terms, divider, spacer, custom HTML, button, price, rating, custom field, and slider.<\/li>\n<li><strong>10 Hover Effects<\/strong> \u2014 Zoom In, Zoom Out, Grayscale to Color, Blur, Brightness, Overlay Fade, Overlay Slide Up, Overlay Slide Left, Overlay Scale, and Border Draw.<\/li>\n<li><strong>AJAX Category Filtering<\/strong> \u2014 Category filter buttons that reload the grid without page refresh.<\/li>\n<li><strong>Load More Pagination<\/strong> \u2014 AJAX-powered load more button for paginated grids.<\/li>\n<li><strong>Infinite Scroll<\/strong> \u2014 Automatic loading via Intersection Observer when scrolling near the bottom.<\/li>\n<li><strong>8 Style Presets<\/strong> \u2014 Built-in layout presets plus save and reuse your own custom presets.<\/li>\n<li><strong>WooCommerce Ready<\/strong> \u2014 Display products with price, ratings, add-to-cart buttons, and sale badges.<\/li>\n<li><strong>Transient Caching<\/strong> \u2014 Server-side caching for grid output with automatic invalidation.<\/li>\n<li><strong>REST API<\/strong> \u2014 Full API access to grid data for headless\/decoupled usage.<\/li>\n<li><strong>Abilities API<\/strong> \u2014 WordPress 6.9+ AI-agent-ready abilities for programmatic grid operations.<\/li>\n<\/ul>\n\n<h3>Shortcode Reference<\/h3>\n\n<h3>Basic Usage<\/h3>\n\n<pre><code>[depg_grid id=\"123\"]\n<\/code><\/pre>\n\n<h3>All Attributes<\/h3>\n\n<pre><code>[depg_grid id=\"123\" layout_mode=\"grid\" columns=\"3\" per_page=\"6\" orderby=\"date\" order=\"DESC\" filter=\"yes\" filter_tax=\"category\" load_more=\"yes\" infinite_scroll=\"yes\"]\n<\/code><\/pre>\n\n\n\n\n  Attribute\n  Type\n  Default\n  Description\n\n\n\n\n  <code>id<\/code>\n  integer\n  (required)\n  Shortcode post ID\n\n\n  <code>layout_mode<\/code>\n  string\n  grid\n  Layout mode: <code>grid<\/code>, <code>masonry<\/code>, <code>list<\/code>, or <code>slider<\/code>\n\n\n  <code>columns<\/code>\n  integer\n  3\n  Number of columns (1-4)\n\n\n  <code>per_page<\/code>\n  integer\n  6\n  Posts per page (-1 for all)\n\n\n  <code>orderby<\/code>\n  string\n  date\n  Sort by: <code>date<\/code>, <code>title<\/code>, <code>ID<\/code>, <code>modified<\/code>, <code>rand<\/code>, <code>menu_order<\/code>\n\n\n  <code>order<\/code>\n  string\n  DESC\n  Sort direction: <code>ASC<\/code> or <code>DESC<\/code>\n\n\n  <code>filter<\/code>\n  string\n  no\n  Show filter buttons: <code>yes<\/code>, <code>1<\/code>, or <code>true<\/code>\n\n\n  <code>filter_tax<\/code>\n  string\n  auto\n  Taxonomy for filter buttons\n\n\n  <code>load_more<\/code>\n  string\n  no\n  Show Load More button: <code>yes<\/code>, <code>1<\/code>, or <code>true<\/code>\n\n\n  <code>infinite_scroll<\/code>\n  string\n  no\n  Enable infinite scroll: <code>yes<\/code>, <code>1<\/code>, or <code>true<\/code>\n\n\n\n\n<h3>REST API<\/h3>\n\n<p><strong>Endpoint:<\/strong> <code>GET \/wp-json\/depg\/v1\/grid\/{id}<\/code><\/p>\n\n<p><strong>Parameters:<\/strong> <code>page<\/code>, <code>per_page<\/code>, <code>filter<\/code> (term ID), <code>taxonomy<\/code>, <code>layout_mode<\/code><\/p>\n\n<p><strong>Response:<\/strong>\n    <code>json\n{\n  \"settings\": {\n    \"post_type\": \"post\",\n    \"layout_mode\": \"grid\",\n    \"columns\": 3,\n    \"per_page\": 6,\n    \"orderby\": \"date\",\n    \"order\": \"DESC\"\n  },\n  \"blocks\": [...],\n  \"posts\": [\n    {\n      \"id\": 123,\n      \"title\": \"Hello World\",\n      \"permalink\": \"https:\/\/example.com\/hello-world\/\",\n      \"excerpt\": \"This is a sample post...\",\n      \"date\": \"2026-07-18T10:00:00+00:00\",\n      \"author\": { \"id\": 1, \"name\": \"Admin\" },\n      \"featured_image\": { \"src\": \"...\", \"alt\": \"...\" },\n      \"terms\": [{ \"taxonomy\": \"category\", \"name\": \"Uncategorized\" }]\n    }\n  ],\n  \"paging\": {\n    \"current_page\": 1,\n    \"max_num_pages\": 5,\n    \"total_posts\": 48,\n    \"remaining\": 42\n  }\n}<\/code><\/p>\n\n<h3>Abilities API (WordPress 6.9+)<\/h3>\n\n\n\n\n  Ability\n  Type\n  Description\n\n\n\n\n  <code>dynamic-post-grid\/render-grid<\/code>\n  Read-only\n  Render a grid as HTML\n\n\n  <code>dynamic-post-grid\/get-grid-data<\/code>\n  Read-only\n  Get structured post data as JSON\n\n\n  <code>dynamic-post-grid\/create-shortcode<\/code>\n  Write\n  Create a new grid programmatically\n\n\n  <code>dynamic-post-grid\/export-layout<\/code>\n  Read-only\n  Export layout as portable JSON\n\n\n  <code>dynamic-post-grid\/import-layout<\/code>\n  Write\n  Import a layout JSON\n\n\n\n\n<p>Execute via: <code>POST \/wp-json\/wp-abilities\/v1\/execute\/{ability-name}<\/code><\/p>\n\n<!--section=installation-->\n<ol>\n<li>Go to <strong>Plugins &gt; Add New<\/strong> and search for \"Dynamic Post Grid Elementor Addon\".<\/li>\n<li>Install and activate the plugin.<\/li>\n<li><strong>Elementor users:<\/strong> The widget appears under \"WPC Elements\" in the Elementor panel.<\/li>\n<li><strong>Shortcode users:<\/strong> Go to <strong>Grid Shortcodes &gt; Add New<\/strong> in your admin to create a layout, then copy the shortcode.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20require%20elementor%3F\"><h3>Does the plugin require Elementor?<\/h3><\/dt>\n<dd><p>The Elementor widget requires Elementor 3.0 or higher. However, the <strong>Standalone Shortcode Builder<\/strong> works independently \u2014 you can use the <code>[depg_grid]<\/code> shortcode in the Block Editor, classic editor, widgets, or any page builder.<\/p><\/dd>\n<dt id=\"how%20do%20i%20use%20the%20shortcode%20builder%3F\"><h3>How do I use the Shortcode Builder?<\/h3><\/dt>\n<dd><p>Go to <strong>Grid Shortcodes &gt; Add New<\/strong> in your WordPress admin. Give your layout a title, configure the query settings (post type, columns, etc.), drag blocks into the layout builder, and publish. Copy the generated shortcode and paste it into any post, page, or widget area.<\/p><\/dd>\n<dt id=\"what%20layout%20modes%20are%20available%3F\"><h3>What layout modes are available?<\/h3><\/dt>\n<dd><p>Three layout modes are available in the Post Query settings:<\/p>\n\n<ul>\n<li><strong>Grid<\/strong> \u2014 Classic column-based grid layout.<\/li>\n<li><strong>Masonry<\/strong> \u2014 Pinterest-style layout with CSS columns (no JavaScript dependency).<\/li>\n<li><strong>List<\/strong> \u2014 Horizontal layout with featured image on the left and content on the right.<\/li>\n<\/ul>\n\n<p>You can also override the layout mode via shortcode attribute:<\/p>\n\n<pre><code>[depg_grid id=\"123\" layout_mode=\"masonry\"]\n<\/code><\/pre><\/dd>\n<dt id=\"how%20do%20hover%20effects%20work%3F\"><h3>How do hover effects work?<\/h3><\/dt>\n<dd><p>Hover effects are configured per Thumbnail block. In the Layout Builder, click <strong>Settings<\/strong> on a Thumbnail block and select a hover effect from the dropdown. Available effects:<\/p>\n\n<ul>\n<li><strong>Zoom In<\/strong> \u2014 Image scales up on hover.<\/li>\n<li><strong>Zoom Out<\/strong> \u2014 Image starts zoomed and scales to normal on hover.<\/li>\n<li><strong>Grayscale to Color<\/strong> \u2014 Image transitions from black-and-white to full color.<\/li>\n<li><strong>Blur<\/strong> \u2014 Image blurs on hover.<\/li>\n<li><strong>Brightness<\/strong> \u2014 Image brightens on hover.<\/li>\n<li><strong>Overlay Fade<\/strong> \u2014 Dark overlay with link icon fades in.<\/li>\n<li><strong>Overlay Slide Up<\/strong> \u2014 Dark overlay slides up from bottom.<\/li>\n<li><strong>Overlay Slide Left<\/strong> \u2014 Dark overlay slides in from the right.<\/li>\n<li><strong>Overlay Scale<\/strong> \u2014 Circular overlay expands from center (Material Design style).<\/li>\n<li><strong>Border Draw<\/strong> \u2014 Blue border appears on hover.<\/li>\n<\/ul><\/dd>\n<dt id=\"how%20does%20ajax%20filtering%20work%3F\"><h3>How does AJAX filtering work?<\/h3><\/dt>\n<dd><p>Enable filtering in the Post Query section by checking \"Show category filter buttons\". On the frontend, clicking a filter button reloads the grid content via AJAX without a page refresh. The filter respects your category restrictions \u2014 if you limit the grid to specific categories, only those categories appear as filter buttons.<\/p>\n\n<p>You can also enable it via shortcode attribute:<\/p>\n\n<pre><code>[depg_grid id=\"123\" filter=\"yes\" filter_tax=\"category\"]\n<\/code><\/pre><\/dd>\n<dt id=\"how%20does%20load%20more%20work%3F\"><h3>How does Load More work?<\/h3><\/dt>\n<dd><p>Enable Load More in the Post Query section by selecting \"Load More\" as the pagination mode. A \"Load More (X remaining)\" button appears below the grid. Clicking it loads the next page of posts via AJAX and appends them to the grid. The button disappears when all posts are loaded.<\/p><\/dd>\n<dt id=\"how%20does%20infinite%20scroll%20work%3F\"><h3>How does Infinite Scroll work?<\/h3><\/dt>\n<dd><p>Enable Infinite Scroll in the Post Query section by selecting \"Infinite Scroll\" as the pagination mode. As the user scrolls near the bottom of the grid, new posts are automatically loaded via AJAX and appended to the grid. A spinner shows while loading, and a \"No more posts\" message appears when all posts are loaded.<\/p>\n\n<p>You can also enable it via shortcode attribute:<\/p>\n\n<pre><code>[depg_grid id=\"123\" infinite_scroll=\"yes\"]\n<\/code><\/pre><\/dd>\n<dt id=\"how%20does%20caching%20work%3F\"><h3>How does caching work?<\/h3><\/dt>\n<dd><p>Grid output is cached using WordPress transients for 1 hour by default. Cache is automatically invalidated when:<\/p>\n\n<ul>\n<li>A post is saved, deleted, or its status changes.<\/li>\n<li>A grid shortcode is updated.<\/li>\n<li>You click \"Clear All Grid Cache\" in the Shortcode Builder.<\/li>\n<\/ul>\n\n<p>You can change the cache duration with the <code>depg_cache_duration<\/code> filter:<\/p>\n\n<pre><code>add_filter( 'depg_cache_duration', function() { return 30 * MINUTE_IN_SECONDS; } );\n<\/code><\/pre><\/dd>\n<dt id=\"what%20is%20the%20rest%20api%3F\"><h3>What is the REST API?<\/h3><\/dt>\n<dd><p>All grid data is available via REST API for headless\/decoupled usage:<\/p>\n\n<pre><code>GET \/wp-json\/depg\/v1\/grid\/{id}\n<\/code><\/pre>\n\n<p>Optional parameters: <code>page<\/code>, <code>per_page<\/code>, <code>filter<\/code> (term ID), <code>taxonomy<\/code>, <code>layout_mode<\/code>.<\/p>\n\n<p>The response includes structured post data (title, permalink, excerpt, author, featured image, terms) and paging information. No authentication required.<\/p><\/dd>\n<dt id=\"what%20is%20the%20abilities%20api%3F\"><h3>What is the Abilities API?<\/h3><\/dt>\n<dd><p>On WordPress 6.9+, the plugin registers 5 AI-agent-ready abilities that can be discovered and executed by AI agents, automation tools (Zapier, n8n), and MCP servers:<\/p>\n\n<ul>\n<li><code>dynamic-post-grid\/render-grid<\/code> \u2014 Render a grid as HTML.<\/li>\n<li><code>dynamic-post-grid\/get-grid-data<\/code> \u2014 Get structured post data as JSON.<\/li>\n<li><code>dynamic-post-grid\/create-shortcode<\/code> \u2014 Create a new grid programmatically.<\/li>\n<li><code>dynamic-post-grid\/export-layout<\/code> \u2014 Export a grid layout as portable JSON.<\/li>\n<li><code>dynamic-post-grid\/import-layout<\/code> \u2014 Import a layout JSON.<\/li>\n<\/ul><\/dd>\n<dt id=\"can%20i%20override%20shortcode%20settings%20in%20the%20shortcode%20itself%3F\"><h3>Can I override shortcode settings in the shortcode itself?<\/h3><\/dt>\n<dd><p>Yes. You can pass any of these attributes to override the saved settings:<\/p>\n\n<pre><code>[depg_grid id=\"123\" layout_mode=\"masonry\" columns=\"2\" per_page=\"12\" orderby=\"title\" order=\"ASC\" filter=\"yes\" load_more=\"yes\"]\n<\/code><\/pre>\n\n<p>Available attributes: <code>id<\/code> (required), <code>layout_mode<\/code> (grid\/masonry\/list), <code>columns<\/code> (1-4), <code>per_page<\/code> (number of posts), <code>orderby<\/code> (date, title, ID, modified, rand, menu_order), <code>order<\/code> (ASC or DESC), <code>filter<\/code> (yes\/1\/true), <code>filter_tax<\/code> (taxonomy slug), <code>load_more<\/code> (yes\/1\/true).<\/p><\/dd>\n<dt id=\"can%20i%20save%20my%20own%20layout%20presets%3F\"><h3>Can I save my own layout presets?<\/h3><\/dt>\n<dd><p>Yes. Build a layout in the Shortcode Builder, click <strong>Save Current as Preset<\/strong>, enter a name, and save. Your custom presets appear in the <strong>My Presets<\/strong> dropdown alongside the built-in presets.<\/p><\/dd>\n<dt id=\"can%20i%20export%20and%20import%20grid%20layouts%3F\"><h3>Can I export and import grid layouts?<\/h3><\/dt>\n<dd><p>Yes. Use the REST API or Abilities API to export a grid configuration as JSON. The JSON contains the full settings and block configuration. Import it on another site to create an identical grid.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20products%3F\"><h3>Does it work with WooCommerce products?<\/h3><\/dt>\n<dd><p>Yes. Select \"Product\" as the post type in the query settings. The shortcode builder includes Price and Rating blocks specifically for WooCommerce products.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20work%20with%20all%20themes%3F\"><h3>Does this plugin work with all themes?<\/h3><\/dt>\n<dd><p>Yes. It works with all WordPress themes.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>[Feature] Advanced Query Tab \u2014 full WP_Query control from the Shortcode Builder (no code needed).<\/li>\n<li>[Feature] Taxonomy Query repeater \u2014 filter by multiple taxonomies and terms with AND\/OR relation.<\/li>\n<li>[Feature] Date Query \u2014 filter posts by date range (after\/before) or year\/month\/day.<\/li>\n<li>[Feature] Author, Search, Include IDs, Post Status, and Has Password filters.<\/li>\n<li>[Fix] Advanced query settings (exclude, offset, post_parent, ignore_sticky_posts, meta_query) now actually apply to WP_Query \u2014 previously saved but never used.<\/li>\n<li>[Fix] AJAX filter now applies all advanced query filters (was previously ignored in AJAX requests).<\/li>\n<li>[Fix] Removed dead <code>has_password<\/code> code that checked <code>=== '0'<\/code> and never triggered.<\/li>\n<li>[Fix] Taxonomy query merge with existing category filter now preserves all clauses correctly.<\/li>\n<li>[Fix] Date query month\/day save edge case (value 0 was saved instead of empty).<\/li>\n<li>[Performance] Extracted shared <code>apply_advanced_query_filters()<\/code> method for reuse across render paths.<\/li>\n<li>[Testing] Added standalone test suite with 21 test cases covering all advanced query filters.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>[Feature] Plugin renamed to \"Dynamic Post Grid \u2013 Gutenberg Blocks, Shortcodes &amp; Elementor Addon\" for better SEO and discoverability.<\/li>\n<li>[Fix] Gutenberg blocks not rendering in editor \u2014 removed conflicting editorScript\/editorStyle from block.json, script loading now handled via enqueue_block_editor_assets.<\/li>\n<li>[Fix] Slider layout not working in shortcode \u2014 shortcode renderer now falls back to saved slider_settings when layout_mode is slider.<\/li>\n<li>[Fix] Swiper CSS\/JS not loading \u2014 moved Swiper enqueue from render_slider() (too late, after wp_head) to enqueue_assets() (before wp_head).<\/li>\n<li>[Fix] Slider navigation broken on first page load with filter enabled \u2014 removed fragile inline script, Swiper now initializes via depg-filter.js on DOMContentLoaded and window.load.<\/li>\n<li>[Fix] AJAX filter now re-initializes Swiper after replacing slider content.<\/li>\n<li>[Fix] Case-sensitivity bug in depg-filter.js \u2014 DEPG_Filter vs DEPG_FILTER caused ReferenceError on frontend.<\/li>\n<li>[Fix] Cache stale after settings change \u2014 cache key now includes layout_mode and columns, ensuring different settings produce different cache entries.<\/li>\n<li>[Fix] block.json trailing commas \u2014 removed invalid trailing commas from all 4 block.json files.<\/li>\n<li>[Tweak] depg-filter.js now depends on Swiper script to guarantee load order.<\/li>\n<li>[Tweak] Slider config stored as data attributes on container instead of inline script.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>[Feature] Gutenberg Blocks \u2014 4 native blocks: Dynamic Post Grid, Dynamic Post List, Dynamic Post Masonry, and Dynamic Post Filter.<\/li>\n<li>[Feature] Numbered pagination \u2014 AJAX-powered page links with prev\/next, ellipsis, and current page indicator.<\/li>\n<li>[Feature] Dropdown filter style \u2014 compact  dropdown alternative to filter buttons.<\/li>\n<li>[Feature] URL deep-linking \u2014 filter state persists in browser URL (?depg_123=456) for shareable filtered views.<\/li>\n<li>[Feature] Browser back\/forward support \u2014 navigation history restores filter state automatically.<\/li>\n<li>[Feature] 3 new grid presets \u2014 Magazine (large first + 2-col), Card Overlay (image + title overlay), Title List (compact title-focused).<\/li>\n<li>[Feature] Filter Style selector \u2014 choose between Buttons or Dropdown in Shortcode Builder and Gutenberg blocks.<\/li>\n<li>[Feature] Standalone Filter block \u2014 place a filter bar anywhere on the page, connected to any grid.<\/li>\n<li>[Feature] Pagination attribute \u2014 <code>[depg_grid id=\"123\" pagination=\"numbers\"]<\/code> for shortcode override.<\/li>\n<li>[Feature] Review prompt \u2014 admin notice after creating 3+ grids, with one-click dismiss.<\/li>\n<li>[Feature] Infinite Scroll pagination \u2014 automatic loading via Intersection Observer, configurable threshold.<\/li>\n<li>[Feature] Slider layout mode \u2014 moved from block palette to layout mode selector with dedicated options card.<\/li>\n<li>[UI] Pagination Mode selector \u2014 None, Numbered, Load More, or Infinite Scroll (4 options).<\/li>\n<li>[UI] Complete Shortcode Builder redesign \u2014 modern 5-tab interface (Query, Layout, Builder, Style, Advanced).<\/li>\n<li>[UI] Visual layout mode cards with icons for Grid, Masonry, List, and Slider.<\/li>\n<li>[Fix] REST API now includes pagination_mode and slider_settings in response.<\/li>\n<li>[Fix] Cache key now differentiates between pagination modes.<\/li>\n<li>[Fix] Fixed JavaScript variable redeclaration bug in frontend filter JS.<\/li>\n<li>[Fix] Cache clear AJAX action now uses its own dedicated nonce instead of reusing the presets nonce.<\/li>\n<li>[Fix] Cache invalidation now uses tracked keys with delete_transient() instead of raw SQL, ensuring proper clearing when object caching (Redis\/Memcached) is active.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>[Feature] Masonry layout mode \u2014 Pinterest-style CSS column layout, responsive (3\/2\/1 columns).<\/li>\n<li>[Feature] List layout mode \u2014 horizontal layout with featured image on left, content on right, responsive stacking on mobile.<\/li>\n<li>[Feature] 10 thumbnail hover effects \u2014 Zoom In, Zoom Out, Grayscale to Color, Blur, Brightness, Overlay Fade, Overlay Slide Up, Overlay Slide Left, Overlay Scale, Border Draw.<\/li>\n<li>[Feature] Transient-based caching for grid output (1 hour default, filterable).<\/li>\n<li>[Feature] Auto cache invalidation on post save, delete, and status change.<\/li>\n<li>[Feature] \"Clear All Grid Cache\" button in Shortcode Builder.<\/li>\n<li>[Feature] REST API endpoint \u2014 <code>GET \/wp-json\/depg\/v1\/grid\/{id}<\/code> for headless\/decoupled usage.<\/li>\n<li>[Feature] Abilities API \u2014 5 AI-agent-ready abilities for WordPress 6.9+ (render-grid, get-grid-data, create-shortcode, export-layout, import-layout).<\/li>\n<li>[Feature] Shortcode attribute <code>layout_mode<\/code> \u2014 override layout mode via <code>[depg_grid id=\"123\" layout_mode=\"masonry\"]<\/code>.<\/li>\n<li>[Fix] Exclude IDs, Offset, Ignore Sticky Posts, Post Parent, and Meta Query fields now save correctly in the Shortcode Builder.<\/li>\n<li>[Fix] <code>$featured_image<\/code> undefined variable notice for posts without thumbnails in REST API response.<\/li>\n<li>[Fix] Help page now documents current shortcode attributes instead of legacy Elementor widget attributes.<\/li>\n<li>[Security] Abilities API \u2014 all block types individually sanitized with proper escaping (wp_kses_post for HTML, esc_url_raw for URLs, sanitize_key for keys, etc.).<\/li>\n<li>[Security] Abilities API \u2014 import-layout now passes blocks through <code>sanitize_block_for_ability()<\/code> before storage.<\/li>\n<li>[Security] Abilities API \u2014 block type whitelist prevents unknown types from being stored.<\/li>\n<li>[Security] Abilities API \u2014 layout_mode values sanitized with <code>sanitize_key()<\/code> in create-shortcode and import-layout.<\/li>\n<li>[Security] Admin save logic \u2014 layout_mode sanitized with <code>sanitize_key()<\/code> on save.<\/li>\n<li>[UI] Admin form modernized with flexbox grid layout (no more table-based form).<\/li>\n<li>[UI] Renamed \"Query Settings\" to \"Post Query\" for clarity.<\/li>\n<li>[Performance] Cache layer reduces database queries for repeated grid renders.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>[Feature] AJAX category filtering \u2014 category filter buttons that reload posts without page refresh.<\/li>\n<li>[Feature] Load More pagination \u2014 AJAX-powered load more button with remaining post count.<\/li>\n<li>[Feature] Reset to Default \u2014 one-click reset in the layout builder restores the default block configuration.<\/li>\n<li>[Feature] New <code>filter<\/code>, <code>filter_tax<\/code>, and <code>load_more<\/code> shortcode attributes.<\/li>\n<li>[Feature] Frontend filter and load more settings configurable from the Shortcode Builder UI.<\/li>\n<li>[UI] Redesigned Post Query section with modern flexbox form grid layout.<\/li>\n<li>[UI] Renamed \"Query Settings\" to \"Post Query\" for clarity.<\/li>\n<li>[Fix] Removed unused auto-preset detection that cleared the dropdown on block changes.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>[Feature] Slider carousel block \u2014 Swiper 11 carousel with configurable slides per view, autoplay, loop, arrows, and dots.<\/li>\n<li>[Feature] Button block \u2014 customizable text, optional custom URL, and target selection.<\/li>\n<li>[Feature] Price block \u2014 WooCommerce product price with optional prefix\/suffix.<\/li>\n<li>[Feature] Rating block \u2014 WooCommerce star rating with optional review count.<\/li>\n<li>[Feature] Custom Field block \u2014 display any post meta value with an optional label.<\/li>\n<li>[Fix] Shortcode builder now works without Elementor.<\/li>\n<li>[Fix] Meta block date checkbox label missing opening tag in JS palette template.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>[Feature] Standalone Shortcode Builder with visual drag-and-drop layout blocks.<\/li>\n<li>[Feature] 8 built-in style presets and custom user presets.<\/li>\n<li>[Feature] Category\/taxonomy filtering in the shortcode builder.<\/li>\n<li>[Fix] Block settings now save correctly on every input change.<\/li>\n<li>[Fix] Block settings keys map correctly between JS and PHP.<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>[Fix] Restore Slick core stylesheet registration.<\/li>\n<li>[Fix] Respect taxonomy relation setting and harden term markup escaping.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>[Fix] Add to Cart button icon overwrite fix.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>[Fix] Category, tag, and status-based filtering issues.<\/li>\n<li>[Style] Product grid, list, and slider layout improvements.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>[Fix] Product grid bug fix.<\/li>\n<li>[Style] CSS updates.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>[Feature] WooCommerce product grid support with layout template.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Build beautiful post grids with Gutenberg blocks, shortcodes, or Elementor. Features grid, masonry, list &amp; slider layouts, AJAX category filters,  &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/191113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=191113"}],"author":[{"embeddable":true,"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/maidulcu"}],"wp:attachment":[{"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=191113"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=191113"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=191113"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=191113"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=191113"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/te.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=191113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}