Where settings aren’t enough, you step in through template copies in your theme and through WordPress filters – update-safe and without changing the plugin itself.
Overriding templates in the theme
For the detail pages, the plugin looks in the active theme (or child theme) first and only then uses its own template. Copy the file from the plugin folder and adapt the copy:
| Template in the plugin | Copy in the theme | Used for |
|---|---|---|
convention-schedule-planner/templates/single-event.php | your-theme/convention-schedule-planner/single-event.php | Detail page of a session |
convention-schedule-planner/templates/single-speaker.php | your-theme/convention-schedule-planner/single-speaker.php | Detail page of a speaker |
convention-schedule-room-monitor/templates/monitor-view.php | your-theme/convention-schedule-room-monitor/monitor-view.php | Room monitor layout (add-on) |
A template copy no longer receives plugin updates – new fields or fixes won’t appear there. Compare your copy with the original after updates, or, where possible, change things with CSS only.
Each copy lives in a theme subfolder named like the plugin folder: the two detail pages in convention-schedule-planner/, the monitor template in convention-schedule-room-monitor/. The plugin ignores a file of the same name directly in the theme folder – so another theme’s or plugin’s template can’t take over the detail page by accident. When the pop-up view is used instead of a separate page, single-event.php is not used.
Filters and actions
| Hook | Type | Purpose |
|---|---|---|
event_calendar_stop_words | Filter ($stop_words) | Your own filler words that don’t count as common ground for “Related events”. |
ec_json_ld_enabled | Filter (true) | Switches off the structured data (JSON-LD) on detail pages – e.g. when an SEO plugin outputs its own event data. |
ecrm_template_path | Filter ($path, $name) | Custom path for the Room Monitor add-on’s template. |
ec_label_structure | Filter ($groups) | Your own groups and texts in the “Text & Labels” tab. Saved automatically as option ec_label_<key>. |
ec_addon_shortcodes | Filter ($shortcodes) | Placeholders for an add-on’s shortcodes: if it is deactivated, visitors see nothing instead of raw shortcode text. |
ec_settings_backup_excluded_keys | Filter ($keys) | Options that should not go into the settings backup. |
ec_settings_design_cards / ec_settings_design_save | Actions | Output and save your own settings card in the “Live-Ticker” tab. |
ec_help_tab_sections | Action | Your own card in the plugin help (after the shortcode documentation). |
ec_shortcode_generator_types, ec_shortcode_generator_fields, ec_shortcode_generator_field_types | Actions / filter | Offer your own shortcodes in the Shortcode Generator. |
Examples for functions.php
add_filter( 'event_calendar_stop_words', function( $stop_words ) {
return array_merge( $stop_words, array( 'reading', 'special', 'part' ) );
} );The list already contains articles, prepositions and typical event terms in eleven languages. Alternatively, filler words can be added without code via the translation file – the plugin help describes the way with Poedit or Loco Translate.
add_filter( 'ec_json_ld_enabled', '__return_false' );add_filter( 'ec_label_structure', function( $groups ) {
$groups['My Add-on'] = array(
'my_badge' => 'New',
);
return $groups;
} );
// Output: get_option( 'ec_label_my_badge', 'New' )Reading data from outside
For apps and partner websites the public REST API is the right way – with a fixed data format that doesn’t change with updates. The calendar’s internal data sources are not meant for this.
For pure design changes, CSS variables and classes are usually enough – see CSS customizing.