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.

Version 1.0 WordPress 6.2+ PHP 8.0+ By NeoWeb d.o.o.

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.

📅5 Display TemplatesTimeline, List, Compact, Single Channel, and Mini embed.
📺Channel ManagementLogo, color, sort order, visibility, and slug per channel.
🗓️Program SchedulingRich program data: title, description, images, badges, episodes, presenters.
📡Now On AirReal-time widget showing current program with live progress bar.
🔍Program SearchAJAX live search across all programs with channel and date filters.
🔄API FeedsAutomatic schedule sync from XML, JSON, or XMLTV sources.
📤ExportExport your schedule as CSV, XMLTV, or JSON.
🌐REST APIFull public REST API with channels, programs, and now-on-air endpoints.
🧩Elementor ReadyThree native Elementor widgets with live preview in the builder.
🔔Push NotificationsOneSignal integration for program reminder push alerts.
🎨Design SettingsCustom fonts, colors, skin presets, and spacing controls.

Requirements

RequirementMinimumRecommended
WordPress6.26.5+
PHP7.48.1+
MySQL / MariaDB5.7 / 10.38.0+ / 10.6+
Elementor Optional3.03.18+
Server memory128 MB256 MB+

Installation

Method 1 — WordPress Admin (Recommended)

  1. Log in to your WordPress admin and go to Plugins → Add New.
  2. Click Upload Plugin and choose the ZIP file you downloaded.
  3. Click Install Now, then Activate Plugin.
  4. A new NeoEPG menu appears in the left sidebar.

Method 2 — FTP / SFTP

  1. Extract the ZIP file on your computer.
  2. Upload the folder tv-schedule-modern-epg-system to /wp-content/plugins/ via FTP.
  3. In WordPress admin go to Plugins and activate NeoEPG – Modern TV Schedule.
On first activation the plugin automatically creates four custom database tables: 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.

  1. Add your first channel — go to NeoEPG → Channels, fill in the name, upload a logo URL, pick a brand color, and save.
  2. Add programs — go to NeoEPG → Programs, select the channel, set title, start time, and end time. Repeat for your schedule.
  3. Place the shortcode — create or edit any WordPress page and paste [tvsmepg]. Publish the page.
  4. Preview — visit the page on the frontend. You'll see a Timeline EPG with today's schedule.
  5. Customize — use the Display Builder or Elementor widget to choose a different template, filter channels, or adjust layout.
Use NeoEPG → Display Builder to visually configure and save shortcode presets for different pages — no code required.

Managing Channels

Go to NeoEPG → Channels to add and manage channels.

FieldDescription
NameDisplay name of the channel. Shown in all templates.
SlugURL-friendly identifier. Auto-generated from name if left empty. Used in shortcode channels="" attribute.
Logo URLFull URL to the channel logo image (PNG recommended, transparent background). Shown in timeline, list, compact templates.
ColorBrand color used for highlights, progress bars, and the fallback initials badge when no logo is set.
Sort OrderNumeric sort position. Lower numbers appear first. Channels with the same number are sorted alphabetically.
Statusactive or inactive. Inactive channels are hidden everywhere.
VisibleWhether 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

FieldRequiredDescription
ChannelThe channel this program airs on.
TitleProgram title shown in all templates.
Start / End datetimeFormat: YYYY-MM-DD HH:MM:SS. End must be after start.
DescriptionFull program description. Shown in modal popups and search results.
Image URLProgram thumbnail shown in cards and search results.
CategoryGenre / category (e.g. News, Sport, Movie). Used in search and export.
Episode titleSub-title for series episodes.
Season / EpisodeNumeric season and episode numbers. Exported in XMLTV format.
PresenterHost or presenter name. Searchable.
Trailer URLYouTube or video URL for the program trailer.

Badges

Badges are visual flags shown on program cards:

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

  1. Download a template file from the dashboard (CSV, JSON, or XML template buttons) to see the exact expected structure.
  2. Prepare your data file and upload it on the Imports page.
  3. Use the field mapping step to match your file's columns/keys to plugin fields.
  4. Preview the import before confirming. Duplicates are automatically detected and skipped.
  5. 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.

CSV example
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.

You can download the imported log from NeoEPG → Imports to review what was created, updated, or skipped in each import batch.

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

Sync Schedule

Each feed can be set to sync automatically using WordPress cron:

WordPress cron is triggered by page visits. On low-traffic sites, consider setting up a real server cron job that hits 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

  1. Find the country you want in the catalog grid.
  2. Click Activate. The feed is immediately saved to your API Feeds list with correct field mapping pre-applied.
  3. A confirmation notice confirms the feed was added.
  4. In the Saved feeds table, click Sync now on the new feed to run an immediate import.
  5. 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 fieldMaps to
startStart datetime
stopEnd datetime
channelChannel
titleTitle
descDescription

