{"id":393743,"date":"2026-10-30T16:37:32","date_gmt":"2026-10-30T16:37:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ptd-gtfs-schedules\/"},"modified":"2026-10-30T16:37:09","modified_gmt":"2026-10-30T16:37:09","slug":"ptd-gtfs-schedules","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/ptd-gtfs-schedules\/","author":23594047,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.2","stable_tag":"0.3.2","tested":"7.1.4","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"PTD GTFS Schedules","header_author":"PUBLICTRANSITDATA.NET","header_description":"Shows public transport schedules from a GTFS feed.","assets_banners_color":"fbfaf7","last_updated":"2026-10-30 16:37:09","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/publictransitdata\/WP-GTFS-schedules","header_author_uri":"https:\/\/publictransitdata.net\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":154,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.2":{"tag":"0.3.2","author":"icptd","date":"2026-10-30 16:37:09","revision":3775698}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3775698,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3775698,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3775698,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3775698,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3775698,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"ptd-gtfs-schedules\/lines":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"ptd-gtfs-schedules\/lines","title":"Lines","category":"widgets","icon":"editor-ol","description":"All lines of the network, grouped by transport mode.","keywords":["routes","network","timetable","GTFS"],"textdomain":"ptd-gtfs-schedules","attributes":{"modes":{"type":"array","items":{"type":"string"},"default":[]},"layout":{"type":"string","enum":["compact","destinations"],"default":"compact"},"tabs":{"type":"boolean","default":false},"nightLinesApart":{"type":"boolean","default":true},"headingLevel":{"type":"integer","default":2}},"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"editorScript":"file:.\/editor.js","style":"ptd-gtfs-schedules"},"ptd-gtfs-schedules\/line":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"ptd-gtfs-schedules\/line","title":"Line timetable","category":"widgets","icon":"calendar-alt","description":"The line a visitor chose in a Lines block. Put it on one page: every Lines block on the site links there.","keywords":["route","timetable","GTFS"],"textdomain":"ptd-gtfs-schedules","supports":{"html":false,"multiple":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"editorScript":"file:.\/editor.js","style":"ptd-gtfs-schedules"}},"tagged_versions":["0.3.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3775698,"resolution":"1","location":"assets","locale":"","width":1374,"height":845},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3775698,"resolution":"2","location":"assets","locale":"","width":1305,"height":834},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3775698,"resolution":"3","location":"assets","locale":"","width":1249,"height":521},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3775698,"resolution":"4","location":"assets","locale":"","width":1418,"height":905}},"screenshots":{"1":"A line page: the route diagram with its variants and the timetable of the chosen stop.","2":"The Lines block, grouped by transport mode.","3":"A departure board.","4":"The admin page: feed settings and import."}},"plugin_section":[],"plugin_tags":[289805,168886,4138,1612,54351],"plugin_category":[],"plugin_contributors":[289806],"plugin_business_model":[],"class_list":["post-393743","plugin","type-plugin","status-publish","hentry","plugin_tags-gtfs","plugin_tags-public-transport","plugin_tags-schedules","plugin_tags-timetable","plugin_tags-transit","plugin_contributors-icptd","plugin_committers-icptd"],"banners":{"banner":"https:\/\/ps.w.org\/ptd-gtfs-schedules\/assets\/banner-772x250.png?rev=3775698","banner_2x":"https:\/\/ps.w.org\/ptd-gtfs-schedules\/assets\/banner-1544x500.png?rev=3775698","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/ptd-gtfs-schedules\/assets\/icon.svg?rev=3775698","icon":"https:\/\/ps.w.org\/ptd-gtfs-schedules\/assets\/icon.svg?rev=3775698","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ptd-gtfs-schedules\/assets\/screenshot-1.png?rev=3775698","caption":"A line page: the route diagram with its variants and the timetable of the chosen stop."},{"src":"https:\/\/ps.w.org\/ptd-gtfs-schedules\/assets\/screenshot-2.png?rev=3775698","caption":"The Lines block, grouped by transport mode."},{"src":"https:\/\/ps.w.org\/ptd-gtfs-schedules\/assets\/screenshot-3.png?rev=3775698","caption":"A departure board."},{"src":"https:\/\/ps.w.org\/ptd-gtfs-schedules\/assets\/screenshot-4.png?rev=3775698","caption":"The admin page: feed settings and import."}],"raw_content":"<!--section=description-->\n<p>PTD GTFS Schedules turns the GTFS feed of a transport operator or authority into timetables on their WordPress site. Import the feed once, add a block to a page, and the timetables stay current as the feed is updated.<\/p>\n\n<h4>What it shows<\/h4>\n\n<ul>\n<li><strong>Lines<\/strong>: every line of the network, grouped by transport mode (trams, buses, night lines etc.), optionally in tabs. Each line links to its own page.<\/li>\n<li><strong>Line pages<\/strong>: the directions of a line, a diagram of its route with the stops and the variants some trips take (detours, short workings, trips starting or ending elsewhere), and the timetable of the chosen stop. Departures that have left are greyed out and the next one is highlighted.<\/li>\n<li><strong>Stop timetables<\/strong>: all departures from a stop on a given day, for every line or for one.<\/li>\n<li><strong>Departure boards<\/strong>: the next departures from a stop, updating themselves while the page is open.<\/li>\n<\/ul>\n\n<h4>For riders<\/h4>\n\n<ul>\n<li><strong>The next departure at a glance<\/strong>: departures that have left are greyed out and the next one is highlighted, and both move on as time passes.<\/li>\n<li><strong>No surprises about where a trip goes<\/strong>: trips that end early or take another way are marked with a letter, explained under the timetable: \"a \u2013 to City Stadium A\".<\/li>\n<li><strong>Only the stops they can use<\/strong>: stops where nobody can get on or off are left out, and riders see where to signal the driver (stops on request) and where they can only get on or only get off.<\/li>\n<li><strong>A clear picture of the route<\/strong>: the diagram shows where branches leave the route, where they come back and where some trips end.<\/li>\n<li><strong>For everyone<\/strong>: every icon and diagram has a text equivalent for screen readers, and the pages work without JavaScript.<\/li>\n<li><strong>Language support<\/strong>: English, Ukrainian and Polish.<\/li>\n<\/ul>\n\n<h4>For editors and admins<\/h4>\n\n<ul>\n<li>Blocks for the block editor and shortcodes for any page.<\/li>\n<li>Import from the feed's address or from an uploaded .zip file, then user can configure automatical update every night or week.<\/li>\n<li>Imports run in short steps with progress shown, so large feeds work on shared hosting too. Visitors keep seeing the old schedule until the new one is fully imported.<\/li>\n<li>A stop finder in the admin gives ready-to-paste shortcodes.<\/li>\n<li>WP-CLI command for imports from the server.<\/li>\n<\/ul>\n\n<h4>Shortcodes<\/h4>\n\n<ul>\n<li><code>[ptd_gtfs_lines]<\/code>: the list of lines. Options: <code>modes=\"tram,bus\"<\/code>, <code>layout=\"destinations\"<\/code>, <code>tabs=\"yes\"<\/code>, <code>night=\"mixed\"<\/code>, <code>heading=\"3\"<\/code>.<\/li>\n<li><code>[ptd_gtfs_line]<\/code>: the line page. Put it, or the Line timetable block, on one page: every list of lines links there.<\/li>\n<li><code>[ptd_gtfs_timetable stop=\"123\"]<\/code>: the timetable of a stop; add <code>route=\"7\"<\/code> for one line only.<\/li>\n<li><code>[ptd_gtfs_departures stop=\"123\" limit=\"8\"]<\/code>: the next departures from a stop.<\/li>\n<\/ul>\n\n<h4>Supported GTFS<\/h4>\n\n<p>The plugin reads agency.txt, stops.txt, routes.txt, trips.txt, stop_times.txt, calendar.txt and calendar_dates.txt, including extended route types, times after midnight and stations with several platforms. Trips described only with frequencies.txt are not shown yet, and the times are the scheduled ones (no GTFS Realtime).<\/p>\n\n<h4>Feedback<\/h4>\n\n<p>Something does not work, or a feature is missing? Open an issue on <a href=\"https:\/\/github.com\/publictransitdata\/WP-GTFS-schedules\/issues\">GitHub<\/a> or write to contact@publictransitdata.net.<\/p>\n\n<h3>External services<\/h3>\n\n<p>The plugin does not use any service of its own. It downloads the GTFS feed only from the address that the site's administrator enters in its settings, when an import runs: by hand, or automatically if automatic updates are switched on. No data about the site or its visitors is sent with the request.<\/p>\n\n<p>Departure boards update themselves through the site's own REST API; nothing is requested from other sites.<\/p>\n\n<h3>Credits<\/h3>\n\n<p>Icons from other projects, both under the MIT licence:<\/p>\n\n<ul>\n<li>The arrow: @icons by Valentin Fossati (https:\/\/github.com\/Voxybuns\/at-icons).<\/li>\n<li>The \"on request\" hand: Tabler Icons (https:\/\/tabler.io\/icons).<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Open <strong>GTFS Schedules<\/strong> in the admin menu. Enter the address of your GTFS feed, or upload its .zip file, and import it.<\/li>\n<li>Add the <strong>Lines<\/strong> block to a page, for example the home page.<\/li>\n<li>Create one page with the <strong>Line timetable<\/strong> block. Every Lines block on the site links to it.<\/li>\n<li>To show a single stop, look it up under <strong>Find a stop<\/strong> and paste its shortcode into any page.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20i%20get%20a%20gtfs%20feed%3F\"><h3>Where do I get a GTFS feed?<\/h3><\/dt>\n<dd><p>Many transport authorities publish theirs as open data, you can export a GTFS feed from your scheduling system, or contact us: we can help your company or municipality create and maintain one.<\/p><\/dd>\n<dt id=\"my%20feed%20is%20larger%20than%20the%20upload%20limit.\"><h3>My feed is larger than the upload limit.<\/h3><\/dt>\n<dd><p>Import it from its public address instead, or with WP-CLI on the server: <code>wp ptd-gtfs-schedules import --file=feed.zip<\/code>.<\/p><\/dd>\n<dt id=\"how%20often%20is%20the%20timetable%20updated%3F\"><h3>How often is the timetable updated?<\/h3><\/dt>\n<dd><p>As often as you choose in the settings: daily, weekly or manually. Automatic updates import from the feed's address at night through WP-Cron. On sites with little traffic, set up a real cron job for wp-cron.php, or run <code>wp ptd-gtfs-schedules import<\/code> from the server's cron. Automatic updates replace data imported from an uploaded file.<\/p><\/dd>\n<dt id=\"can%20i%20link%20lines%20to%20my%20own%20pages%3F\"><h3>Can I link lines to my own pages?<\/h3><\/dt>\n<dd><p>Use the <code>ptd_gtfs_schedules_line_url<\/code> filter to give each line the address you want. The <code>ptd_gtfs_schedules_is_night_line<\/code> filter decides which lines count as night lines, and the <code>ptd_gtfs_schedules_imported<\/code> action runs after every import.<\/p><\/dd>\n<dt id=\"how%20do%20i%20credit%20the%20data%20publisher%3F\"><h3>How do I credit the data publisher?<\/h3><\/dt>\n<dd><p>Many open data licences require it. Enter the credit under <strong>Data source credit<\/strong> in the settings, and it is shown under the timetables.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<\/ul>","raw_excerpt":"Public transport timetables from a GTFS feed: lists of lines, line pages with route diagrams, stop times and departure boards.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=393743"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/icptd"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393743"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393743"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393743"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393743"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393743"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}