{"id":24109304,"url":"https://github.com/gsarig/ootb-openstreetmap","last_synced_at":"2026-03-10T06:31:22.001Z","repository":{"id":112744109,"uuid":"294930245","full_name":"gsarig/ootb-openstreetmap","owner":"gsarig","description":"A map block for WordPress' Gutenberg Editor which uses OpenStreetMap and Leaflet.js. It needs no API keys and works out of the box. Benefiting from Gutenberg’s potential, the plugin tries a different take on how to add your locations on the map and rethinks a few things, UX-wise. Install it from https://wordpress.org/plugins/ootb-openstreetmap/","archived":false,"fork":false,"pushed_at":"2026-03-02T23:30:38.000Z","size":42560,"stargazers_count":34,"open_issues_count":35,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-03-03T01:27:56.642Z","etag":null,"topics":["gutenberg","leafletjs","markers","multiple-markers","openstreetmap","wordpress"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gsarig.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"gsarig"}},"created_at":"2020-09-12T11:29:09.000Z","updated_at":"2026-02-28T20:55:04.000Z","dependencies_parsed_at":"2023-05-27T07:49:20.377Z","dependency_job_id":"99414718-09d6-438f-b760-e5d75c437e45","html_url":"https://github.com/gsarig/ootb-openstreetmap","commit_stats":null,"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/gsarig/ootb-openstreetmap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsarig%2Footb-openstreetmap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsarig%2Footb-openstreetmap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsarig%2Footb-openstreetmap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsarig%2Footb-openstreetmap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gsarig","download_url":"https://codeload.github.com/gsarig/ootb-openstreetmap/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gsarig%2Footb-openstreetmap/sbom","scorecard":{"id":1244254,"data":{"date":"2026-03-02T02:17:14Z","repo":{"name":"github.com/gsarig/ootb-openstreetmap","commit":"3bd36c4a063e16f173907ee16c4c19471b63112e"},"scorecard":{"version":"v5.0.0","commit":"ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4"},"score":4.9,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#binary-artifacts"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#branch-protection"}},{"name":"CI-Tests","score":10,"reason":"1 out of 1 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#ci-tests"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#cii-best-practices"}},{"name":"Code-Review","score":0,"reason":"Found 0/1 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#code-review"}},{"name":"Contributors","score":3,"reason":"project has 1 contributing companies or organizations -- score normalized to 3","details":["Info: 10up contributor org/company found, "],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#contributors"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#dangerous-workflow"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#dependency-update-tool"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#fuzzing"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#license"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":3,"reason":"dependency not pinned by hash detected -- score normalized to 3","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/assets.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/assets.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/assets.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/assets.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:128: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:129: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:133: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:137: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:159: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:179: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:181: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:186: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:238: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:259: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:260: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:263: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:83: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:84: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:93: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:106: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-release.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/github-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scorecard.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/scorecard.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/scorecard.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/scorecard.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scorecard.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/scorecard.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scorecard.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/gsarig/ootb-openstreetmap/scorecard.yml/master?enable=pin","Info:   0 out of  26 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   8 third-party GitHubAction dependencies pinned","Info:   5 out of   5 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (30) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#sast"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 2.9.0 not signed: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/291681182","Warn: release artifact 2.8.9 not signed: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/268138171","Warn: release artifact 2.8.8 not signed: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/228623271","Warn: release artifact 2.8.7 not signed: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/213702618","Warn: release artifact 2.8.6 not signed: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/203177579","Warn: release artifact 2.9.0 does not have provenance: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/291681182","Warn: release artifact 2.8.9 does not have provenance: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/268138171","Warn: release artifact 2.8.8 does not have provenance: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/228623271","Warn: release artifact 2.8.7 does not have provenance: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/213702618","Warn: release artifact 2.8.6 does not have provenance: https://api.github.com/repos/gsarig/ootb-openstreetmap/releases/203177579"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#signed-releases"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:62","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:117","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:175","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:256","Info: jobLevel 'actions' permission set to 'read': .github/workflows/ci.yml:255","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:18","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci.yml:41","Info: jobLevel 'contents' permission set to 'read': .github/workflows/scorecard.yml:19","Info: jobLevel 'actions' permission set to 'read': .github/workflows/scorecard.yml:20","Warn: no topLevel permission defined: .github/workflows/assets.yml:1","Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/github-release.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard.yml:10","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#token-permissions"}},{"name":"Vulnerabilities","score":4,"reason":"6 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-23c5-xmqv-rm74","Warn: Project is vulnerable to: GHSA-3ppc-4f35-3m26","Warn: Project is vulnerable to: GHSA-7r86-cg39-jmmj","Warn: Project is vulnerable to: GHSA-5c6j-r48x-rmvq","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/ea7e27ed41b76ab879c862fa0ca4cc9c61764ee4/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2026-03-03T01:27:58.908Z","repository_id":112744109,"created_at":"2026-03-03T01:27:58.908Z","updated_at":"2026-03-03T01:27:58.908Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30326891,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T05:25:20.737Z","status":"ssl_error","status_checked_at":"2026-03-10T05:25:17.430Z","response_time":106,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gutenberg","leafletjs","markers","multiple-markers","openstreetmap","wordpress"],"created_at":"2025-01-11T00:15:24.526Z","updated_at":"2026-03-10T06:31:21.961Z","avatar_url":"https://github.com/gsarig.png","language":"PHP","funding_links":["https://github.com/sponsors/gsarig"],"categories":[],"sub_categories":[],"readme":"[![Download from WordPress.org](.wordpress-org/banner-1544-500.jpg)](https://wordpress.org/plugins/ootb-openstreetmap/)\n\n# Out of the Block: OpenStreetMap\n\nA map block for WordPress' Gutenberg Editor which uses [OpenStreetMap](https://www.openstreetmap.org) and [Leaflet.js](http://https://leafletjs.com). It needs no API keys and works out of the box (or, out of the Block, if you prefer). Benefiting from Gutenberg's potential, the plugin tries a different take on how to add your locations on the map and rethinks a few things, UX-wise.\n\nInstead of manually adding coordinates for each one of your markers, just click-and-drop them directly on the map. You want to adjust their position? Just drag them wherever you want. And instead of filling-in custom fields to set each marker's popup content, just open that popup and start writing in it, the Gutenberg way (it supports WYSIWYG editing, with links, images, and all). It even stores the map's zoom level as you use it so that you don't have to set it by hand.\n\n---\n\n👇 [**Jump to the available Hooks**](#hooks)🪝\n\n👇 [**Jump to the available Shortcodes**](#shortcodes)\n\n---\n\n👉 [Read more about the overall UX challenges](https://www.gsarigiannidis.gr/wordpress-gutenberg-map-block-openstreetmap/)\n\n👉 [The challenges of building a user-friendly place search for OpenStreetMap](https://www.gsarigiannidis.gr/openstreetmap-place-search/)\n\n👉 [Lessons learned from integrating OpenAI to a WordPress plugin](https://www.gsarigiannidis.gr/openstreetmap-openai-integration/)\n\n\n## Demos\n\n### The main functionality, with drag and drop pins and WYSIWYG editing\n![Demo GIF](.wordpress-org/screenshot-1.gif)\n\n### Using the location search\n![Demo GIF](.wordpress-org/screenshot-2.gif)\n\n### Drawing a polygon\n\n![Demo GIF](.wordpress-org/screenshot-9.gif)\n\n### Drawing a polyline\n\n![Demo GIF](.wordpress-org/screenshot-10.gif)\n\n### AI integration in action:\n\n![Demo GIF](.wordpress-org/screenshot-12.gif)\n\n## Features\n\n* No need for API keys. Just install and use it.\n* Support for multiple markers.\n* Support for a different icon per marker.\n* Support for polygons and polylines.\n* [Dead-simple interface](https://www.gsarigiannidis.gr/wordpress-gutenberg-map-block-openstreetmap/). Don't search for coordinates and don't get overwhelmed by too many fields when using multiple markers. Just point and click on the map to add your marker where you want it and edit it's popup content directly from there.\n* [Place search](https://www.gsarigiannidis.gr/openstreetmap-place-search/). Find locations by typing keywords.\n* Remembers the zoom that you set when adding the markers and stores it so that you don't set it by hand (which you can do anyway if you prefer).\n* AI integration which allows you to add markers by using commands in natural language. Just say \"please\" to activate (e.g. \"Please, show me where GOT was filmed\"). Requires an API key from an AI provider. [Read more](https://www.gsarigiannidis.gr/openstreetmap-openai-integration/).\n* Query Maps: Supports creating a map out of maps added on other posts or post types. This can be quite powerful when, for example, you have a custom post type for \"Places\" with each place having its own map, and you want to dynamically gather-up all the places on a single map.\n* Shortcode support: You can use the shortcode `[ootb_query]` as an alternative way to use the aforementioned Query Maps feature (see the FAQ for more info).\n* Support for a location custom field, which can be used to store a post's or post type's location, following the [Geodata guidelines](https://codex.wordpress.org/Geodata). Read more in the [v.2.8.0 release notes](https://github.com/gsarig/ootb-openstreetmap/releases/tag/2.8.0).\n* Adjust the map height.\n* Change the default marker icon with a custom one.\n* Enable or disable map dragging.\n* Enable or disable touch zoom.\n* Enable or disable double-click zoom.\n* Enable or disable scroll wheel zoom.\n* Set a minimum and maximum limit that the user can zoom on the frontend. Setting the same value to both fields will lock the zoom at that level.\n* Support for other Layer Providers: MapBox (using your own API key) and Stamen.\n* Option to export locations in a JSON file\n* Option to import locations from a JSON file\n\n## Installation\n\n1. Upload the plugin to your WordPress plugins directory and activate it.\n2. That's it. You can go to a post/page that supports the Gutenberg editor and start using the block called \"Out of the Block: OpenStreetMap\"\n\n## Frequently Asked Questions\n\n### Do I need an API key, like with Google Maps?\n\nNo.\n\nThat's the point, actually. Just install the plugin and start adding maps. Keep in mind, though, that as stated on the [OpenStreetMap Tile Usage Policy](https://operations.osmfoundation.org/policies/tiles/), OSM’s own servers are run entirely on donated resources and they have strictly limited capacity. Using them on a site with low traffic will probably be fine. Nevertheless, you are advised to create an account to [MapBox](https://www.mapbox.com/) and get a free API Key.\n\n### How can I add a custom Mapbox style?\nYou can find the style URL on [Mapbox Studio](https://www.mapbox.com/studio/). There, use the \"Share\" button, and under \"Developer resources\", copy the \"Style URL\". It should look like that: `mapbox://styles/username/style-id`. You can declare a global style on the plugin's settings, to be used as a default for all the maps, or you can set a custom style for each map, by using the block's settings panel.\n\n### How do I add a new location?\n\nTo add a location, left-click on the map for a while, until you see the prompt saying \"Release to drop a marker here\". On browsers that support it, the cursor transforms from hand to crosshair, to make it even more apparent. As long as the prompt is visible, it means that releasing the click will drop the marker at that spot. That slight delay has been added to prevent you from accidentally adding markers all over the place with every click.\n\n### How do I remove a location?\n\nClick on the marker to open up its popup. There, you will see the \"Remove\" button.\n\n### I can't find some of the options like disable dragging, setting zoom levels, etc\n\nCheck under the \"Map behavior\" section, at the blocks' settings at the sidebar on the right. It's toggled off by default, that's probably why you missed it.\n\n### How does the AI integration work?\n\nFirst of all, you will need to create an account to an AI provider (like [OpenAI](https://openai.com/), [Gemini](https://gemini.google.com/), [Anthropic](https://console.anthropic.com/) or similar) and get an API key. Then, go to the plugin's settings page and paste your API provider's endpoint URL, Model and API key there. After that, you can start adding markers by using commands in natural language. Just say \"please\" to activate (e.g. \"Please, show me where GOT was filmed\"). Please keep in mind, though, that it's like asking ChatGPT, Claude or any other AI Assistant: the answers you get might not always be 100% reliable, and you should always double-check to confirm their accuracy. [Read more](https://www.gsarigiannidis.gr/openstreetmap-openai-integration/).\n\n### How can I query maps from other posts or post types?\nOn the block's side panel, Select the \"Map data\" panel and click on the \"Fetch locations\" button. This will automatically retrieve on the frontend all the markers from your posts (you can also select a specific post type from the dropdown). The block will be locked from editing, as the markers will be dynamically retrieved from the selected posts. If you don't want that, there is a \"Stop syncing\" button that will unlock the block, drop the markers on the map and allow you to edit.\n\n## Shortcodes\n### [ootb_query]\nThe shortcode `[ootb_query]` allows you to display a dynamic map, which retrieves markers from other posts or post types. Just add it to a post or page and you're good to go. By default, it will fetch the markers from the 100 most recent posts. The shortcode supports the following attributes:\n* source: (Optional) The source of the data. Can be either `geodata`, if you want to retrieve the posts based on their Location custom meta field, or `block`, to retrieve posts containing map blocks in their content. The default option, which will be used if the attribute is omitted, is `block`.\n* post_type: (Optional) The type of post to query. By default, it is set to `post`.\n* posts_per_page: (Optional) The number of posts to be displayed on page. Default value is `100`.\n* post_ids: (Optional) Comma-separated IDs of the posts to include in the query.\n* height: (Optional) The desired height for the map. Default value is empty, which falls back to `400px`.\n* provider: (Optional) Specifies the map provider. Options are: `openstreetmap`, `mapbox` and `stamen`. The default value is an empty string which falls back to `openstreetmap`.\n* maptype: (Optional) Specifies the type of map. Options are: `markers`, `polygon` and `polyline`. The default value is an empty string, which will fall back to `markers`.\n* touchzoom: (Optional) If set, touch zoom will be enabled on the map. It can be either `true` or `false`. The default value is an empty string, which falls back to `true`.\n* scrollwheelzoom: (Optional) If set, enables zooming on the map with mouse scroll wheel. It can be either `true` or `false`. The default value is an empty string, which falls back to `true`.\n* dragging: (Optional) If set, dragging is enabled on the map. It can be either `true` or `false`. The default value is an empty string, which falls back to `true`.\n* doubleclickzoom: (Optional) If set, allows zooming in on the map with a double click. It can be either `true` or `false`. The default value is an empty string, which falls back to `true`.\n* marker: (Optional) Specifies the marker for the map. This should correspond to the URL of the image that you want to use as the marker's icon (example: `https://www.example.com/my-custom-icon.png`). The default value is an empty string, which retrieves the default marker.\n\nHere's an example of how you can use it:\n```\n[ootb_query post_type=\"post\" post_ids=\"1,2,3,4\" height=\"400px\" provider=\"mapbox\" maptype=\"polygon\" touchzoom=\"true\" scrollwheelzoom=\"true\" dragging=\"true\" doubleclickzoom=\"true\" marker=\"https://www.example.com/my-custom-icon.png\"]\n```\n## Hooks\nThere are a few hooks that you can use to further customize the plugin's behavior. Here they are:\n\n### ootb_query_post_type\nAllows you to change the post type that the plugin will query for markers. By default, it is set to `post`. You can pass multiple post types as an array. Example:\n```\nadd_filter( 'ootb_query_post_type', function() { return array( 'post', 'page' ); } );\n```\n\n### ootb_query_posts_per_page\nAllows you to change the number of posts that the plugin will query for markers. By default, it is set to `100`. Example:\n```\nadd_filter( 'ootb_query_posts_per_page', function() { return 500; } );\n```\n\n### ootb_query_extra_args\nAllows you to add extra arguments to the query that the plugin will use to retrieve markers. By default, it is set to an empty array. Example:\n```\n  add_filter(\n     'ootb_query_extra_args',\n     function() {\n        return [\n           'tax_query' =\u003e [\n           [\n              'taxonomy' =\u003e 'people',\n              'field' =\u003e 'slug',\n              'terms' =\u003e 'bob'\n           ]\n        ];\n     }\n  );\n```\nKeep in mind that the extra args will be merged with the default ones, so you don't have to worry about overriding them. In fact, the args that are required for the query to work, cannot be overridden.\n\n### ootb_cf_modal_content\nAllows you to change the content of the modal that appears when you query posts based on their \"Location\" custom fields. By default, it will display the value set in the Address field. For example, the following code will display the post's title, thumbnail, excerpt and a link to the post:\n```\nadd_filter( 'ootb_cf_modal_content', 'my_modal_content', 10, 2 );\n\nfunction my_modal_content( $address, $post_id ) {\n\n\treturn sprintf(\n\t\t'\u003cdiv\u003e\n\t\t\t\u003ch3\u003e%1$s\u003c/h3\u003e\n\t\t\t\u003cfigure\u003e%2$s\u003c/figure\u003e\n\t\t\t\u003cp\u003e%3$s\u003c/p\u003e\n\t\t\t\u003cp\u003e\u003ca href=\"%4$s\"\u003eView post\u003c/a\u003e\u003c/p\u003e\n\t\t\u003c/div\u003e',\n\t\tget_the_title( $post_id ),\n\t\tget_the_post_thumbnail( $post_id, 'thumbnail' ),\n\t\thas_excerpt( $post_id ) ? get_the_excerpt( $post_id ) : $address,\n\t\tget_the_permalink( $post_id )\n\t);\n}\n```\nKeep in mind that this filter will only work for the queries based on the \"Location\" custom fields. If you want to modify the content of the markers on standard blocks, see the next hook.\n\n### ootb_block_marker_text\nThis filter allows customizing the text content that appears in marker popups. It's particularly useful when querying maps from other posts, as it provides the ability to customize the popup content for each marker. The filter accepts three parameters:\n* `$marker_text`: The original text content of the marker.\n* `$post_id`: The ID of the post where the marker was defined.\n* `$current_post_id` The ID of the current post where the map is being displayed.\n\nExample:\n```\nadd_filter( 'ootb_block_marker_text', 'customize_marker_text', 10, 3 );\n\nfunction customize_marker_text($text, $post_id, $current_post_id) {\n\n    // Only modify content if we're showing markers from other posts\n    if ($post_id !== $current_post_id) {\n        // Get post title and URL\n        $post_title = get_the_title( $post_id );\n        $post_url   = get_permalink( $post_id );\n\n        // Add a simple header with link above the original content\n        $text = sprintf('\u003ch4\u003e\u003ca href=\"%s\"\u003e%s\u003c/a\u003e\u003c/h4\u003e%s',\n\t\tesc_url($post_url),\n\t\tesc_html($post_title),\n\t\t$text\n\t);\n    }\n\n    return $text;\n}\n```\n\n### ootb_cf_marker_icon\nAllows you to change the marker icon for posts that have a \"Location\" custom field. By default, it will use the default marker. For example, the following code will use a custom marker for a post with ID `123`:\n```\nadd_filter( 'ootb_cf_marker_icon', 'my_marker_icon', 10, 2 );\n\nfunction my_marker_icon( $icon_url, $post_id ){\n\tif( 123 === $post_id ) {\n\t\t$icon_url = 'https://example.com/my-marker.jpg';\n\t}\n\treturn $icon_url;\n}\n```\n\n## Screenshots\n\n![The map editing screen](.wordpress-org/screenshot-3.jpg)\nThe map editing screen\n\n![Map behavior options](.wordpress-org/screenshot-4.jpg)\nMap behavior options\n\n![Adding a marker](.wordpress-org/screenshot-5.jpg)\nAdding a marker\n\n![Using custom markers](.wordpress-org/screenshot-6.jpg)\nUsing custom markers\n\n![Place search](.wordpress-org/screenshot-7.jpg)\nPlace search\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgsarig%2Footb-openstreetmap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgsarig%2Footb-openstreetmap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgsarig%2Footb-openstreetmap/lists"}