Default Options

Catalog feeds are activated with the following options pre-set:

After activating a feed, use the Preview button in the Saved feeds table to inspect the raw data and verify that channel identifiers in the feed match how you want channels named in your guide.

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).

FormatUse CaseIncludes
CSVSpreadsheet editing, migration, backup18 columns: all program fields + channel name
XMLTVEPG data providers, TV guide apps, KodiStandard XMLTV with episode-num (xmltv_ns)
JSONCustom integrations, APIs, developersStructured 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.

📅TimelineHorizontal scrollable time axis with program blocks. Best for full-width pages.
📋ListVertical list of programs per channel. Clear and compact for simple layouts.
CompactDense grid showing many channels simultaneously. Great for overview pages.
📺Single ChannelFull-day schedule for one channel with week navigation.
🟦MiniMinimal embed for sidebars, widgets, or tight spaces.

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.

[tvsmepg template="timeline" channels="news,sport" limit_channels="5" day="0"]

Alias: [tv_schedule_epg] — both shortcodes are identical.

AttributeDefaultValuesDescription
templatetimelinetimeline · list · compact · single-channel · miniWhich display template to use.
channelsallComma-separated slugsSpecific channels to show. Empty shows all visible channels.
limit_channels51–50Maximum number of channels to display.
day0-365 to 365Day offset. 0 = today, 1 = tomorrow, -1 = yesterday.
mobile_layouttabstabs · listHow channels are arranged on mobile screens.
show_badgesyesyes · noShow LIVE / Replay / 18+ badges on programs.
show_channel_logosyesyes · noShow channel logo images next to channel names.
show_imagesyesyes · noShow 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.

[tvsmepg_now_on_air layout="grid" columns="3" show_next="1" refresh="300"]

Alias: [tvsmepg_now]

AttributeDefaultValuesDescription
channel_idsallComma-separated IDsSpecific channels to show (use numeric IDs, not slugs).
layoutgridgrid · listgrid: card grid. list: horizontal rows, one channel per line.
columns31–6Number of grid columns (ignored in list layout).
limit121–50Maximum number of channels to display.
show_next11 · 0Show the next upcoming program below the current one.
titleemptyAny textOptional heading displayed above the widget.
refresh3000 – 3600Auto-refresh interval in seconds. 0 disables auto-refresh.
The progress bar updates locally every 30 seconds without a server request. A full AJAX refresh happens on the configured interval (or immediately if a program ends mid-page).

A live search widget that queries all programs as the user types. Results appear without any page reload.

[tvsmepg_search placeholder="Search programs…" channels="1" show_date="1" limit="20"]
AttributeDefaultDescription
placeholderSearch programs…Input field placeholder text.
channels1Show channel filter dropdown. Set to 0 to hide.
show_date1Show date filter input. Set to 0 to hide.
limit20Maximum 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 nameShortcode equivalentSince
NeoEPG – EPG Grid[tvsmepg]v0.17
NeoEPG – Now On Air[tvsmepg_now_on_air]v0.19
NeoEPG – Search[tvsmepg_search]v0.19
In the Elementor editor, the Now On Air and Search widgets render a live preview with real data from your database — no need to switch to Preview mode to see how they look.

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.

  1. Select a template by clicking one of the five template cards.
  2. Choose which channels to show (all, or pick specific channels).
  3. Set options: max channels, day offset, mobile layout, badges, logos, images.
  4. Copy the generated shortcode from the live output panel on the right.
  5. 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

GET
/health
Plugin health check. Returns version and current server time.
GET
/channels
List all channels. Parameter: visible_only=1 (default) or 0 for all.
GET
/channels/{id}
Single channel by ID. Returns 404 if not found.
GET
/programs
List programs with full filtering and pagination.
Parameters: 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)
Response: { data: [...], total, per_page, page, total_pages }
GET
/programs/{id}
Single program by ID. Returns 404 if not found.
GET
/now
What is currently on air for each channel. Includes progress_pct and remaining_s fields. Parameter: channel_ids (comma-separated IDs, empty = all visible channels).

Example Request

Fetch today's programs for channel 1
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.

SettingDescription
Primary fontGoogle Font family used for all EPG text. Applied via @import.
Primary colorAccent color for highlights, current-program indicators, and active states.
Background colorEPG widget background. Defaults to transparent (inherits theme).
Skin presetQuick presets: Light, Dark, AMOLED, Glass. Overrides individual color settings.
Border radiusCorner rounding for program cards and timeline blocks.
Program card paddingInternal padding inside program cells.

Push Notifications

The plugin integrates with OneSignal to send push notifications for program reminders and schedule updates.

  1. Create a free OneSignal account and register your website as an app.
  2. Copy your App ID and REST API Key from the OneSignal dashboard.
  3. Paste both values into NeoEPG → Push Settings.
  4. 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.