Description
GTL Maps is built for cycling and outdoor tourism websites that need to publish curated routes with detailed GPX data. The plugin registers a “Route” custom post type, handles GPX upload and parsing, and renders interactive Leaflet maps via shortcode or automatically above single route posts. It also provides a “Point of Interest” post type to highlight attractions around each route and exposes REST API endpoints for custom front-end integrations.
Key features:
- Upload GPX files and automatically compute distance, elevation gain/loss, and bounding boxes.
- Display interactive Leaflet maps with optional elevation profile and POI filtering.
- Maintain POI categories with custom icons and associate POIs with nearby routes.
- Provide REST API endpoints (
gtl/v1/routesandgtl/v1/pois) so modern front-ends can consume the data. - Includes Gutenberg/widget support via shortcodes and dedicated widgets for route details and POI lists.
Bug Fixes
- correct GTLMAPS_VERSION constant name in release workflows and sync gtl-maps.php to 0.2.1 (#55) (971b9f6)
- deploy pipeline (94839e6)
Miscellaneous Chores
- update coverage badge [skip ci] (f9b8d75)
[0.2.2](https://github.com/hevelius/gtl-maps/compare/0.2.1…0.2.2) (2026-04-12)
Bug Fixes
- correct GTLMAPS_VERSION constant name in release workflows and sync gtl-maps.php to 0.2.1 (#55) (971b9f6)
- deploy pipeline (94839e6)
Miscellaneous Chores
- update coverage badge [skip ci] (f9b8d75)
[0.1.0](https://github.com/hevelius/gtl-maps/compare/0.0.20…0.1.0) (2026-02-19)
Features
- add Astra theme for full-width demo page support (fb54a97)
- Add code coverage and fix failing tests (#24) (b281667)
- add CODEOWNERS file for automatic review assignment (#34) (24f782d)
- add custom icons for waypoints and POI categories (cb8d418)
- add specialized OpenCode sub-agents for WordPress development (fe32f6c)
- Add specialized OpenCode sub-agents for WordPress development (7d88493)
- add support for GPX waypoint visualization with default icons (a07e063)
- add wp-env development setup with sample data (638d48c)
- Add wp-env development setup with sample data (61e50ab)
- enhance demo page with comprehensive shortcode examples (bd94581)
- enhance release workflow with security and validation (#21) (6562480)
- replace sample GPX routes with real Rome cycling routes (470ae23)
- replace sample routes with Italian inter-city routes (3634d1b)
Bug Fixes
- add expression syntax to validate-release condition (d2ffa3e)
- add missing period and remove trailing whitespace (e5bbd07)
- add retry mechanism and test instance check in wp-env workflow (1692ea1)
- add timeout to logs step to prevent hanging (f7ba4e3)
- add write permissions for coverage badge commit (04a15aa)
- auto-activate plugin in CI if not already active (5844092)
- auto-create .htaccess file for wp-env permalink support (273eb6c)
- category shows only related poi (3eb51d9)
- configure make-pot workflow for pull requests (cd2583f)
- correct POI JSON structure to match import script (ca4cbdc)
- escape string (368a1fa)
- HEREDOC exit code issue in setup script (6322862)
- improve POI association and shortcode escaping (ee7b388)
- improve route ID extraction with better error handling (dc7ef68)
- linter and test errors (db884d1)
- mobile scroll point (432ba04)
- POI filter panel title and button visibility across themes (d6d9458)
- remove conflicting mappings from wp-env config (9d7c71b)
- remove invalid conditional check in POI relink script (679544e)
- remove waypoints from GPX files to prevent map marker clutter (b638507)
- replace JPEG-as-PNG screenshots with true PNG files (#35) (a5b091b)
- resolve workflow errors (113f45e)
- set failOnWarning=false to prevent CI failure on deprecations (271b88a)
- simplify validate-release workflow condition (8326112)
- skip POT PR creation on pull request events (7fd1d9c)
- specify correct coverage report filename (17b699e)
- update WordPress deploy action to use correct 10up action (5ee6cee)
- use correct meta key for GPX attachment ID (3502e08)
- use correct parameter format for wp-cli command (a0e4aa1)
- use dynamic route IDs in demo page content (78462e7)
- use L.Icon object for waypoint markers instead of icon URLs (a176582)
- use PHP-compatible coverage badge generator (207e2d4)
- use pre-installed wp-cli instead of manual download (d890eaa)
- validate-release workflow condition on line 16 (b0d6249)
- waypoint popup and POI icon assignment in wp-env (6498590)
- workflows: use multiline format for validate-release if condition (18f5d39)
Miscellaneous Chores
- add .wordpress.org to .gitignore to prevent tracking sensitive files (33eb9eb)
- add collapsed poi panel (610afa0)
- add core poi relink function (17bcbec)
- add helper scripts for POI icon testing and debugging (edc0461)
- deps: bump actions/checkout from 4 to 6 (#30) (ace2ced)
- deps: bump actions/upload-artifact from 4 to 6 (#29) (33e00b5)
- deps: bump peter-evans/create-pull-request from 6 to 8 (#28) (a56998c)
- increase words trim (000df0c)
- initial commit (9073aa3)
- main: release 0.0.10 (#10) (2ddcd33)
- main: release 0.0.11 (#11) (aec277d)
- main: release 0.0.12 (#12) (d3ab487)
- main: release 0.0.13 (#13) (429e7dd)
- main: release 0.0.14 (#14) (8ef14d2)
- main: release 0.0.15 (#15) (d1550b0)
- main: release 0.0.16 (#16) (58dcbed)
- main: release 0.0.17 (#17) (6407e26)
- main: release 0.0.18 (#18) (7aa9a44)
- main: release 0.0.19 (#19) (8dfd7f9)
- main: release 0.0.20 (#20) (79e1da1)
- main: release 0.0.4 (#4) (1fec03f)
- main: release 0.0.5 (#5) (f2c7a0b)
- main: release 0.0.6 (#6) (32f9c3f)
- main: release 0.0.7 (#7) (ce7f2c7)
- main: release 0.0.8 (#8) (020b6c2)
- main: release 0.0.9 (#9) (92882a7)
- move footer in body card (440e493)
- new behaviour sidecard (682b120)
- pipeline update (eecc42e)
- prepare plugin for WordPress.org directory submission (#36) (a1d639d)
- remove author metadata from sample GPX files (51852de)
- remove unused comment (dea7ebe)
- trigger new release (74f4de8)
- trigger relase (e193663)
- trigger release please (de8219b)
- update (e4ae6a2)
- update (3becff4)
- update (3138eed)
- update (cd01092)
- update (be31b75)
- update (82f0c1d)
- update (29aec77)
- update (dc820f2)
- update (0b0ba7b)
- update (4d1a116)
- update (14e041f)
- update (5e21407)
- update (324fafb)
- update (35c73c8)
- update ci (e289307)
- update coverage badge [skip ci] (cbd31e1)
- update maps url (7722dbf)
- update readme (29e7562)
- update readme (69614e7)
- update readme.txt (58ce69f)
- update strings (56a3912)
- update strings items (45e7143)
- update sync (c16ea00)
- update sync files (9b2f299)
- update testing info (a91d124)
[0.1.0](https://github.com/hevelius/gtl-maps/compare/0.0.20…0.1.0) (2026-02-19)
Features
- add Astra theme for full-width demo page support (fb54a97)
- Add code coverage and fix failing tests (#24) (b281667)
- add CODEOWNERS file for automatic review assignment (#34) (24f782d)
- add custom icons for waypoints and POI categories (cb8d418)
- add specialized OpenCode sub-agents for WordPress development (fe32f6c)
- Add specialized OpenCode sub-agents for WordPress development (7d88493)
- add support for GPX waypoint visualization with default icons (a07e063)
- add wp-env development setup with sample data (638d48c)
- Add wp-env development setup with sample data (61e50ab)
- enhance demo page with comprehensive shortcode examples (bd94581)
- enhance release workflow with security and validation (#21) (6562480)
- replace sample GPX routes with real Rome cycling routes (470ae23)
- replace sample routes with Italian inter-city routes (3634d1b)
Bug Fixes
- add expression syntax to validate-release condition (d2ffa3e)
- add missing period and remove trailing whitespace (e5bbd07)
- add retry mechanism and test instance check in wp-env workflow (1692ea1)
- add timeout to logs step to prevent hanging (f7ba4e3)
- add write permissions for coverage badge commit (04a15aa)
- auto-activate plugin in CI if not already active (5844092)
- auto-create .htaccess file for wp-env permalink support (273eb6c)
- category shows only related poi (3eb51d9)
- configure make-pot workflow for pull requests (cd2583f)
- correct POI JSON structure to match import script (ca4cbdc)
- escape string (368a1fa)
- HEREDOC exit code issue in setup script (6322862)
- improve POI association and shortcode escaping (ee7b388)
- improve route ID extraction with better error handling (dc7ef68)
- linter and test errors (db884d1)
- mobile scroll point (432ba04)
- POI filter panel title and button visibility across themes (d6d9458)
- remove conflicting mappings from wp-env config (9d7c71b)
- remove invalid conditional check in POI relink script (679544e)
- remove waypoints from GPX files to prevent map marker clutter (b638507)
- replace JPEG-as-PNG screenshots with true PNG files (#35) (a5b091b)
- resolve workflow errors (113f45e)
- set failOnWarning=false to prevent CI failure on deprecations (271b88a)
- simplify validate-release workflow condition (8326112)
- skip POT PR creation on pull request events (7fd1d9c)
- specify correct coverage report filename (17b699e)
- update WordPress deploy action to use correct 10up action (5ee6cee)
- use correct meta key for GPX attachment ID (3502e08)
- use correct parameter format for wp-cli command (a0e4aa1)
- use dynamic route IDs in demo page content (78462e7)
- use L.Icon object for waypoint markers instead of icon URLs (a176582)
- use PHP-compatible coverage badge generator (207e2d4)
- use pre-installed wp-cli instead of manual download (d890eaa)
- validate-release workflow condition on line 16 (b0d6249)
- waypoint popup and POI icon assignment in wp-env (6498590)
- workflows: use multiline format for validate-release if condition (18f5d39)
Miscellaneous Chores
- add .wordpress.org to .gitignore to prevent tracking sensitive files (33eb9eb)
- add collapsed poi panel (610afa0)
- add core poi relink function (17bcbec)
- add helper scripts for POI icon testing and debugging (edc0461)
- deps: bump actions/checkout from 4 to 6 (#30) (ace2ced)
- deps: bump actions/upload-artifact from 4 to 6 (#29) (33e00b5)
- deps: bump peter-evans/create-pull-request from 6 to 8 (#28) (a56998c)
- increase words trim (000df0c)
- initial commit (9073aa3)
- main: release 0.0.10 (#10) (2ddcd33)
- main: release 0.0.11 (#11) (aec277d)
- main: release 0.0.12 (#12) (d3ab487)
- main: release 0.0.13 (#13) (429e7dd)
- main: release 0.0.14 (#14) (8ef14d2)
- main: release 0.0.15 (#15) (d1550b0)
- main: release 0.0.16 (#16) (58dcbed)
- main: release 0.0.17 (#17) (6407e26)
- main: release 0.0.18 (#18) (7aa9a44)
- main: release 0.0.19 (#19) (8dfd7f9)
- main: release 0.0.20 (#20) (79e1da1)
- main: release 0.0.4 (#4) (1fec03f)
- main: release 0.0.5 (#5) (f2c7a0b)
- main: release 0.0.6 (#6) (32f9c3f)
- main: release 0.0.7 (#7) (ce7f2c7)
- main: release 0.0.8 (#8) (020b6c2)
- main: release 0.0.9 (#9) (92882a7)
- move footer in body card (440e493)
- new behaviour sidecard (682b120)
- pipeline update (eecc42e)
- prepare plugin for WordPress.org directory submission (#36) (a1d639d)
- remove author metadata from sample GPX files (51852de)
- remove unused comment (dea7ebe)
- trigger new release (74f4de8)
- trigger relase (e193663)
- trigger release please (de8219b)
- update (e4ae6a2)
- update (3becff4)
- update (3138eed)
- update (cd01092)
- update (be31b75)
- update (82f0c1d)
- update (29aec77)
- update (dc820f2)
- update (0b0ba7b)
- update (4d1a116)
- update (14e041f)
- update (5e21407)
- update (324fafb)
- update (35c73c8)
- update ci (e289307)
- update coverage badge [skip ci] (cbd31e1)
- update maps url (7722dbf)
- update readme (29e7562)
- update readme (69614e7)
- update readme.txt (58ce69f)
- update strings (56a3912)
- update strings items (45e7143)
- update sync (c16ea00)
- update sync files (9b2f299)
- update testing info (a91d124)
[0.0.20](https://github.com/hevelius/gtl-maps/compare/0.0.19…0.0.20) (2025-11-29)
Bug Fixes
- mobile scroll point (af7a31c)
[0.0.19](https://github.com/hevelius/gtl-maps/compare/0.0.18…0.0.19) (2025-11-08)
Bug Fixes
- linter and test errors (76199de)
Miscellaneous Chores
- add core poi relink function (62b0807)
[0.0.18](https://github.com/hevelius/gtl-maps/compare/0.0.17…0.0.18) (2025-11-08)
Miscellaneous Chores
- add collapsed poi panel (7223174)
- increase words trim (c494b41)
- move footer in body card (c580774)
- new behaviour sidecard (7023e38)
- remove unused comment (61b9ac0)
- update strings (0fb3e10)
[0.0.17](https://github.com/hevelius/gtl-maps/compare/0.0.16…0.0.17) (2025-11-06)
Bug Fixes
- escape string (6a1a764)
Miscellaneous Chores
[0.0.16](https://github.com/hevelius/gtl-maps/compare/0.0.15…0.0.16) (2025-10-28)
Miscellaneous Chores
- pipeline update (becbfeb)
[0.0.15](https://github.com/hevelius/gtl-maps/compare/0.0.14…0.0.15) (2025-10-28)
Miscellaneous Chores
[0.0.14](https://github.com/hevelius/gtl-maps/compare/0.0.13…0.0.14) (2025-10-28)
Miscellaneous Chores
Third-Party Libraries
This plugin includes the following open-source libraries:
-
Leaflet.js – BSD-2-Clause License – https://leafletjs.com/
Interactive mapping library for displaying GPX routes and points of interest on dynamic, tile-based maps. -
Chart.js – MIT License – https://www.chartjs.org/
JavaScript charting library for rendering elevation profile visualizations with interactive tooltips. -
leaflet-gpx – BSD-2-Clause License – https://github.com/mpetazzoni/leaflet-gpx
Leaflet plugin for parsing and displaying GPX track files with waypoint markers.
All included libraries are GPL-compatible and bundled locally for optimal performance and reliability.
Screenshots

Backend route editor showing GPX upload meta box with automatically computed distance, elevation gain/loss, and route statistics 
Frontend interactive Leaflet map with elevation profile chart and POI category filters for enhanced user experience 
POI management screen with custom category icons and automatic route association based on configurable radius settings 
Settings page for configuring map tile provider, POI association radius, and display options
Installation
- Upload the plugin folder to
/wp-content/plugins/or install directly through the WordPress Plugins Add New screen. - Activate the plugin through the Plugins menu in WordPress.
- (Optional) Configure Settings:
- Go to Settings GTL Maps
- Set the POI-to-route association radius (default: 2km)
- Configure default map center coordinates if needed
- Create Your First Route:
- Navigate to Routes Add New
- Enter a route title and optional description
- Upload a GPX file in the “GPX Data” meta box
- Add route categories and difficulty level
- Click Publish
- Display the Map:
- Maps automatically appear on single route posts
- Use the
[gtlmaps]shortcode on any page:[gtlmaps id="123"]for specific route,[gtlmaps category="cycling"]for category - Add the Route Details widget to your sidebar via Appearance Widgets
Troubleshooting:
– If maps don’t display, check that JavaScript is enabled
– For GPX upload issues, ensure file is valid GPX format and under your server’s upload limit
– For more help, visit the support forum
For detailed GPX requirements and advanced shortcode options, see the FAQ section.
FAQ
-
How do I adjust the automatic POI-to-route radius?
-
Go to Settings GTL Maps and change the “Association radius (km)” option. This controls how far a POI can be from the route polyline to be considered related.
-
Can I customize the map tiles?
-
Yes. Filter or override the localized
GTLMaps.tilesJavaScript property, or dequeuegtl-frontand enqueue your own script variant that sets a different tile URL/provider. -
Does the plugin work without pretty permalinks?
-
The REST endpoints rely on the WordPress REST API, which functions with or without pretty permalinks. Ensure your site can serve
/wp-json/routes. -
How do I import GPX files?
-
Navigate to Routes Add New, enter a title for your route, then scroll to the “GPX Data” meta box. Click “Choose File” to upload your GPX file. Once uploaded, the plugin automatically computes distance, elevation gain/loss, and bounding coordinates. Click “Publish” to make the route live.
-
What GPX formats are supported?
-
The plugin supports standard GPX 1.0 and 1.1 formats with track points (trkpt), waypoints (wpt), and route data. Files exported from popular GPS apps like Strava, Garmin Connect, Komoot, and Ride with GPS work seamlessly.
-
Can I display maps without using shortcodes?
-
Yes! Maps automatically display above single route post content. You can also use the Route Details widget in your sidebar or the
[gtlmaps]shortcode for manual placement on any page. -
How do I add Points of Interest?
-
Go to POIs Add New, enter the POI details including coordinates (latitude and longitude), and assign a category. POIs within the configured radius (set in Settings GTL Maps) are automatically associated with nearby routes.
-
Can I customize map markers and icons?
-
Yes! Each POI category supports custom icons. When editing a POI category, upload an SVG or PNG icon file via the Media Library. The icon will display on the map for all POIs in that category.
-
Is the plugin compatible with page builders?
-
Yes! Use the
[gtlmaps]shortcode in any page builder that supports WordPress shortcodes, including Elementor, Beaver Builder, Divi, and Gutenberg blocks. -
How do I change the map tile provider?
-
The default tile provider is configurable via the
GTLMaps.tilesJavaScript property. You can filter or override this in your theme by dequeueing the plugin’s script and enqueueing your own with a different tile URL. OpenStreetMap, Mapbox, and other Leaflet-compatible providers are supported.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“GTL Maps” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “GTL Maps” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
