# Features — tom

Evidence date: 2026-10-01. Source: `master` at `0ceed11`.

Status values used here:

- **Current** — present in the tree at `0ceed11` and wired up (registered, enqueued, or rendered).
- **Present, activation unknown** — files are vendored; WordPress only runs them if the database says the plugin or theme is active. The OMTOM theme is the only theme in the tree.
- **Disabled in code** — the implementation is commented out or the constant turns it off.
- **Not in git** — named by OVER-310 or implied by the product, but absent from this revision.

There is no in-development branch. The only branch is `master`.

## Current — product features in the OMTOM theme

| Feature | What it does | Evidence |
|---|---|---|
| Public marathon site | Theme OMTOM 1.0 for Old Mutual Two Oceans Marathon | `wp-content/themes/omtom/style.css`, `README.txt` |
| Main and eyebrow menus | `register_nav_menus` keys `main`, `eyebrow` | `functions.php` `omtom_setup` |
| Home slider | Up to 20 published `homepage_slider` posts, `menu_order` ascending. A slide renders when it has a featured image. Optional YouTube watch link, content image, and button (label and URL both required) | `front-page.php` |
| Home events grid | Up to 100 published top-level `events` (`post_parent` 0), `menu_order` ascending. Card shows image, icon, colour, date, entry status | `front-page.php` |
| Entry status label | "Entries Open" when `tickets-available` is set; otherwise optional `no-tickets` text | `front-page.php`, `classes/meta-boxes/tickets-available.meta.php` |
| "Keeping you posted" slots | Up to three homepage features from theme options | `front-page.php`, `options.posted.php` |
| Homepage link slots | Four configurable links | `options.links.php` |
| Countdown | Optional next-event datetime and logo | `options.theme.php`; datetime passed to JS as `wp.eventDate` |
| Urgent notification | Optional site notice with button and colours | `options.theme.php`; partial `partials/notification-emergency.php` exists |
| Homepage notification | Optional notice with background image | `options.theme.php` |
| Advertising space | Optional advert block | `options.advertisement.php` |
| Vision, mission, values | Admin fields and template "Vision Mission Values" | `options.vmv.php`, `template.vision.php` |
| Cookie notice | Banner plus `OMTOMDisclaimer` cookie set on `window.onload` for 10 years | `footer.php`, `functions.php` `cookie_notice`, `assets/js/functions.js` |
| Newsletter signup | AJAX `handle_subscriptions`, local table insert, Touchbase Pro POST | `classes/forms/forms.php`, `assets/js/functions.js` |
| Newsletter CSV export | AJAX `newsletter_reporting` writes a dated CSV | `classes/reporting/reporting.php`, `options.newsletter.php` |
| Contact form | AJAX `handle_contacts`, PHP `mail()` | `classes/forms/forms.php`, `template.contact.php` |
| Contact directory | Race, reception, media, exhibition, postal, physical, office hours, VAT, form recipient | `options.contact.php` |
| Social links | Facebook, Twitter, Instagram, YouTube URLs | `options.social.php`, `partials/social-menu.php` |
| Instagram feed | Server-side call to Instagram API v1 when a token option exists | `functions.php` `pull_instagram_feed`; footer renders items |
| Route maps | Google Maps, KML, JSON, filters | `assets/js/maps.js`, `assets/kml/`, `assets/objects/` |
| Sharing tags | Open Graph and Twitter Card; Facebook share button | `header.php`, `assets/js/functions.js` |
| Editor shortcodes | `youtube`, `button`, `pdfLink`, `map` plus TinyMCE buttons | `classes/shortcodes/shortcodes.php`, `classes/tinymce/tinyMCE.buttons.php` |
| Comments menu hidden | Removes `edit-comments.php` from the admin menu | `functions.php` `omtom_remove_menus` |
| Charity application embed | Google Form iframe, gated by buttons meta or `enable_application_form` | `template.charity-applications.php` |
| Panel view | `?panel` omits header and footer on the charity application template | `template.charity-applications.php` |
| CloudFront asset loading | Public and admin theme CSS/JS loaded from `d19jcneif5xmtf.cloudfront.net` | `functions.php` `omtom_scripts`, `omtom_admin_scripts` |

### Page templates

All under `wp-content/themes/omtom/`. Template Name is the WordPress admin label.

