{"id":378136,"date":"2026-10-18T15:13:21","date_gmt":"2026-10-18T15:13:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mm-post-grid\/"},"modified":"2026-10-18T15:12:58","modified_gmt":"2026-10-18T15:12:58","slug":"mm-post-grid","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/mm-post-grid\/","author":23494222,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1","stable_tag":"0.1","tested":"7.1.3","requires":"6.1","requires_php":"7.4","requires_plugins":null,"header_name":"MM Post Grid","header_author":"MM Web","header_description":"A clean, lightweight and fully responsive post grid that looks right on any theme. Drop the [mm_post_grid] shortcode anywhere and control the defaults from one settings screen.","assets_banners_color":"","last_updated":"2026-10-18 15:12:58","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/mmweb.net\/mm-post-grid\/","header_author_uri":"https:\/\/mmweb.net\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":47,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1":{"tag":"0.1","author":"mehrazmorshed","date":"2026-10-18 15:12:58","revision":3753214}},"upgrade_notice":{"0.1":"<p>First release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The default three column grid on a standard theme.","2":"The Templates tab with the seven styling templates.","3":"The Magazine template: text laid over the featured image.","4":"The List template: image beside the text in a single column.","5":"Styling settings: card, image, typography, categories and buttons.","6":"General settings: query defaults and layout."}},"plugin_section":[],"plugin_tags":[12980,6040,3480,166,80],"plugin_category":[43],"plugin_contributors":[276448],"plugin_business_model":[],"class_list":["post-378136","plugin","type-plugin","status-publish","hentry","plugin_tags-blog-layout","plugin_tags-grid","plugin_tags-post-grid","plugin_tags-posts","plugin_tags-shortcode","plugin_category-customization","plugin_contributors-mmwebnet","plugin_committers-mehrazmorshed","plugin_committers-mmwebnet"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/mm-post-grid.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>MM Post Grid displays your posts, pages or any custom post type in a responsive card grid. Add one shortcode and you get a grid that already looks finished, with sensible spacing, readable typography and a hover state that does not shout.<\/p>\n\n<p>It is built to be a good neighbour. The grid inherits your theme typeface instead of forcing its own, every class name is prefixed, no global element is styled, and there is not a single <code>!important<\/code> in the stylesheet. Nothing is loaded on pages that do not contain a grid.<\/p>\n\n<p><strong>What makes it different<\/strong><\/p>\n\n<ul>\n<li><strong>Genuinely lightweight.<\/strong> One small stylesheet and, only when you use Load More, one small script. No jQuery on the front end, no CSS framework, no icon font, no external requests.<\/li>\n<li><strong>Loads nothing where there is no grid.<\/strong> Assets are registered up front and enqueued only when a grid actually renders.<\/li>\n<li><strong>Theme friendly.<\/strong> Font family is never set, so the grid picks up your theme typeface and only controls size and rhythm. All selectors are scoped to the <code>.mmpg<\/code> wrapper.<\/li>\n<li><strong>Accessible by default.<\/strong> Real heading levels you choose, no duplicate links per card, unique accessible names on every Read more link, visible focus rings, a live region for Load More, and full support for <code>prefers-reduced-motion<\/code>.<\/li>\n<li><strong>Customisable without CSS.<\/strong> Over 35 styling settings drive CSS custom properties: card layout, hover and image effects, spacing, typography, line clamping, category badges, button styles and pagination alignment. Only the values you actually change are printed, so a default site sends no extra CSS at all.<\/li>\n<li><strong>Seven styling templates.<\/strong> Default, Minimal, Soft, Outline, Dark, Magazine and List. Apply one as a starting point, then fine-tune anything on the Styling tab.<\/li>\n<li><strong>Three card layouts.<\/strong> Image above the text, image beside the text, or text laid over the image. The side-by-side layout only engages when a card is wide enough, so it never gets squeezed.<\/li>\n<li><strong>Per grid overrides.<\/strong> Any setting can be overridden on a single grid through a shortcode attribute.<\/li>\n<li><strong>Works without JavaScript.<\/strong> The Load More control is a real link to the next page, so it degrades to normal pagination.<\/li>\n<li><strong>Developer friendly.<\/strong> Namespaced classes, a documented filter on every piece of markup, and no third party dependencies.<\/li>\n<\/ul>\n\n<p><strong>Usage<\/strong><\/p>\n\n<pre><code>[mm_post_grid]\n<\/code><\/pre>\n\n<p>That uses your saved settings. Add attributes to override them for one grid:<\/p>\n\n<pre><code>[mm_post_grid columns=\"4\" posts_per_page=\"8\" pagination=\"load_more\"]\n<\/code><\/pre>\n\n<h3>Shortcode Attributes<\/h3>\n\n<p>Every attribute is optional. Anything you leave out falls back to your saved setting.<\/p>\n\n<p><strong>Query<\/strong><\/p>\n\n<ul>\n<li><code>post_type<\/code> \u2013 One or more post types, comma separated. Default: your setting.<\/li>\n<li><code>posts_per_page<\/code> \u2013 Number of posts per page, 1 to 48.<\/li>\n<li><code>orderby<\/code> \u2013 <code>date<\/code>, <code>modified<\/code>, <code>title<\/code>, <code>menu_order<\/code>, <code>comment_count<\/code>, <code>rand<\/code> or <code>ID<\/code>.<\/li>\n<li><code>order<\/code> \u2013 <code>ASC<\/code> or <code>DESC<\/code>.<\/li>\n<li><code>category<\/code> \u2013 Category slugs or IDs, comma separated.<\/li>\n<li><code>categories<\/code> \u2013 Alias of <code>category<\/code>.<\/li>\n<li><code>tag<\/code> \u2013 Tag slugs or IDs, comma separated.<\/li>\n<li><code>taxonomy<\/code> \u2013 A taxonomy name, used together with <code>terms<\/code>.<\/li>\n<li><code>terms<\/code> \u2013 Term slugs or IDs for the taxonomy above.<\/li>\n<li><code>author<\/code> \u2013 Author IDs, comma separated.<\/li>\n<li><code>exclude<\/code> \u2013 Post IDs to leave out.<\/li>\n<li><code>offset<\/code> \u2013 Skip this many posts.<\/li>\n<li><code>ignore_sticky<\/code> \u2013 <code>yes<\/code> (default) treats sticky posts like any other post; <code>no<\/code> pushes them to the front.<\/li>\n<\/ul>\n\n<p><strong>Layout<\/strong><\/p>\n\n<ul>\n<li><code>columns<\/code> \u2013 Desktop columns, 1 to 6.<\/li>\n<li><code>columns_tablet<\/code> \u2013 Columns below 1024px, 1 to 6.<\/li>\n<li><code>columns_mobile<\/code> \u2013 Columns below 640px, 1 to 6.<\/li>\n<li><code>gap<\/code> \u2013 Space between cards in pixels, 0 to 80.<\/li>\n<li><code>image_size<\/code> \u2013 Any registered image size.<\/li>\n<li><code>image_ratio<\/code> \u2013 <code>16-9<\/code>, <code>16-10<\/code>, <code>3-2<\/code>, <code>4-3<\/code>, <code>1-1<\/code>, <code>3-4<\/code> or <code>auto<\/code>.<\/li>\n<li><code>pagination<\/code> \u2013 <code>none<\/code>, <code>numbers<\/code>, <code>prev_next<\/code> or <code>load_more<\/code>.<\/li>\n<\/ul>\n\n<p><strong>Content<\/strong><\/p>\n\n<ul>\n<li><code>show_image<\/code> \u2013 <code>yes<\/code> or <code>no<\/code>.<\/li>\n<li><code>show_title<\/code> \u2013 <code>yes<\/code> or <code>no<\/code>.<\/li>\n<li><code>show_date<\/code> \u2013 <code>yes<\/code> or <code>no<\/code>.<\/li>\n<li><code>show_author<\/code> \u2013 <code>yes<\/code> or <code>no<\/code>.<\/li>\n<li><code>show_category<\/code> \u2013 <code>yes<\/code> or <code>no<\/code>.<\/li>\n<li><code>show_excerpt<\/code> \u2013 <code>yes<\/code> or <code>no<\/code>.<\/li>\n<li><code>show_read_more<\/code> \u2013 <code>yes<\/code> or <code>no<\/code>.<\/li>\n<li><code>image_fallback<\/code> \u2013 <code>yes<\/code> or <code>no<\/code>, show a placeholder when a post has no featured image.<\/li>\n<li><code>title_tag<\/code> \u2013 <code>h2<\/code>, <code>h3<\/code>, <code>h4<\/code>, <code>h5<\/code>, <code>h6<\/code>, <code>p<\/code> or <code>div<\/code>. Pick the level that fits the page outline.<\/li>\n<li><code>excerpt_length<\/code> \u2013 Words, 0 for the untrimmed excerpt.<\/li>\n<li><code>read_more_text<\/code> \u2013 Link label.<\/li>\n<li><code>button_style<\/code> \u2013 <code>link<\/code>, <code>button<\/code> or <code>outline<\/code>.<\/li>\n<\/ul>\n\n<p><strong>Style<\/strong><\/p>\n\n<p>These switch a class on the grid, so one grid can look different from the site-wide styling. Colours and sizes stay site-wide on the Styling tab.<\/p>\n\n<ul>\n<li><code>card_layout<\/code> \u2013 <code>stacked<\/code> (image above the text), <code>horizontal<\/code> (image beside the text once the card is wider than 460px) or <code>overlay<\/code> (text over the image).<\/li>\n<li><code>hover_effect<\/code> \u2013 <code>lift<\/code>, <code>shadow<\/code>, <code>border<\/code> or <code>none<\/code>.<\/li>\n<li><code>image_hover<\/code> \u2013 <code>zoom<\/code>, <code>none<\/code> or <code>grayscale<\/code>.<\/li>\n<li><code>text_align<\/code> \u2013 <code>left<\/code> or <code>center<\/code>.<\/li>\n<li><code>term_style<\/code> \u2013 <code>text<\/code> or <code>badge<\/code>.<\/li>\n<li><code>button_size<\/code> \u2013 <code>small<\/code>, <code>medium<\/code> or <code>large<\/code>.<\/li>\n<li><code>pagination_align<\/code> \u2013 <code>left<\/code>, <code>center<\/code> or <code>right<\/code>.<\/li>\n<li><code>title_lines<\/code> \u2013 Clamp titles to this many lines, 0 to 5. 0 shows the full title.<\/li>\n<li><code>excerpt_lines<\/code> \u2013 Clamp excerpts to this many lines, 0 to 8.<\/li>\n<\/ul>\n\n<p><strong>Wrapper<\/strong><\/p>\n\n<ul>\n<li><code>class<\/code> \u2013 Extra class names on the wrapper.<\/li>\n<li><code>id<\/code> \u2013 A specific HTML id, useful for anchor links.<\/li>\n<\/ul>\n\n<p><strong>Examples<\/strong><\/p>\n\n<pre><code>[mm_post_grid columns=\"4\" posts_per_page=\"12\" pagination=\"numbers\"]\n\n[mm_post_grid category=\"news,events\" show_excerpt=\"no\" title_tag=\"h2\"]\n\n[mm_post_grid post_type=\"portfolio\" taxonomy=\"project_type\" terms=\"print\" image_ratio=\"1-1\"]\n\n[mm_post_grid posts_per_page=\"9\" pagination=\"load_more\" button_style=\"button\"]\n\n[mm_post_grid card_layout=\"overlay\" columns=\"2\" image_ratio=\"4-3\" title_lines=\"2\"]\n\n[mm_post_grid card_layout=\"horizontal\" columns=\"1\" term_style=\"badge\"]\n<\/code><\/pre>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>mm-post-grid<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP through <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open <strong>Post Grid<\/strong> in the admin menu to set your defaults.<\/li>\n<li>Add <code>[mm_post_grid]<\/code> to any post, page, template or widget area.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20my%20theme%3F\"><h3>Does it work with my theme?<\/h3><\/dt>\n<dd><p>That is the main design goal. The grid never sets a font family, never styles a global element, and scopes everything to its own wrapper. If your theme does something unusual you can turn the stylesheet off completely on the Advanced tab and write your own.<\/p><\/dd>\n<dt id=\"does%20it%20need%20a%20page%20builder%20or%20block%20editor%3F\"><h3>Does it need a page builder or block editor?<\/h3><\/dt>\n<dd><p>No. It is a shortcode, so it works in the block editor Shortcode block, in the classic editor, in a widget, or in a template through <code>do_shortcode()<\/code>.<\/p><\/dd>\n<dt id=\"what%20do%20the%20styling%20templates%20change%3F\"><h3>What do the styling templates change?<\/h3><\/dt>\n<dd><p>Only the values on the Styling tab. Posts, columns, pagination and card content are never touched. A template is a starting point, not a mode: after applying one you can change any value, and the Templates tab shows the styling as custom from then on.<\/p><\/dd>\n<dt id=\"why%20is%20the%20pagination%20not%20using%20my%20card%20colours%3F\"><h3>Why is the pagination not using my card colours?<\/h3><\/dt>\n<dd><p>Pagination and the load more button sit on your page rather than on a card, so they use the button colours and inherit your theme text colour. That way a dark card template never makes them unreadable on a light page.<\/p><\/dd>\n<dt id=\"is%20there%20a%20gutenberg%20block%3F\"><h3>Is there a Gutenberg block?<\/h3><\/dt>\n<dd><p>Not in 0.1. Rendering is fully separated from the shortcode internally, so a block is planned as a thin addition without changing any output.<\/p><\/dd>\n<dt id=\"can%20i%20show%20a%20custom%20post%20type%3F\"><h3>Can I show a custom post type?<\/h3><\/dt>\n<dd><p>Yes. Set the default on the settings screen, or pass <code>post_type=\"portfolio\"<\/code>. Several types work too: <code>post_type=\"post,page\"<\/code>.<\/p><\/dd>\n<dt id=\"can%20i%20use%20more%20than%20one%20grid%20on%20the%20same%20page%3F\"><h3>Can I use more than one grid on the same page?<\/h3><\/dt>\n<dd><p>Yes, including several paginated grids. Each grid gets its own page query variable so they do not move together.<\/p><\/dd>\n<dt id=\"does%20load%20more%20work%20without%20javascript%3F\"><h3>Does Load More work without JavaScript?<\/h3><\/dt>\n<dd><p>The button is a real link to the next page. Without JavaScript, clicking it loads the next page normally.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20my%20site%20down%3F\"><h3>Will it slow my site down?<\/h3><\/dt>\n<dd><p>The stylesheet is small and only loads where a grid renders. Featured image data is preloaded in one query to avoid a query per card, and the row count query is skipped when pagination is off.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20settings%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens to my settings when I delete the plugin?<\/h3><\/dt>\n<dd><p>Nothing is removed unless you ask for it. Tick the option on the Advanced tab before deleting if you want the settings row gone.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li><code>[mm_post_grid]<\/code> shortcode with per grid attribute overrides.<\/li>\n<li>Tabbed settings screen: General, Content, Templates, Styling and Advanced.<\/li>\n<li>Seven styling templates applied with one click, extendable through the <code>mmpg_templates<\/code> filter.<\/li>\n<li>Three card layouts, four hover effects, three image hover effects, category badges, outline buttons, line clamping and pagination alignment.<\/li>\n<li>Four pagination modes, including a progressively enhanced Load More.<\/li>\n<li>Responsive column control for desktop, tablet and mobile.<\/li>\n<li>Styling through CSS custom properties, with an option to disable the stylesheet.<\/li>\n<li>Full set of filters and actions for developers.<\/li>\n<li>Translation ready, ships with a POT file.<\/li>\n<\/ul>","raw_excerpt":"A clean, lightweight and responsive post grid shortcode that looks right on virtually any WordPress theme.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/378136","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=378136"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mmwebnet"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=378136"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=378136"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=378136"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=378136"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=378136"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=378136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}