A Joomla site module that displays public Instagram posts through Instagram’s official embed. No API key, app registration or account login required.
Version 1.0.0 · Joomla 4.4 / 5 / 6 · PHP 8.1+ · GPLv2+ · by Saint Art Designs
Contents
- Overview
- Requirements
- Installation
- Creating the module
- Using a manual list of posts
- Using an RSS bridge feed
- All configuration options
- Render modes explained
- Styling & CSS customisation
- Caching behaviour
- Troubleshooting
- FAQ
- License
1. Overview
Embed Instagram Posts resolves a list of Instagram post permalinks and renders each one using Instagram’s public embed. Because it never talks to the Instagram Graph API, there is nothing to authenticate: you do not create a Meta app, you do not generate tokens, and there is no token expiry to maintain. The only requirement is that the posts are public.
Permalinks come from one of two sources, selected with the Post source option:
- Manual list – you paste post URLs directly.
- RSS bridge feed – the module fetches an RSS feed and extracts Instagram links from it automatically.
2. Requirements
| Joomla | 4.4, 5.x or 6.x |
|---|---|
| PHP | 8.1 or newer |
| Posts | Must be public (private accounts cannot be embedded). |
| Outbound HTTP | Required only in RSS mode, so the server can retrieve the feed. |
3. Installation
- Log in to the Joomla administrator.
- Go to System → Install → Extensions.
- On the Upload Package File tab, drop
mod_embed_instagram_posts-1.0.0.zipor browse for it. - Wait for the “Installation successful” message.
To update later, install the newer ZIP the same way — the package uses method="upgrade", so it installs over the existing version without losing your settings.
4. Creating the module
- Go to Content → Site Modules and click New.
- Select Embed Instagram Posts from the list.
- Give it a title (or hide the title), choose a Position, and set Status to Published.
- On the Menu Assignment tab, choose where it should appear (all pages or specific menu items).
- Configure the options (below) and click Save.
Helix Ultimate / template positions: a module only renders if its position is actually output by the active template. If you see nothing on the front end, verify the position first – see Troubleshooting.
5. Using a manual list of posts
- Set Post source to Manual list of post URLs.
- In Post URLs, paste one URL per line, for example:
https://www.instagram.com/p/DbC3mk_inwo/
https://www.instagram.com/reel/Cxyz1234abc/
https://www.instagram.com/username/p/DdEf5678ghi/
Post, reel and IGTV (/tv/) URLs are all accepted, with or without the username in the path. Duplicate posts are removed automatically, and the module shows at most Number of posts items.
6. Using an RSS bridge feed
Instagram does not provide RSS itself, so RSS mode relies on a third-party bridge that turns an Instagram profile into an RSS feed (for example RSS.app or FetchRSS). The module then reads that feed and pulls out the Instagram links.
- Create a feed for your Instagram profile in the bridge service.
- Copy the direct feed URL – the one that returns XML. On RSS.app this is the RSS Feed URL and usually ends in
.xml, e.g.https://rss.app/feeds/XXXXXXXX.xml. - Set Post source to RSS bridge feed URL and paste the URL into RSS feed URL.
- Save.
Most common mistake: pasting the feed’s share / preview page link (e.g. https://rss.app/r/feed/…) instead of the direct .xml feed. The preview page returns HTML, not a feed, so the module finds no Instagram links and shows nothing. Always use the URL that ends in .xml.
The module requires the feed items to contain real Instagram permalinks (instagram.com/p/…, /reel/… or /tv/…). Some free bridges rewrite item links to their own redirect domain – if so, the module cannot detect the posts.
7. All configuration options
Source
| Option | Default | Description |
|---|---|---|
| Post source | Manual | Where permalinks come from: manual list or RSS bridge feed. |
| Post URLs | – | Manual mode: one Instagram post/reel/IGTV URL per line. |
| RSS feed URL | – | RSS mode: the direct feed URL (usually ending in .xml). |
| Number of posts | 3 | Maximum posts to display (1–24). |
| Cache time (minutes) | 60 | RSS mode only: how long the fetched feed is cached before refetching (5–10080). |
| Profile URL | – | Optional link to your Instagram profile, used by the follow link. |
Layout
| Option | Default | Description |
|---|---|---|
| Render mode | Iframe | iframe (no external script) or Instagram embed.js. See below. |
| Show captions | Yes | Include the post caption inside each embed (iframe mode). |
| Embed height (px) | 720 | Fixed height of each iframe embed (200–1400). |
| Columns (desktop) | 3 | Grid columns on large screens (≥ 992px). |
| Columns (tablet) | 2 | Grid columns on medium screens (≥ 576px). |
| Columns (mobile) | 1 | Grid columns on small screens. |
| Grid gap (px) | 16 | Spacing between grid items. |
| Follow link text | – | Text for a link below the grid. Requires a Profile URL; leave empty to hide. |
| Load module CSS | Yes | Load the bundled responsive-grid stylesheet. Turn off to style from your template. |
Advanced
Standard Joomla module options are available too: alternative Layout, Module Class Suffix, module tag, Bootstrap size, header tag/class and module style (chrome).
8. Render modes explained
Iframe (recommended)
Each post is embedded in its own <iframe> pointing at Instagram’s /embed/ endpoint. No third-party JavaScript is loaded into your page, embeds are isolated from your site, and the height is fixed by the Embed height option.
Instagram embed.js
Posts are rendered as Instagram’s official blockquote cards, enhanced by Instagram’s embed.js script loaded from instagram.com. This produces the familiar rich card and auto-sizes to content, but it does load remote JavaScript from Meta.
9. Styling & CSS customisation
The bundled stylesheet lays posts out in a responsive CSS grid driven by CSS custom properties. The module wrapper uses the class eip; the grid, items, embeds, follow link and notice use eip-grid, eip-item, eip-embed, eip-follow and eip-notice.
To override styles from your template, target those classes, for example:
.eip-embed { border-radius: 16px; }
.eip-grid { gap: 24px; }
.eip-follow a { font-weight: 700; }
If you prefer to control everything yourself, set Load module CSS to No and add your own rules. You can also add a Module Class Suffix to scope your CSS to a single module instance.
10. Caching behaviour
In RSS mode the fetched feed is cached per module instance under Joomla’s cache directory for the number of minutes set in Cache time. This avoids querying the bridge on every page view. If a refresh fails, the module keeps serving the last successful set of posts and, for logged-in administrators only, shows a small notice that cached content is being used. Manual mode does not fetch anything, so it is not cached.
11. Troubleshooting
Nothing appears on the page
- Check the module position. The most common cause. Enable Preview Module Positions in Templates → Options, then open your page with
?tp=1appended to the URL. If the assigned position outline does not appear, the template does not output that position there – move the module to a position that is rendered. - Check Menu Assignment. Make sure the module is assigned to the page you are viewing.
- View the page as a Super User. Configuration errors (bad feed, no URLs) are shown only to administrators, as a warning box. Visitors just see nothing, by design.
- Read the module log. Problems are written to
administrator/logs/mod_embed_instagram_posts.phpwith the exact reason (HTTP code, empty body, or “Feed contained no Instagram permalinks”).
RSS mode shows nothing
- Confirm you used the direct
.xmlfeed URL, not the bridge’s share/preview page. - Open the feed URL in a browser and check the items actually link to
instagram.com/p/…. - Make sure your host allows outbound HTTP requests.
- Clear the module cache (or wait for Cache time to expire) after fixing the URL.
An embed shows a blank/empty box
That specific post is probably deleted, private, or region-restricted. Replace it, or switch the account/post to public.
12. FAQ
Do I need an Instagram or Meta developer account?
No. The module uses Instagram’s public embed only. There is no API key or token.
Will it show a private account’s posts?
No. Only public posts can be embedded.
How do I keep posts updating automatically?
Use RSS mode with a bridge feed. New posts in the feed appear after the cache expires.
Can I put several instances on one page?
Yes. Each module instance has its own settings and its own cache.
13. License
Embed Instagram Posts is free software released under the GNU General Public License, version 2 or later (GPLv2+); the full text is in LICENSE.txt in the package. It is provided without warranty of any kind.
Instagram is a trademark of Meta Platforms, Inc. This extension is independent and is not affiliated with, endorsed by, or sponsored by Meta; it uses only Instagram’s publicly documented embed feature.
Developed and maintained by Saint Art Designs.


