Program Planner DOCS & HELP

Hooks & Filters (PHP Codex)

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 pluginCopy in the themeUsed for
convention-schedule-planner/templates/single-event.phpyour-theme/convention-schedule-planner/single-event.phpDetail page of a session
convention-schedule-planner/templates/single-speaker.phpyour-theme/convention-schedule-planner/single-speaker.phpDetail page of a speaker
convention-schedule-room-monitor/templates/monitor-view.phpyour-theme/convention-schedule-room-monitor/monitor-view.phpRoom monitor layout (add-on)
Copies go stale

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

HookTypePurpose
event_calendar_stop_wordsFilter ($stop_words)Your own filler words that don’t count as common ground for “Related events”.
ec_json_ld_enabledFilter (true)Switches off the structured data (JSON-LD) on detail pages – e.g. when an SEO plugin outputs its own event data.
ecrm_template_pathFilter ($path, $name)Custom path for the Room Monitor add-on’s template.
ec_label_structureFilter ($groups)Your own groups and texts in the “Text & Labels” tab. Saved automatically as option ec_label_<key>.
ec_addon_shortcodesFilter ($shortcodes)Placeholders for an add-on’s shortcodes: if it is deactivated, visitors see nothing instead of raw shortcode text.
ec_settings_backup_excluded_keysFilter ($keys)Options that should not go into the settings backup.
ec_settings_design_cards / ec_settings_design_saveActionsOutput and save your own settings card in the “Live-Ticker” tab.
ec_help_tab_sectionsActionYour own card in the plugin help (after the shortcode documentation).
ec_shortcode_generator_types, ec_shortcode_generator_fields, ec_shortcode_generator_field_typesActions / filterOffer your own shortcodes in the Shortcode Generator.

Examples for functions.php

Custom filler words for related events
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.

Switch off structured data
add_filter( 'ec_json_ld_enabled', '__return_false' );
Your own text group for an add-on
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.

Colors and spacing

For pure design changes, CSS variables and classes are usually enough – see CSS customizing.