{"id":347749,"date":"2026-09-09T17:41:18","date_gmt":"2026-09-09T17:41:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/omniply-connect\/"},"modified":"2026-09-09T17:41:04","modified_gmt":"2026-09-09T17:41:04","slug":"omniply-connect","status":"publish","type":"plugin","link":"https:\/\/bal.wordpress.org\/plugins\/omniply-connect\/","author":8088297,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.0.4","requires":"5.5","requires_php":"7.4","requires_plugins":null,"header_name":"Omniply Connect","header_author":"Omniply","header_description":"Prints the structured-data (JSON-LD) block managed by your Omniply marketing platform in the site head. Print-only: this plugin executes no remote code and stores a single validated JSON option.","assets_banners_color":"","last_updated":"2026-09-09 17:41:04","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/omniply.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":35,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.0":{"tag":"1.1.0","author":"VeitMehler","date":"2026-09-09 17:41:04","revision":3688777}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[14160,2516,1117,186,1121],"plugin_category":[55],"plugin_contributors":[279988],"plugin_business_model":[],"class_list":["post-347749","plugin","type-plugin","status-publish","hentry","plugin_tags-chat-widget","plugin_tags-json-ld","plugin_tags-schema","plugin_tags-seo","plugin_tags-structured-data","plugin_category-seo-and-marketing","plugin_contributors-veitmehler","plugin_committers-veitmehler"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/omniply-connect.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Omniply Connect is a deliberately minimal companion plugin for clinics using the\nOmniply marketing platform. It does two things, each off by default:<\/p>\n\n<ol>\n<li>It prints a validated JSON-LD structured-data block (your clinic's name,\naddress, opening hours, booking link and FAQ) in your site's head, where\nsearch engines and AI answer surfaces read it.<\/li>\n<li>It embeds your clinic's Omniply chat widget in the site footer \u2014 but only\nafter a widget token has been configured (see below).<\/li>\n<\/ol>\n\n<ul>\n<li>The JSON-LD path is print-only: it never executes remote code and phones\nhome to nothing. The entire state is a single validated JSON string.<\/li>\n<li>The chat widget, when enabled, loads exactly one script from the fixed\nOmniply platform domain (<code>svc.omniply.io<\/code>). The script URL is a constant in\nthe plugin source \u2014 the stored token selects WHICH clinic's widget loads,\nnever WHERE the script comes from. With no token stored, nothing is loaded\nat all. Conversations typed into the widget are processed by the Omniply\nplatform on behalf of your clinic (see your Omniply agreement for details).<\/li>\n<li>Updated by your platform: both options are written through the WordPress\nREST API using the same Application Password connection you created for\npublishing \u2014 administrator capability (<code>manage_options<\/code>) is required.<\/li>\n<li>No settings screen, no dashboard widgets, no notices. Deactivate or uninstall\nat any time; uninstalling removes the stored options.<\/li>\n<\/ul>\n\n<p>This plugin is intended for Omniply customers, but the stored state is plain:\nyou can inspect the schema block under the <code>omniply_head_jsonld<\/code> option (or\n    GET \/wp-json\/omniply\/v1\/head as an administrator) and the widget token under\n    omniply_widget_token (or <code>GET \/wp-json\/omniply\/v1\/widget<\/code>).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin through Plugins \u2192 Add New (or upload the ZIP via\nPlugins \u2192 Add New \u2192 Upload Plugin) and activate it.<\/li>\n<li>No further setup is needed on the site itself: the plugin has no settings\nscreen and stores no data on activation.<\/li>\n<li>IMPORTANT \u2014 the plugin prints nothing until a structured-data block has\nbeen written to it. On a fresh activation the stored option is empty, and\nan empty option produces NO output in the page source. This is by design\n(print-only, empty state = silent).<\/li>\n<\/ol>\n\n<p>The block is written in one of two ways:<\/p>\n\n<ul>\n<li>Automatically, by the Omniply platform: when you connect your site in\nOmniply using a WordPress Application Password for an administrator\naccount, the platform posts your clinic's JSON-LD to\n  POST \/wp-json\/omniply\/v1\/head. From then on the block appears in your\nsite head and is kept up to date whenever your details change.<\/li>\n<li><p>Manually, by any administrator \u2014 useful for testing that the plugin works\nwithout an Omniply account. For example, with WP-CLI:<\/p>\n\n<p>wp option update omniply_head_jsonld '[{\"@context\":\"https:\/\/schema.org\",\"@type\":\"MedicalClinic\",\"name\":\"Test Clinic\"}]'<\/p>\n\n<p>or over REST with an Application Password:<\/p>\n\n<p>curl -X POST 'https:\/\/YOURSITE\/?rest_route=\/omniply\/v1\/head' -u 'admin:APP_PASSWORD' -H 'Content-Type: application\/json' -d '{\"jsonld\":[{\"@context\":\"https:\/\/schema.org\",\"@type\":\"MedicalClinic\",\"name\":\"Test Clinic\"}]}'<\/p><\/li>\n<\/ul>\n\n<p>After either of these, reload any front-end page and view the source: the\nblock appears in the head between <code>&lt;!-- Omniply Connect --&gt;<\/code> markers. Sending\nan empty <code>jsonld<\/code> value (or deleting the option) removes the output again.<\/p>\n\n<p>The chat widget works the same way: it renders nothing until a widget token\nhas been written, normally by the Omniply platform when your site is\nconnected. To set one manually as an administrator:<\/p>\n\n<pre><code>  curl -X POST 'https:\/\/YOURSITE\/?rest_route=\/omniply\/v1\/widget' -u 'admin:APP_PASSWORD' -H 'Content-Type: application\/json' -d '{\"token\":\"YOUR_WIDGET_TOKEN\"}'\n<\/code><\/pre>\n\n<p>The token (shown in your Omniply dashboard under Chat Assistant) must match\n    [A-Za-z0-9_-]{16,64}; anything else is rejected. Sending an empty <code>token<\/code>\nremoves the widget again.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"i%20activated%20the%20plugin%20but%20there%20is%20no%20json-ld%20in%20my%20page%20source\"><h3>I activated the plugin but there is no JSON-LD in my page source<\/h3><\/dt>\n<dd><p>That is the expected state of a fresh install. The plugin only prints the\nblock after one has been written to it \u2014 either by the connected Omniply\nplatform or manually by an administrator (see Installation). While the\nstored option is empty, the plugin outputs nothing at all.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20collect%20any%20data%3F\"><h3>Does this plugin collect any data?<\/h3><\/dt>\n<dd><p>The plugin itself collects nothing: it stores two options locally and prints\nthem. If (and only if) a chat-widget token has been configured, the embedded\nOmniply widget behaves like any live-chat product: messages a visitor types\ninto it are sent to the Omniply platform to generate replies for your clinic.\nWith no token stored, no external request of any kind is made.<\/p><\/dd>\n<dt id=\"does%20it%20load%20external%20scripts%3F\"><h3>Does it load external scripts?<\/h3><\/dt>\n<dd><p>Only one, and only when the chat widget has been enabled by storing a widget\ntoken: the widget loader from the fixed Omniply platform domain\n(<code>svc.omniply.io<\/code>). That URL is a constant in the plugin source and cannot be\nchanged by any stored option. A fresh install loads nothing.<\/p><\/dd>\n<dt id=\"can%20it%20run%20arbitrary%20code%3F\"><h3>Can it run arbitrary code?<\/h3><\/dt>\n<dd><p>No. The JSON-LD input is parsed as JSON and re-encoded on output; anything\nthat is not valid JSON is rejected and never printed. The widget token is\nvalidated against a strict character whitelist before it is stored or printed,\nand it only ever appears as a data attribute on the fixed-URL script tag.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: optional Omniply chat-widget embed (fixed-domain loader script,\nenabled only by storing a validated widget token; REST route\n  \/omniply\/v1\/widget for the connected platform to configure it).<\/li>\n<li>Uninstall now removes the widget token option as well.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: head JSON-LD printing + authenticated REST write route.<\/li>\n<\/ul>","raw_excerpt":"Prints the structured-data (JSON-LD) block managed by your Omniply marketing platform in the site head, and optionally embeds your Omniply chat widget &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/347749","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=347749"}],"author":[{"embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/veitmehler"}],"wp:attachment":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=347749"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=347749"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=347749"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=347749"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=347749"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=347749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}