Panth Blog for Magento 2
Ship a real blog on Magento 2, not a Page Builder kludge. Panth Blog is a production-grade content engine with hierarchical categories, tags, multi-author profiles, threaded comments, BlogPosting/Person/BreadcrumbList/FAQPage/HowTo JSON-LD schema, llms.txt + Markdown export fo...
Key Features:
- Full JSON-LD schema graph (BlogPosting, Person, Breadcrum...
- AI-ready integration via llms.txt, llms.json, and per-pos...
- Automatic IndexNow pinging to Bing + Yandex on publish, u...
- RSS 2.0 + Atom 1.0 feeds
Additional Services
Everything in the box
Built-in from day one. No add-ons, no upsell, no licence keys to renew.
AI-ready integration via llms.txt, llms.json, and per-pos...
Automatic IndexNow pinging to Bing + Yandex on publish, u...
RSS 2.0 + Atom 1.0 feeds
site-wide, per-category, per-tag, per-author variants, cached with TTL
Overview
Panth Blog is a content publishing module for Magento 2 and Adobe Commerce that adds posts, categories, tags, and authors with clean URLs, GraphQL APIs, and Hyva-ready storefront components.
The Panth Blog module gives merchants a full editorial workflow without a separate CMS. Authors compose posts in a TinyMCE-powered admin grid that mirrors the native Magento UI — sticky headers, inline filters, mass actions, bookmark profiles, and per-column visibility — so the learning curve is zero for any admin who already runs the product grid. Sample-content seeding creates five posts, categories, tags, and authors on demand, and re-running the seeder is idempotent.
A custom router resolves canonical paths without query strings, and the schema layer emits BlogPosting JSON-LD so Google can extract titles, authors, and publish dates. Frontend rendering works on Hyva and Luma without theme edits, and the GraphQL and REST endpoints let headless storefronts consume the same data the synchronous templates do. Tags and categories each get their own indexable archive page, and the sitemap generator publishes every post URL so newly written content reaches Google within one crawl cycle.
Best for:
- Magento merchants who want a content hub without bolting on WordPress.
- Headless and Hyva storefronts that need GraphQL blog data.
- SEO teams shipping BlogPosting schema for organic visibility.
Why Panth Blog
Most Magento blog extensions are a checkbox feature — a CMS-page wrapper with a WYSIWYG editor and a category filter. Panth Blog is built for stores that take content seriously as a growth channel:
- SEO out of the box — every post emits valid
BlogPostingJSON-LD with author, breadcrumbs, FAQs, and HowTo schema. No Yoast / Rank Math plugin needed. - AI-search ready — first-class integration with
Panth_LlmsTxtexposes blog posts to ChatGPT, Claude, and Perplexity via/llms.txt,/llms-full.txt, and/llms.json. - IndexNow auto-ping — published posts notify Bing and Yandex within 5 minutes; manual ping CLI command included.
- Hyva + Luma — the storefront is Hyva first (Tailwind + Alpine.js, no jQuery on Hyva), with a complete Luma stylesheet (no Tailwind dependency) so the design renders identically on both.
- Strict DI, additive schema, idempotent installs — production-grade engineering: no
ObjectManagercalls anywhere, schema changes are backward-compatible,setup:upgradeis safe to re-run. - Markdown import/export — write posts in your editor of choice; YAML frontmatter is supported by the CLI importer and the public
/blog/<slug>.mdendpoint. - Native REST + GraphQL — full CRUD via REST, read-only GraphQL for headless storefronts.
What you get
Panth Blog ships a complete content stack — admin grids, schema, APIs, and storefront templates.
- Posts, categories, tags, and authors with TinyMCE-powered admin editing.
- Clean canonical URLs with no query strings via a custom router.
- BlogPosting JSON-LD schema for Google rich result eligibility.
- GraphQL and REST APIs for headless and PWA storefronts.
- Hyva and Luma storefront templates with no theme edits required.
Key Features
Content Management
- Posts — title, URL key, short description, full HTML / WYSIWYG content, featured image, OG image, meta SEO fields, layout template variant, per-store overrides
- Categories — hierarchical (up to 3 levels), banner image, sort order, per-category posts-per-page and template (grid / list / magazine) override, denormalised post-count cache
- Tags — flat, lightweight, auto-created from post-edit form; thin-content guard auto-flips tags with
< Nposts tonoindex,follow - Authors — display name, role, short + long bio, avatar, email, social links JSON,
Person.knowsAbout,Person.alumniOf,Person.sameAsarrays for schema - Comments — threaded (1 level), pending/approved/spam/trash workflow, IP rate limit hooks, captcha hooks (math / Turnstile / hCaptcha / reCAPTCHA), nofollow injection on external links — disabled by default in v1
- Related posts — manual override + auto-suggest based on category overlap + recency
- Multi-store — per-store post visibility, per-store title/description/content overrides
- URL history — slug changes are tracked; 404 hits auto-redirect 301 to the new URL
SEO & Structured Data
- JSON-LD per page type:
/blog→Blog+BreadcrumbList/blog/<slug>→BlogPosting+Person(author) +BreadcrumbList+ optionalFAQPage+ optionalHowTo/blog/category/<slug>→CollectionPage+BreadcrumbList/blog/tag/<slug>→CollectionPage+BreadcrumbList/blog/author/<slug>→ProfilePage+Person+BreadcrumbList- OG + Twitter meta —
og:type=article,og:title,og:description,og:image(1200×630),og:url,article:published_time,article:modified_time,article:author,article:section,article:tag, full Twitter Card markup - Meta tags — per-post
meta_title,meta_description,meta_keywords,meta_robots,canonical_urloverrides - Title template — admin-configurable with tokens
{{post.title}},{{post.meta_title}},{{post.category}},{{post.author}} - Hreflang group — auto-seeded
blog-postsgroup forPanth_Hreflangintegration - Sitemap integration — contributor class for
Panth_XmlSitemapemits posts, categories, active tags, and authors intositemap-blog-1.xmlwith properlastmodandpriority - HTML sitemap — contributor for
Panth_HtmlSitemapadds a Blog section to the human-readable sitemap - rel=prev/next + canonical URLs on paginated archives
AEO (Answer Engine Optimization)
- TL;DR auto-extraction — first 80–120 words of post body auto-populated to
tldr_summaryon save when admin field is empty; rendered as an<aside data-aeo="tldr">callout above the article - Table of contents — auto-built from
<h2>and<h3>headings with anchor IDs; sticky on desktop, drawer on mobile - HowTo schema — auto-detected from numbered
<h2>steps (e.g.<h2>1. First step</h2>); admin toggle - FAQPage schema — inline FAQ widget integration via
Panth_FaqaddsFAQPageJSON-LD to the post graph - Citation footnotes —
citation_listJSON column rendered as numbered references at post foot; emitted asWebPage.citationschema - Reading time — auto-computed from word count + admin
reading_speed_wpmsetting
AIO (AI Indexing)
- llms.txt integration — when
Panth_LlmsTxtis installed, blog posts are injected into/llms.txtand/llms-full.txtvia the bundledBuilderPlugin; admin toggle +max_postssetting - llms.json integration — structured blog section added to
/llms.jsonfor AI agent indexers - Markdown export endpoint —
/blog/<slug>.mdreturns the post as plain markdown with YAML frontmatter,Content-Type: text/markdown; charset=utf-8 - AI bot allow-list — configurable list of bot user-agents (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, ChatGPT-User) surfaced via
Helper\Config::getAiBotsAllowed()forPanth_RobotsSeointegration
GEO (Generative Engine Optimization)
- IndexNow auto-ping — observer queues post URL on transition to
published; cron drains the queue every 5 minutes; configurable batch size; falls back to direct API POST ifPanth_IndexNowis absent - Per-event flags —
notify_on_publish,notify_on_update,notify_on_deleteadmin toggles - Manual ping CLI —
panth:blog:indexnow:ping --post-id=N
Feeds & Discovery
- RSS 2.0 —
/blog/feed.xmlsite-wide;/blog/feed/category/<slug>.xml,/blog/feed/tag/<slug>.xml,/blog/feed/author/<slug>.xml(per-type toggles) - Atom 1.0 —
/blog/feed/atom.xml - Full or partial content — toggle
<content:encoded>per feed - RFC 822 timestamps,
<dc:creator>,<media:content>,<atom:link rel="self"> - Cached —
panth_blog_feedcache type with configurable TTL; warmed by cron - Feed discovery —
<link rel="alternate" type="application/rss+xml">in every blog page<head>
Storefront UX
- Responsive grid — 1 column under 768px, 2 columns 768–1023px, 3 columns ≥1024px
- Featured post block — first post on page 1 rendered in a 2-column horizontal hero card
- Hyva theme — Tailwind utilities + Alpine.js for TOC, search, subscribe
- Luma theme — comprehensive
pb-*BEM stylesheet (no Tailwind dependency); same visual design as Hyva - Sticky TOC on desktop, drawer on mobile
- Pagination — pill buttons with active state, ellipsis for large page counts, prev/next +
rel="prev/next"head links - Breadcrumbs — Home > Blog > Category > Post, with
BreadcrumbListJSON-LD - Share buttons — Twitter, LinkedIn, Copy URL pill buttons
- Sidebar widgets — Search, Recent posts, Categories, Tag cloud (size-scaled by post_count), Subscribe, RSS link
Developer Experience
- Strict DI — zero
ObjectManagercalls, constructor property promotion throughout - PHP 8.1+ — readonly properties, named arguments, match expressions
- Type-safe contracts —
declare(strict_types=1)on every file; full type hints - REST API —
/V1/panth-blog/posts,/V1/panth-blog/categories,/V1/panth-blog/tags,/V1/panth-blog/authors(CRUD) - GraphQL —
panthBlogPosts,panthBlogPost(id|urlKey),panthBlogCategories,panthBlogTags,panthBlogAuthors(read-only) - CLI commands — 8 commands for URL rewrite rebuild, count refresh, OG image generation, post import/export, IndexNow ping, tag auto-robots, demo seeder
- Cron jobs — 6 jobs: publish-scheduled, refresh-counts, warm-feed-cache, drain-indexnow-queue, archive-stale-drafts, daily heartbeat
- Optional integrations — every cross-module hook is
class_exists-guarded so the module runs cleanly whether or not the sibling Panth_* module is installed
Admin Management
- Manage Posts —
Panth Infotech → Blog → Manage Posts— full CRUD with featured-image upload, WYSIWYG content, multi-tab form (Content / Categorisation / Publishing / SEO / AEO), mass-delete, status toggle, duplicate-post action - Manage Categories —
Panth Infotech → Blog → Manage Categories— hierarchical tree, banner image, per-category template + posts-per-page overrides - Manage Tags —
Panth Infotech → Blog → Manage Tags— flat list with post-count and robots column - Manage Authors —
Panth Infotech → Blog → Manage Authors— display name, role, avatar, bio, social links JSON,knowsAbout/alumniOf/sameAsschema fields - Manage Comments —
Panth Infotech → Blog → Manage Comments— moderation grid with bulk approve/spam, IP and user-agent visible, status workflow
All admin grids use Magento UI components with sticky header, inline filters, mass actions, per-column sort, bookmark profiles, and configurable column visibility, in the canonical full-width 1-column admin layout.
JSON-LD Schema (SEO)
Every blog page emits Google-valid structured data as JSON-LD. Example for a single post:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "BlogPosting",
"@id": "https://example.com/blog/getting-started-with-hyva#article",
"headline": "Getting started with Hyva",
"description": "A practical walkthrough of installing Hyva and shipping your first storefront tweak.",
"image": ["https://example.com/media/blog/featured/hyva.jpg"],
"datePublished": "2026-05-18T12:00:00+00:00",
"dateModified": "2026-05-18T12:00:00+00:00",
"wordCount": 850,
"timeRequired": "PT4M",
"articleSection": "Hyva",
"keywords": "tailwind, magento-2.4.8",
"author": {"@id": "https://example.com/blog/author/jane-doe#person"},
"mainEntityOfPage": {"@type": "WebPage", "@id": "https://example.com/blog/getting-started-with-hyva"}
},
{
"@type": "Person",
"@id": "https://example.com/blog/author/jane-doe#person",
"name": "Jane Doe",
"jobTitle": "Senior Editor",
"knowsAbout": ["Magento", "Hyva", "Performance"]
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/"},
{"@type": "ListItem", "position": 2, "name": "Blog", "item": "https://example.com/blog"},
{"@type": "ListItem", "position": 3, "name": "Hyva", "item": "https://example.com/blog/category/hyva"},
{"@type": "ListItem", "position": 4, "name": "Getting started with Hyva", "item": "https://example.com/blog/getting-started-with-hyva"}
]
}
]
}
FAQPage is added when the inline FAQ widget (Panth_Faq) is present on the page; HowTo is added when numbered H2 steps are detected. All schema emission is gated by admin toggles and validates against Google's Rich Results Test.
AI Integration (llms.txt + IndexNow)
llms.txt
When Panth_LlmsTxt is installed, Panth Blog injects a ## Blog Posts section into /llms.txt and /llms-full.txt via the bundled plugin:
## Blog Posts
Latest articles from this site.
- [Getting started with Hyva](/blog/getting-started-with-hyva) — A practical walkthrough of installing Hyva and shipping your first storefront tweak.
- [Core Web Vitals for Magento in 2026](/blog/core-web-vitals-2026) — INP replaced FID. Here is what to measure and how to fix the common Magento regressions.
...
The number of posts surfaced is configurable via panth_blog/aio/llms_txt_max_posts (default 50). When disabled per store via panth_blog/aio/llms_txt_include=0, the section is silently omitted.
A structured blog section is also added to /llms.json for AI agent indexers — each entry includes url, label, summary, and published_at metadata.
IndexNow
The Observer/PostSaveAfter.php observer queues post URLs into the panth_blog_indexnow_queue table when a post transitions to published. The Cron/NotifyIndexNow.php job drains the queue every 5 minutes, in configurable batches, with Panth_IndexNow integration or direct API POST fallback.
Manual ping:
bin/magento panth:blog:indexnow:ping --post-id=2
RSS / Atom Feeds
Panth Blog ships six feed endpoints, all RFC-compliant and cached via the panth_blog_feed cache type:
| Endpoint | Format | Scope |
|---|---|---|
/blog/feed.xml |
RSS 2.0 | Site-wide latest N posts |
/blog/feed/atom.xml |
Atom 1.0 | Site-wide latest N posts |
/blog/feed/category/<slug>.xml |
RSS 2.0 | Per category |
/blog/feed/tag/<slug>.xml |
RSS 2.0 | Per tag |
/blog/feed/author/<slug>.xml |
RSS 2.0 | Per author |
/blog/feed/comments.xml |
RSS 2.0 | Latest 25 approved comments (when comments enabled) |
Each <item> includes <title>, <link>, <guid isPermaLink="true">, <description> (CDATA), optional <content:encoded>, <pubDate> (RFC 822), <dc:creator>, <category>, optional <media:content>. Standard namespaces: xmlns:content, xmlns:dc, xmlns:media, xmlns:atom.
Cache TTL, posts-per-feed, full vs partial content, and per-type feed toggles are all admin-configurable.
Markdown Export
Every published post is reachable as plain markdown at /blog/<slug>.md with Content-Type: text/markdown; charset=utf-8. The output includes YAML frontmatter:
---
title: "Getting started with Hyva"
url_key: getting-started-with-hyva
published_at: 2026-05-18 12:00:00
---
> A practical walkthrough of installing Hyva and shipping your first storefront tweak.
## Why Hyva
Hyva is a Tailwind-based front-end for Magento that replaces the Luma + RequireJS stack with a leaner runtime.
...
Disable per store via panth_blog/aio/markdown_export_enabled=0.
Compatibility
| Requirement | Versions Supported |
|---|---|
| Magento Open Source | 2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8 |
| Adobe Commerce | 2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8 |
| Adobe Commerce Cloud | 2.4.4 — 2.4.8 |
| PHP | 8.1.x, 8.2.x, 8.3.x, 8.4.x |
| Hyva Theme | 1.3+ (Tailwind + Alpine.js) |
| Luma Theme | Native support (BEM stylesheet, no Tailwind dependency) |
| Panth_Core | ^1.0 (installed automatically) |
Tested on:
- Magento 2.4.8-p2 with PHP 8.2 + Hyva 1.4.5
- Magento 2.4.8-p2 with PHP 8.2 + Luma
Installation
Composer Installation (Recommended)
composer require mage2kishan/module-blog
bin/magento module:enable Panth_Blog
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento setup:static-content:deploy -f
bin/magento cache:flush
Manual Installation via ZIP
- Download the latest release ZIP from Packagist or the Adobe Commerce Marketplace
- Extract to
app/code/Panth/Blog/in your Magento installation - Run the same commands as above starting from
bin/magento module:enable Panth_Blog
Verify Installation
bin/magento module:status Panth_Blog
# Expected output: Module is enabled
After installation, navigate to:
Admin → Stores → Configuration → Panth → Blog
Admin → Panth Infotech → Blog → Manage Posts
Admin → Panth Infotech → Blog → Manage Categories
Admin → Panth Infotech → Blog → Manage Tags
Admin → Panth Infotech → Blog → Manage Authors
Admin → Panth Infotech → Blog → Manage Comments
Optional: Seed Demo Data
bin/magento panth:blog:seed:demo
This creates 5 sample posts, 5 categories, 5 tags, and 5 authors — useful for trying the module before adding real content. Idempotent: re-running prints "already exists" instead of duplicating.
Configuration
Navigate to Stores → Configuration → Panth → Blog.
| Group | Key Settings |
|---|---|
| General | Enable/disable module, route front name, blog index title + meta description, hero text, posts per page, reading speed (wpm), show reading time, show author bio, show share buttons |
| Display | Show TOC, related posts count, default category template (grid/list/magazine), sidebar widget toggles (categories, tag cloud, search) |
| RSS / Atom Feeds | Enable feeds, posts per feed, include full content in feed, per-category/tag/author feed toggles, cache TTL |
| SEO | Title template with tokens, fallback meta description, tag thin-content threshold |
| AEO | TL;DR auto-extract, HowTo auto-detect |
| AIO | Include in llms.txt, max posts in llms.txt blog section, include in llms-full.txt, Markdown export endpoint, AI bots allow-list |
| IndexNow | Enable IndexNow notifications, notify on publish/update/delete, batch size |
| Comments | Enable comments (default: disabled), auto-approve registered customers, threading, captcha provider, nofollow on external links |
All settings are store-view scoped where applicable; comma-separated lists like the AI bot allow-list are parsed into arrays by Helper\Config.
License
Proprietary © Panth Infotech. All rights reserved. See LICENSE.txt for details.
URL Structure
Clean URLs throughout — no query strings on canonical paths. The custom router resolves all of these:
| Path | Page |
|---|---|
/blog |
Index — featured post + grid |
/blog/page/2 |
Paginated index |
/blog/<slug> |
Single post |
/blog/<slug>.md |
Markdown export of single post |
/blog/category/<slug> |
Category landing |
/blog/category/<slug>/page/2 |
Paginated category |
/blog/tag/<slug> |
Tag landing |
/blog/author/<slug> |
Author profile + their posts |
/blog/search?q=keyword |
Search results |
/blog/feed.xml |
RSS 2.0 site-wide feed |
/blog/feed/atom.xml |
Atom 1.0 site-wide feed |
/blog/feed/category/<slug>.xml |
Per-category RSS |
/blog/feed/tag/<slug>.xml |
Per-tag RSS |
/blog/feed/author/<slug>.xml |
Per-author RSS |
The route front name (blog by default) is configurable in admin. Changing it cleanly switches the entire URL hierarchy — pagination, canonical URLs, feed discovery, and inner-page links all follow.
CLI Commands
# Rebuild URL rewrites for all blog entities
bin/magento panth:blog:url-rewrite:rebuild
# Recompute denormalised post counts (categories + tags)
bin/magento panth:blog:counts:refresh
# Export a post as markdown to stdout
bin/magento panth:blog:post:export --post-id=2 --format=markdown > post.md
# Import a markdown file with YAML frontmatter as a new post
bin/magento panth:blog:post:import path/to/post.md
# Queue an IndexNow ping for a single post
bin/magento panth:blog:indexnow:ping --post-id=2
# Apply tag thin-content robots flip globally
bin/magento panth:blog:tags:auto-robots
# Generate OG images (stub in v1 — wired for future Python integration)
bin/magento panth:blog:og-images:generate [--post-id=N]
# Seed 5 demo authors / categories / tags / posts (idempotent)
bin/magento panth:blog:seed:demo
Cron Jobs
| Job | Schedule | Purpose |
|---|---|---|
panth_blog_publish_scheduled |
every 5 min | Flip scheduled posts to published when published_at <= NOW() |
panth_blog_refresh_post_counts |
nightly 03:30 | Recompute denormalised post counts on categories + tags; apply tag thin-content robots |
panth_blog_warm_feed_cache |
hourly :15 | Regenerate RSS / Atom feeds and store in panth_blog_feed cache |
panth_blog_notify_indexnow |
every 5 min | Drain IndexNow queue (publishes accumulated since last run) |
panth_blog_archive_stale_drafts |
weekly Sun 05:00 | Move drafts older than 180 days to archived |
panth_blog_heartbeat |
daily 08:00 | Install reporter heartbeat (suppressed when Panth_Core consolidates pings) |
REST & GraphQL APIs
REST endpoints
GET /V1/panth-blog/posts — list (anonymous)
GET /V1/panth-blog/posts/:id — single by ID (anonymous)
POST /V1/panth-blog/posts — create (admin token)
PUT /V1/panth-blog/posts/:id — update (admin token)
DELETE /V1/panth-blog/posts/:id — delete (admin token)
# Same shape for /V1/panth-blog/categories, /V1/panth-blog/tags, /V1/panth-blog/authors
GraphQL queries (read-only)
{
panthBlogPosts(filter: {category_url_key: "hyva"}, pageSize: 10, currentPage: 1) {
items {
post_id
url_key
title
short_description
featured_image
published_at
reading_time_min
author_id
}
total_count
page_info { current_page page_size total_pages }
}
panthBlogPost(urlKey: "getting-started-with-hyva") {
post_id title content tldr_summary word_count
}
panthBlogCategories { category_id url_key name post_count }
panthBlogTags { tag_id url_key name post_count }
panthBlogAuthors { author_id url_key display_name role short_bio }
}
Need this customised?
Talk to Kishan directly — written quote, scope and timeline within 24 hours. No sales call.
Panth Blog for Magento 2