{"id":324478,"date":"2026-06-16T18:18:18","date_gmt":"2026-06-16T18:18:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/waypoints\/"},"modified":"2026-06-17T16:02:53","modified_gmt":"2026-06-17T16:02:53","slug":"waypoints-trip-planner","status":"publish","type":"plugin","link":"https:\/\/ne.wordpress.org\/plugins\/waypoints-trip-planner\/","author":23512925,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.0","requires":"6.8","requires_php":"8.2","requires_plugins":null,"header_name":"Waypoints: Trip Planner","header_author":"acodebeard","header_description":"A configurable day planning plugin for WordPress.","assets_banners_color":"","last_updated":"2026-06-17 16:02:53","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":46,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"acodebeard","date":"2026-06-17 16:02:53"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3576085,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3576085,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"waypoints\/planner":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"waypoints\/planner","title":"Waypoints: Trip Planner","category":"widgets","description":"Render the Waypoints: Trip Planner interface through the block editor.","textdomain":"waypoints-trip-planner","keywords":["planner","maps","waypoints"],"attributes":{"actionUrl":{"type":"string","default":""}},"supports":{"html":false},"editorScript":"waypoints-block-editor"}},"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3576085,"resolution":"1","location":"assets","locale":"","width":1176,"height":811}},"screenshots":{"1":"Add waypoints from categories or a search, then send the trip to Google Maps."}},"plugin_section":[],"plugin_tags":[2660,7140,267383],"plugin_category":[49],"plugin_contributors":[267384],"plugin_business_model":[],"class_list":["post-324478","plugin","type-plugin","status-publish","hentry","plugin_tags-maps","plugin_tags-planning","plugin_tags-wayfinding","plugin_category-maps-and-location","plugin_contributors-acodebeard","plugin_committers-acodebeard"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/waypoints-trip-planner\/assets\/icon-128x128.png?rev=3576085","icon_2x":"https:\/\/ps.w.org\/waypoints-trip-planner\/assets\/icon-256x256.png?rev=3576085","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/waypoints-trip-planner\/assets\/screenshot-1.png?rev=3576085","caption":"Add waypoints from categories or a search, then send the trip to Google Maps."}],"raw_content":"<!--section=description-->\n<p>Waypoints: Trip Planner adds a configurable trip-planning interface to a page or\npost. Visitors can search Google place results, add stops to a waypoint list,\nreorder their trip, preview the route when map embeds are configured, and open\nthe finished route in Google Maps.<\/p>\n\n<h3>Credits<\/h3>\n\n<p>Special thanks to <a href=\"https:\/\/github.com\/hagan\">Hagan<\/a> and\n<a href=\"https:\/\/github.com\/datapoke\">Datapoke<\/a> for development help.<\/p>\n\n<h3>Configuration<\/h3>\n\n<p>Manage settings in Settings &gt; Waypoints: Trip Planner.<\/p>\n\n<p>Current settings include:<\/p>\n\n<ul>\n<li>Default location label, address\/search phrase, latitude, longitude, and Place ID.<\/li>\n<li>Allowed start modes, max waypoints, result count, distance unit, map preview,\nand Google Maps handoff toggles.<\/li>\n<li>Editable categories and interface copy.<\/li>\n<li>Browser-facing Maps Embed API key.<\/li>\n<li>Server-side Places API and Geocoding API keys.<\/li>\n<li>Google API timeout and cache TTLs.<\/li>\n<li>Rate-limit value and trusted proxy CIDRs for public endpoint protection.<\/li>\n<li>Admin-only API call counter for troubleshooting request behavior.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>Waypoints: Trip Planner uses Google services for place results, place details,\ngeocoding, embedded map previews, and Google Maps handoff links.<\/p>\n\n<p>The plugin can send data to Google from the server when:<\/p>\n\n<ul>\n<li>a visitor runs a category or custom place search<\/li>\n<li>the plugin geocodes a configured or visitor-provided starting area<\/li>\n<li>the plugin resolves selected waypoint place details<\/li>\n<\/ul>\n\n<p>The plugin can also send data to Google from the visitor's browser when:<\/p>\n\n<ul>\n<li>the frontend loads a Google Maps Embed preview from <code>https:\/\/www.google.com\/maps\/embed\/v1\/search<\/code> or <code>https:\/\/www.google.com\/maps\/embed\/v1\/directions<\/code><\/li>\n<li>a visitor opens the generated Google Maps handoff link<\/li>\n<\/ul>\n\n<p>Depending on the interaction, data sent to Google can include:<\/p>\n\n<ul>\n<li>search phrases<\/li>\n<li>configured or visitor-provided starting locations<\/li>\n<li>selected Google Place IDs<\/li>\n<li>visitor IP address and the browser-facing Maps Embed API key when the browser loads an embedded map preview<\/li>\n<li>origin text plus waypoint and destination Place IDs when the browser loads an embedded directions preview<\/li>\n<li>route waypoint information needed to build map previews or handoff URLs<\/li>\n<\/ul>\n\n<p>Google provides these services. Review their terms and privacy information:<\/p>\n\n<ul>\n<li>https:\/\/policies.google.com\/privacy<\/li>\n<li>https:\/\/cloud.google.com\/maps-platform\/terms<\/li>\n<\/ul>\n\n<!--section=installation-->\n<p>Built release zip:<\/p>\n\n<ol>\n<li>Build or download the packaged <code>waypoints-trip-planner<\/code> release zip.<\/li>\n<li>Upload it through the Plugins screen in WordPress.<\/li>\n<li>Activate the plugin. Built release zips include generated Composer autoload files.<\/li>\n<\/ol>\n\n<p>Source checkout:<\/p>\n\n<ol>\n<li>Copy or symlink this plugin directory as <code>\/wp-content\/plugins\/waypoints-trip-planner\/<\/code>.<\/li>\n<li>Run <code>composer install<\/code> inside the plugin directory to generate\n   vendor\/autoload.php.<\/li>\n<li>Activate the plugin through the Plugins screen in WordPress.<\/li>\n<li>Open Settings &gt; Waypoints: Trip Planner and configure the required default location\nand Google API keys.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20do%20i%20need%20before%20using%20it%20on%20a%20live%20site%3F\"><h3>What do I need before using it on a live site?<\/h3><\/dt>\n<dd><p>Configure the required default location and Google API keys in Settings &gt;\nWaypoints: Trip Planner. For best results, restrict Google API keys in Google\nCloud Console and test the planner flow on a staging site before adding it to a\npublic page.<\/p><\/dd>\n<dt id=\"how%20do%20i%20display%20the%20planner%3F\"><h3>How do I display the planner?<\/h3><\/dt>\n<dd><p>Use the Waypoints: Trip Planner block in the block editor or add <code>[waypoints]<\/code>\nto a page, post, or Shortcode block. The optional <code>action_url<\/code> shortcode\nattribute and <code>Action URL<\/code> block setting can submit planner updates to a\nspecific page URL.<\/p><\/dd>\n<dt id=\"where%20is%20the%20developer%20documentation%3F\"><h3>Where is the developer documentation?<\/h3><\/dt>\n<dd><p>See the repository <code>docs\/<\/code> directory for installation, usage, admin, release,\narchitecture, settings, security, and troubleshooting notes.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Updated the WordPress.org submission name and slug to Waypoints: Trip Planner.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Added an admin control for briefly revealing saved Google API keys while checking copied values.<\/li>\n<li>Hardened Google API key settings against browser autofill and non-key values.<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Renamed the original public plugin surface to Waypoints, including the REST namespace, block name, preferred shortcode, release metadata, and package artifact.<\/li>\n<li>Added WordPress.org submission-readiness checks covering PHP quality, PHPStan, browser smoke tests, WordPress Plugin Check, release packaging, and metadata validation.<\/li>\n<li>Hardened the release artifact so it ships as a single <code>waypoints\/<\/code> plugin directory with production Composer autoload files and normalized file permissions.<\/li>\n<li>Added admin-only API request counting for troubleshooting Google API usage.<\/li>\n<li>Added contributor credits and clearer production installation, configuration, and external-service documentation.<\/li>\n<\/ul>\n\n<h4>0.5<\/h4>\n\n<ul>\n<li>Added block-editor and shortcode entry points that share the same planner renderer.<\/li>\n<li>Added admin-editable categories and interface copy settings.<\/li>\n<li>Added REST-powered planner interactions, rate limiting, and Google API admin tools.<\/li>\n<li>Added a reproducible release zip builder and manual release-process documentation.<\/li>\n<li>Added color mode controls, Noto Sans assets, and a cleaned-up settings interface.<\/li>\n<li>Added an upgrade cleanup that prunes removed interface-copy settings from existing installs.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial plugin scaffold (GH issue #20): directory structure, main plugin file, activation \/ deactivation hooks, uninstall routine, PSR-4 autoloading.<\/li>\n<\/ul>","raw_excerpt":"Adds a searchable trip planner with place search, waypoint ordering, route previews, and Google Maps handoff links.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/324478","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=324478"}],"author":[{"embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/acodebeard"}],"wp:attachment":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=324478"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=324478"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=324478"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=324478"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=324478"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=324478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}