| File | Template name |
|---|---|
| `template.blog.php` | Blog |
| `template.charity.php` | Run For Charity |
| `template.charity-applications.php` | Charity Applications |
| `template.combined-results.php` | Combined Results |
| `template.contact.php` | Contact Us |
| `template.event-entry-info.php` | Event Entry Info |
| `template.faqs.php` | FAQs |
| `template.history.php` | History |
| `template.hospitality.php` | Hospitality |
| `template.hospitality-tab.php` | Hospitality Tab |
| `template.medical-corner.php` | Medical Corner |
| `template.news.php` | Two Oceans News |
| `template.payment-options.php` | Payment Options |
| `template.photo-gallery.php` | Photo Gallery |
| `template.press-releases.php` | Press Releases |
| `template.prizes-medals.php` | Prizes & Medals |
| `template.race-day.php` | Race Day |
| `template.reporting.php` | Download Reports |
| `template.route-info.php` | Route Info |
| `template.sponsors.php` | Sponsors |
| `template.tomi.php` | Two Oceans Marathon Initiative |
| `template.tshirts.php` | T-Shirts |
| `template.video-gallery.php` | Video Gallery |
| `template.vision.php` | Vision Mission Values |

Standard templates also exist: `front-page.php`, `index.php`, `page.php`, `single.php`, `archive.php`, `category.php`, `tag.php`, `search.php`, `404.php`, `header.php`, `footer.php`, `sidebar.php`, `comments.php`.

Single templates for custom types: `single-events.php`, `single-event_race_day.php`, `single-event_route_info.php`, `single-event_prizes_medals.php`, `single-medical_corner.php`, `single-omtom_blog.php`, `single-press_releases.php`, `single-sponsors.php`.

Taxonomy templates: `taxonomy-blog_categories.php`, `taxonomy-medical_categories.php`, `taxonomy-photo_years.php`, `taxonomy-video_years.php`.

### Custom post types

Registered in `functions.php` via `classes/post-types/post-type.php`. Rewrite slug equals the post type key. Default supports are overridden per type as listed.

| Key | Admin label | Supports | Notes |
|---|---|---|---|
| `omtom_blog` | Blog | title, editor, excerpt, thumbnail | |
| `medical_corner` | Medical Corner | title, editor, excerpt, thumbnail | |
| `press_releases` | Press Releases | title, editor, excerpt, thumbnail | |
| `homepage_slider` | Homepage Slider | title, editor, thumbnail, page-attributes | `exclude_from_search` |
| `events` | Events | title, editor, excerpt, thumbnail, page-attributes | hierarchical |
| `event_race_day` | Race Day Tabs | title, editor, page-attributes | excluded from search |
| `event_route_info` | Route Info Tabs | title, editor, page-attributes | excluded from search |
| `event_prizes_medals` | Prizes & Medals Tabs | title, editor, page-attributes | excluded from search |
| `compulsory_equipment` | Compulsory Equipment | title, editor, page-attributes | excluded from search |
| `event_shirts` | T-Shirts | title, editor, thumbnail, page-attributes | excluded from search |
| `c_results` | Combined Results | title, editor, page-attributes | excluded from search |
| `charities` | Charities | title, editor, thumbnail, page-attributes | excluded from search |
| `sponsors` | Sponsors | title, editor, thumbnail, page-attributes | excluded from search |
| `faqs` | FAQs | title, editor, page-attributes | excluded from search |
| `omtom_videos` | Video Gallery | title, page-attributes | |
| `omtom_photos` | Photo Gallery | title, page-attributes | |

### Taxonomies

| Key | Label | Attached to |
|---|---|---|
| `sponsor_category` | Type / Types | `sponsors` |
| `video_years` | Year / Years | `omtom_videos` |
| `photo_years` | Year / Years | `omtom_photos` |
| `blog_categories` | Category / Categories | `omtom_blog` |
| `medical_categories` | Category / Categories | `medical_corner` |

`sponsor_category` has a numeric term-order field `custom-term-ordering`. Admin help text says terms pull through in ascending order (`functions.php`).

### Admin list columns

`classes/columns/custom-columns.php` adds an Event column (meta `event`, shown as a post title) on `event_shirts`, `event_race_day`, `event_route_info`, `event_prizes_medals`, `compulsory_equipment`, `omtom_photos`, and `omtom_videos`.

### Meta boxes

Included from `functions.php` and constructed there:

