NeoEPG – Modern TV Schedule & EPG Plugin
A professional Electronic Programme Guide plugin for WordPress. Manage channels, import schedules, and display beautiful guides with 6 templates, live Now on Air widget, push notifications, and full REST API.
Introduction
NeoEPG – Modern TV Schedule is a professional WordPress plugin for building and displaying electronic program guides (EPG). Whether you run a TV station website, a streaming service, a radio network, or any site that publishes schedules, this plugin gives you a complete, flexible, and beautiful solution.
Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| WordPress | 6.2 | 6.5+ |
| PHP | 7.4 | 8.1+ |
| MySQL / MariaDB | 5.7 / 10.3 | 8.0+ / 10.6+ |
| Elementor Optional | 3.0 | 3.18+ |
| Server memory | 128 MB | 256 MB+ |
Installation
Method 1 — WordPress Admin (Recommended)
- Log in to your WordPress admin and go to Plugins → Add New.
- Click Upload Plugin and choose the ZIP file you downloaded.
- Click Install Now, then Activate Plugin.
- A new NeoEPG menu appears in the left sidebar.
Method 2 — FTP / SFTP
- Extract the ZIP file on your computer.
- Upload the folder
tv-schedule-modern-epg-systemto/wp-content/plugins/via FTP. - In WordPress admin go to Plugins and activate NeoEPG – Modern TV Schedule.
tvsmepg_channels, tvsmepg_programs, tvsmepg_import_feeds, and tvsmepg_import_logs. No manual database setup is required.First Steps
After activation, follow this quick-start path to get your first schedule live in under 10 minutes.
- Add your first channel — go to NeoEPG → Channels, fill in the name, upload a logo URL, pick a brand color, and save.
- Add programs — go to NeoEPG → Programs, select the channel, set title, start time, and end time. Repeat for your schedule.
- Place the shortcode — create or edit any WordPress page and paste
[tvsmepg]. Publish the page. - Preview — visit the page on the frontend. You'll see a Timeline EPG with today's schedule.
- Customize — use the Display Builder or Elementor widget to choose a different template, filter channels, or adjust layout.
Managing Channels
Go to NeoEPG → Channels to add and manage channels.
| Field | Description |
|---|---|
| Name | Display name of the channel. Shown in all templates. |
| Slug | URL-friendly identifier. Auto-generated from name if left empty. Used in shortcode channels="" attribute. |
| Logo URL | Full URL to the channel logo image (PNG recommended, transparent background). Shown in timeline, list, compact templates. |
| Color | Brand color used for highlights, progress bars, and the fallback initials badge when no logo is set. |
| Sort Order | Numeric sort position. Lower numbers appear first. Channels with the same number are sorted alphabetically. |
| Status | active or inactive. Inactive channels are hidden everywhere. |
| Visible | Whether the channel appears on the frontend. Useful to hide a channel temporarily without deleting it. |
Managing Programs
Go to NeoEPG → Programs to add, edit, search, and delete programs. Each program belongs to exactly one channel.
Core Fields
| Field | Required | Description |
|---|---|---|
| Channel | ✅ | The channel this program airs on. |
| Title | ✅ | Program title shown in all templates. |
| Start / End datetime | ✅ | Format: YYYY-MM-DD HH:MM:SS. End must be after start. |
| Description | — | Full program description. Shown in modal popups and search results. |
| Image URL | — | Program thumbnail shown in cards and search results. |
| Category | — | Genre / category (e.g. News, Sport, Movie). Used in search and export. |
| Episode title | — | Sub-title for series episodes. |
| Season / Episode | — | Numeric season and episode numbers. Exported in XMLTV format. |
| Presenter | — | Host or presenter name. Searchable. |
| Trailer URL | — | YouTube or video URL for the program trailer. |
Badges
Badges are visual flags shown on program cards:
- LIVE — marks a live broadcast.
- Replay — marks a repeated or catch-up broadcast.
- 18+ — adult content warning.
All badges can be toggled in Design Settings to show or hide them site-wide. They can also be disabled per-shortcode with show_badges="no".
Import
Go to NeoEPG → Imports to import your schedule from a file. Supported formats: CSV, JSON, XML, and XMLTV.
Import Process
- Download a template file from the dashboard (CSV, JSON, or XML template buttons) to see the exact expected structure.
- Prepare your data file and upload it on the Imports page.
- Use the field mapping step to match your file's columns/keys to plugin fields.
- Preview the import before confirming. Duplicates are automatically detected and skipped.
- Confirm the import. Results show created, updated, skipped, and error counts.
CSV Format
The CSV importer expects a header row. Required columns: channel_id (or channel_name), title, start_datetime, end_datetime. All other columns are optional and can be mapped in the field mapper.
channel_id,title,start_datetime,end_datetime,category,description
1,Morning News,2026-04-10 07:00:00,2026-04-10 08:00:00,News,Today's top stories
1,Breakfast Show,2026-04-10 08:00:00,2026-04-10 10:00:00,Entertainment,
XMLTV Format
XMLTV is the industry-standard format used by most EPG data providers. The importer reads standard <channel> and <programme> elements including episode-num in both xmltv_ns and onscreen systems.
API Feeds
Go to NeoEPG → API Feeds to configure automatic schedule synchronization from external sources. This eliminates the need for manual imports.
Supported Feed Types
- XMLTV — standard EPG feed format from providers like Gracenote, SchedulesDirect, or self-hosted sources.
- JSON — custom JSON endpoint following the plugin's expected structure.
- CSV — CSV endpoint (URL that returns a CSV file).
Sync Schedule
Each feed can be set to sync automatically using WordPress cron:
- Manually — sync only when you click "Sync Now".
- Hourly — runs every hour via WP-Cron.
- Daily — runs once per day.
- Twice daily — runs at 00:00 and 12:00.
wp-cron.php every hour for reliable sync timing.EPG Catalog
The EPG Catalog is a built-in library of pre-configured XMLTV feeds covering 79 countries, sourced from iptv-epg.org. Every entry has its field mapping already configured — no manual setup is required.
Accessing the Catalog
Go to NeoEPG → API Feeds. Scroll past the "Saved feeds" table to find the EPG Catalog — 79 Countries section. Each country is displayed as a card with its flag, name, and an Activate button. Countries whose feed is already saved show a green ✓ Active indicator instead.
Activating a Feed
- Find the country you want in the catalog grid.
- Click Activate. The feed is immediately saved to your API Feeds list with correct field mapping pre-applied.
- A confirmation notice confirms the feed was added.
- In the Saved feeds table, click Sync now on the new feed to run an immediate import.
- To schedule automatic updates, click Edit, enable Auto sync, choose an interval, and save.
Pre-configured Field Mapping
All catalog feeds use the standard XMLTV attribute names. The following mapping is applied automatically on activation:
| Remote field | Maps to |
|---|---|
start | Start datetime |
stop | End datetime |
channel | Channel |
title | Title |
desc | Description |
Default Options
Catalog feeds are activated with the following options pre-set:
- Skip duplicates — on
- Auto-create channels — on (channels from the feed are created automatically if they don't exist yet)
- Incremental sync — on (imports only the rolling window: past 6 hours + next 3 days)
- Auto sync — off by default (enable it manually after reviewing the feed)
Countries Covered
Albania, Argentina, Armenia, Australia, Austria, Belarus, Belgium, Bolivia, Bosnia & Herzegovina, Brazil, Bulgaria, Canada, Chile, Colombia, Costa Rica, Croatia, Czech Republic, Denmark, Dominican Republic, Ecuador, Egypt, El Salvador, Finland, France, Georgia, Germany, Ghana, Greece, Guatemala, Honduras, Hong Kong, Hungary, Iceland, India, Indonesia, Israel, Italy, Japan, Latvia, Lebanon, Lithuania, Luxembourg, Macedonia, Malaysia, Malta, Mexico, Montenegro, Netherlands, New Zealand, Nicaragua, Nigeria, Norway, Panama, Paraguay, Peru, Philippines, Poland, Portugal, Romania, Russia, Saudi Arabia, Serbia, Singapore, Slovenia, South Africa, South Korea, Spain, Sweden, Switzerland, Taiwan, Thailand, Turkey, Uganda, Ukraine, United Arab Emirates, United Kingdom, United States, Uruguay, Venezuela, Vietnam, Zimbabwe.
Export
Go to NeoEPG → Exports to download your schedule data. Filters: channel, date range, and status (published/draft).
| Format | Use Case | Includes |
|---|---|---|
| CSV | Spreadsheet editing, migration, backup | 18 columns: all program fields + channel name |
| XMLTV | EPG data providers, TV guide apps, Kodi | Standard XMLTV with episode-num (xmltv_ns) |
| JSON | Custom integrations, APIs, developers | Structured JSON with channels array + programs array |
Templates
The plugin includes five frontend display templates. Choose the one that best suits your content and page layout.
All templates are responsive and include mobile-optimized layouts with tab navigation between channels.
Shortcodes Reference
All shortcodes work anywhere WordPress supports shortcodes: pages, posts, text widgets, and theme templates via do_shortcode().
EPG Schedule Grid
The main schedule display shortcode. Renders one of the five templates.
Alias: [tv_schedule_epg] — both shortcodes are identical.
| Attribute | Default | Values | Description |
|---|---|---|---|
template | timeline | timeline · list · compact · single-channel · mini | Which display template to use. |
channels | all | Comma-separated slugs | Specific channels to show. Empty shows all visible channels. |
limit_channels | 5 | 1–50 | Maximum number of channels to display. |
day | 0 | -365 to 365 | Day offset. 0 = today, 1 = tomorrow, -1 = yesterday. |
mobile_layout | tabs | tabs · list | How channels are arranged on mobile screens. |
show_badges | yes | yes · no | Show LIVE / Replay / 18+ badges on programs. |
show_channel_logos | yes | yes · no | Show channel logo images next to channel names. |
show_images | yes | yes · no | Show program thumbnail images inside cards. |
Now On Air New
Displays a grid or list of channels showing what is currently on air, with a real-time progress bar. Auto-refreshes every 5 minutes by default.
Alias: [tvsmepg_now]
| Attribute | Default | Values | Description |
|---|---|---|---|
channel_ids | all | Comma-separated IDs | Specific channels to show (use numeric IDs, not slugs). |
layout | grid | grid · list | grid: card grid. list: horizontal rows, one channel per line. |
columns | 3 | 1–6 | Number of grid columns (ignored in list layout). |
limit | 12 | 1–50 | Maximum number of channels to display. |
show_next | 1 | 1 · 0 | Show the next upcoming program below the current one. |
title | empty | Any text | Optional heading displayed above the widget. |
refresh | 300 | 0 – 3600 | Auto-refresh interval in seconds. 0 disables auto-refresh. |
Program Search New
A live search widget that queries all programs as the user types. Results appear without any page reload.
| Attribute | Default | Description |
|---|---|---|
placeholder | Search programs… | Input field placeholder text. |
channels | 1 | Show channel filter dropdown. Set to 0 to hide. |
show_date | 1 | Show date filter input. Set to 0 to hide. |
limit | 20 | Maximum results returned per query (max 100). |
Search queries title, description, category, and presenter fields. Requires at least 2 characters to trigger. Results are debounced (320 ms) to avoid excessive requests.
Elementor Widgets
When Elementor is installed and active, three widgets appear in the Elementor panel under the General category. All widget settings map directly to the shortcode attributes described above.
| Widget name | Shortcode equivalent | Since |
|---|---|---|
| NeoEPG – EPG Grid | [tvsmepg] | v0.17 |
| NeoEPG – Now On Air | [tvsmepg_now_on_air] | v0.19 |
| NeoEPG – Search | [tvsmepg_search] | v0.19 |
WordPress Sidebar Widgets
Go to Appearance → Widgets to find the NeoEPG – Now On Air WordPress widget. It supports all the same options as the shortcode: layout (grid/list), columns, channel filter, max channels, and show next program.
The Program Search is available as a shortcode only — paste [tvsmepg_search] into a Text or HTML widget to use it in any sidebar or widget area.
Display Builder
Go to NeoEPG → Display Builder to visually configure your shortcode without writing code.
- Select a template by clicking one of the five template cards.
- Choose which channels to show (all, or pick specific channels).
- Set options: max channels, day offset, mobile layout, badges, logos, images.
- Copy the generated shortcode from the live output panel on the right.
- Optionally save the configuration as a named preset to reuse later.
Saved presets are stored in wp_options under the key tvsmepg_display_presets. They can be loaded, deleted, and copied from the same page.
REST API
The plugin exposes a public REST API under the namespace tvsmepg/v1. All endpoints are accessible without authentication.
Base URL: https://yoursite.com/wp-json/tvsmepg/v1
Endpoints
visible_only=1 (default) or 0 for all.channel_id · date (Y-m-d) · date_from · date_to · search (min 2 chars) · status (published/draft) · per_page (1–100, default 20) · page · order (asc/desc) · orderby (start_datetime/title/created_at)
{ data: [...], total, per_page, page, total_pages }progress_pct and remaining_s fields. Parameter: channel_ids (comma-separated IDs, empty = all visible channels).Example Request
GET /wp-json/tvsmepg/v1/programs?channel_id=1&date=2026-04-10&per_page=50
Response:
{
"data": [
{
"id": 42,
"channel_id": 1,
"channel_name": "News Channel",
"title": "Morning News",
"start": "2026-04-10 07:00:00",
"end": "2026-04-10 08:00:00",
"start_ts": 1744268400,
"end_ts": 1744272000,
"duration_min": 60,
"category": "News",
"badge_live": true,
"badge_replay": false,
"badge_adult": false
}
],
"total": 18,
"per_page": 50,
"page": 1,
"total_pages": 1
}
Design & Skins
Go to NeoEPG → Design to customize the visual appearance of all frontend templates.
| Setting | Description |
|---|---|
| Primary font | Google Font family used for all EPG text. Applied via @import. |
| Primary color | Accent color for highlights, current-program indicators, and active states. |
| Background color | EPG widget background. Defaults to transparent (inherits theme). |
| Skin preset | Quick presets: Light, Dark, AMOLED, Glass. Overrides individual color settings. |
| Border radius | Corner rounding for program cards and timeline blocks. |
| Program card padding | Internal padding inside program cells. |
Push Notifications
The plugin integrates with OneSignal to send push notifications for program reminders and schedule updates.
- Create a free OneSignal account and register your website as an app.
- Copy your App ID and REST API Key from the OneSignal dashboard.
- Paste both values into NeoEPG → Push Settings.
- Create push campaigns under NeoEPG → Push.
A subscribe button and notification prompt are automatically injected on the frontend once your OneSignal credentials are configured.
Frequently Asked Questions
The schedule is empty even though I added programs. Why?
Check that: (1) the programs have Status = Published and Visible = checked; (2) the channel is set to Active and Visible; (3) the shortcode day="" matches the day the programs are scheduled (default is today, offset 0).
The shortcode [tvsmepg] displays nothing.
Make sure you have at least one active, visible channel and at least one published program for today. Also confirm the plugin is active under Plugins → Installed Plugins.
My theme overrides the EPG styles. What can I do?
The plugin's CSS uses scoped class names (all prefixed with .tvschedule-epg) to minimise conflicts. If your theme still overrides styles, add custom CSS in Appearance → Customize → Additional CSS to override specific rules.
How do I show programs for tomorrow instead of today?
Use the day attribute: [tvsmepg day="1"]. You can also use negative offsets: day="-1" for yesterday.
Can I display programs from only one channel?
Yes. Use [tvsmepg template="single-channel" channels="your-channel-slug"]. The Single Channel template also adds a week navigation bar.
How do I get the channel ID for the Now On Air shortcode?
Channel IDs are visible in the URL when you edit a channel in NeoEPG → Channels (look for id= in the URL), or in the channel list table.
Does the REST API require authentication?
No. All endpoints under /wp-json/tvsmepg/v1/ are publicly accessible without any API key or login. This allows external apps and third-party integrations to consume your schedule data freely.
WP-Cron does not run the API feed sync reliably. What to do?
Add a real server cron job that calls WP-Cron every 15 minutes:
*/15 * * * * wget -q -O /dev/null https://yoursite.com/wp-cron.php?doing_wp_cron
Can I use the plugin with Divi, WPBakery, or other page builders?
Yes. Any page builder that supports WordPress shortcodes can use [tvsmepg], [tvsmepg_now_on_air], and [tvsmepg_search]. Native Elementor widgets with live preview are available for all three.
Troubleshooting
Styles look wrong after updating the plugin
Clear your browser cache and any server-side caching plugin (WP Rocket, W3 Total Cache, etc.). The plugin appends its version number to all asset URLs for cache busting, but some aggressive caches ignore this.
Import fails with "0 programs created"
Verify that: (1) the datetime format in your file is YYYY-MM-DD HH:MM:SS; (2) the channel referenced in your file actually exists in the plugin (match by name or ID); (3) end time is strictly after start time for every row.
The search widget shows "Connection error"
This usually means the AJAX URL is not reachable. Check that admin-ajax.php is accessible (some security plugins block it). Verify in your browser's Network tab that the request returns status 200 with a JSON body.
Elementor widgets don't appear in the panel
Ensure Elementor version 3.0 or higher is installed and activated. Then go to Elementor → Tools → Regenerate CSS & Data and reload the editor.
NeoEPG – Modern TV Schedule · © 2026 NeoWeb d.o.o. · All rights reserved.