`tickets-available`, `icon-uploader`, `sub-heading`, `event-date`, `event-details`, `important-notes`, `side-panel`, `pre-race`, `race-day`, `post-race`, `gallery`, `event-attach`, `content-image`, `video-url`, `single-button`, `information`, `event-colors`, `extra-content`, `page-buttons`, `charity-contact`, `tshirt-image-uploader`, `tshirts-available`, `tshirt-content`, `entry-info-content`, `combined-results`, `history-timeline`, `video-gallery`, `event-map`, `prizes-medals-content`, `sponsor-url`, `enable-application-form`.

### Route assets

| Distance / route (from filenames) | KML | JSON |
|---|---|---|
| Ultra marathon | `assets/kml/ultra_marathon_route.kml` | `assets/objects/ultra_marathon_route.json` |
| Half marathon | `half_marathon_route.kml` | `half_marathon_route.json` |
| Trail 12 km | `trail_12km_route.kml` | `trail12_marathon_route.json` |
| Trail 24 km | `trail_24km_route.kml` | `trail24_marathon_route.json` |
| Fun run 2.1 km | `funrun_2.1km_route.kml` | `funrun2.1_marathon_route.json` |
| Fun run 5.6 km | `funrun_5.6km_route.kml` | `funrun5.6_marathon_route.json` |
| Friendship run | `friendship_route.kml` | `friendship_route.json` |
| Shuttle | `shuttle_route.kml` | `shuttle_route.json` |

Map object index: `assets/objects/map_object.json`. Start/finish marker images exist for the same distances under `assets/images/map_markers/`.

## Present, activation unknown — plugins

| Plugin | Version | Directory |
|---|---|---|
| WP Offload Media Lite | 2.0.1 | `wp-content/plugins/amazon-s3-and-cloudfront` |
| Crazy Egg | 2.1 | `crazyegg-heatmap-tracking` |
| Disable XML-RPC Pingback | 1.1 | `disable-xml-rpc-pingback` |
| SSL Insecure Content Fixer | 2.7.2 | `ssl-insecure-content-fixer` |
| TablePress | 1.9.1 | `tablepress` |
| W3 Total Cache | 0.9.7.2 | `w3-total-cache` |
| Wordfence Security | 7.2.1 | `wordfence` |
| Yoast SEO | 9.6 | `wordpress-seo` |
| SEOPress | 3.3.8.1 | `wp-seopress` |

`wp-config.php` defines `AS3CF_SETTINGS` for provider `aws` (keys omitted) and sets `WP_CACHE` to `false`. A commented constant `AS3CF_AWS_USE_EC2_IAM_ROLE` is not active.

## Disabled in code or incomplete in the template

| Item | State | Evidence |
|---|---|---|
| PHP cookie setter | Commented out. Footer JS replaced it | `functions.php` `handle_cookies` |
| Subscription reporting options page | Include commented out | `functions.php` around the `options.reporting.php` include |
| Older reporting class | Commented block above the active `reporting` class | `classes/reporting/reporting.php` |
| W3 Total Cache drop-in | Constant `WP_CACHE` is false | `wp-config.php` |
| Widget registration | `register_omtom_widgets` is empty. `sidebars.php` is included and no `new custom_sidebar(...)` call was found | `functions.php` |
| ENTER NOW links | Anchors rendered with `href=""` and class `webtickets` | `single-events.php` |
| Webtickets icon on payment options | HTML comment | `template.payment-options.php` |
| Google+ share example | HTML comment on the front page | `front-page.php` |
| Default WordPress themes | Not in the tree | `wp-content/themes/` contains only `omtom` |

## Recently changed

The only product changes after the 2022-09-29 import are the cookie notice:

| Commit | Date | Change |
|---|---|---|
| `2f1a52b` | 2022-09-30 | Sets disclaimer cookie from the footer on page load so the notice does not return. File: `functions.php` |
| `0ceed11` | 2022-09-30 | Lengthens that cookie expiry. File: `functions.php`. Current expression is 10 years |

No feature was removed in those commits. The previous two-year PHP `setcookie` calls remain in comments.

## Planned

None documented in the repository.

## Not in git

| Item | Notes |
|---|---|
| `sonar-project.properties` | Listed by OVER-310 for the scan host. Absent at `0ceed11` |
| `sonarqube_scan.bat` | Same |
| Database content | Pages, menus, users, plugin activation |
| `wp_omtom_subscriptions` DDL | Table is written by the theme; creation script was not found |
| Automated tests, CI pipeline, Docker | No matching root files |

## Removed

Nothing in git history shows a removed product feature. The tree has four commits. The first two introduce the project; the last two only change the cookie script.
