Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/digital-atlas/da-clinic-suite/archive/refs/heads/main.zipOne plugin for Digital Atlas dermatology sites. It replaces three plugins and adds blog author schema:
| Module | Replaces | Shortcode |
|---|---|---|
| Schema | Dermatology EEAT Master Authority Schema v2.8 | — (JSON-LD in <head>) |
| HIPAA Map | Freshpaint Map Shortcode + Admin v2.1 | [freshpaint_map] |
| Self-Scheduling | Phreesia Self-Scheduling Widget v2.4 | [phreesia_widget] |
| Blog Schema | — (new in 3.2) | — (edits Yoast's graph, or prints its own) |
Each module is switched on or off under Clinic Settings → Modules. A module that is off loads no code. Its shortcode renders nothing, so pages never show raw shortcode text.
Requires: Advanced Custom Fields PRO (options page, repeaters, relationship fields).
Clinic Settings
- Modules: the on/off switches for each module.
- Self-Scheduling: global Phreesia URL and the widget's starting height.
- HIPAA Map: zoom, zoom on click, marker colour, map height, location list on/off, booking link text.
- Locations: one row per clinic: name, phone, address, coordinates, hours, holidays, schema pages, Booking Page URL, optional per-location Phreesia URL. The schema module and the map both read from these rows, so the details only need entering once.
The Freshpaint environment ID is global (DACS_FRESHPAINT_ENV_ID in da-clinic-suite.php).
Shortcodes
[freshpaint_map]
[freshpaint_map height="600px" show_cards="false" focus="2" color="#307a99" zoom="12"]
focus takes a location number (1 = first row) or part of its name.
[phreesia_widget]
[phreesia_widget location="2" height="400"]
[phreesia_widget loading="eager"]
location uses that location's Phreesia URL, falling back to the global one. Several widgets can sit on one page. The iframe is lazy-loaded by default; use loading="eager" when the widget is at the top of the page (filter: dacs_scheduling_iframe_loading).
Moving a site to the suite
- Upload and activate Digital Atlas Clinic Suite. While an old plugin is still active, the matching module stays paused and a notice says so, so there's no duplicate schema and no shortcode clash.
- On the first admin page load the suite migrates the old map settings and matches the old map markers to clinic locations. A matched location gets the marker's coordinates if it has none, and the marker's link as its Booking Page URL if it has none. Any marker with no matching location is listed in a notice. The Phreesia URL uses the same field, so nothing moves.
- Deactivate and delete the three old plugins.
- Optional: delete the old Phreesia Connections options page and field group under ACF. The suite now owns that field.
The old plugins' options are left in place, so reactivating one still works.
ACF fields
acf-fields.json ships with the plugin and is registered as local field groups, so every site gets identical fields on update. Change fields in this file, not in a site's ACF admin, or sites will drift apart. Values are stored by field name, so existing data is kept.
Hooks:
dacs_treatment_post_types(array, defaulttreatment,services,service): post types that get the condition / procedure fields. Types a site doesn't have are ignored.dacs_treatment_post_type(string): older single-type version of the above. Returning anything other thantreatmentlimits the fields to that one type.dacs_location_page_post_types(array, defaultpage,location,locations,clinic,clinics): post types a location's "Display on Pages" field can link to.dacs_schema_treatment_post_types(array, defaulttreatment,service,services): post types that get condition / procedure schema.dacs_module_enabled(bool, module): force a module on or off in code.dacs_load_acf_json(bool): set false to manage the JSON groups yourself.dacs_blog_post_types(array, defaultpost): post types that get Blog Schema and the Author & Medical Review fields.dacs_provider_post_type(string, defaultteam): post type that holds providers.dacs_blog_author/dacs_blog_reviewer(int provider ID, post ID): override the detected author or reviewer.dacs_schema_clinic_employees(bool): set false to leave providers off the clinic entity.
Schema architecture
- Procedures:
MedicalProcedurewith body location, preparation, and the conditions treated. - Conditions:
MedicalConditionwith codes (ICD-10, SNOMED), epidemiology, risk factors, symptoms and sub-types (differentialDiagnosis). - Team:
Person+IndividualPhysician(physicians) orPerson, with credentials, education, expertise (knowsAbout), memberships, affiliations, profiles (sameAs) and NPI. Linked to the clinic throughworksForandpracticesAt. - Clinic / locations:
MedicalOrganization(primary) orMedicalClinicwith address, geo, opening hours, holidays, logo,sameAsand accepted insurance (oneadditionalProperty"Accepted insurance" per insurer). The primary clinic lists the Team providers asemployee. - Blog posts:
BlogPostingauthored by a provider: the post's Written by field, else the provider named in a "by …" byline, else the clinic. Medically reviewed by addsreviewedBy/lastReviewedto the WebPage. With Yoast SEO the module rewrites Yoast's Article into a BlogPosting and drops the WordPress user's Person node, so there is one graph per page.
Updates and releases
Sites update from GitHub Releases on Digital-Atlas/da-clinic-suite. Install the release zip on a site once by hand. After that, updates appear under Plugins like any other plugin, with auto-updates if you turn them on.
To release a new version:
- Make the change and test it on a local site.
- Bump the version in both places in
da-clinic-suite.php: theVersion:header andDACS_VERSION. - Add an entry to
changelog.md. - Commit, then tag and push:
git commit -am "v3.1.1: short description" git tag v3.1.1 git push && git push --tags - The Release GitHub Action checks that the tag matches the version, lints the PHP, builds
da-clinic-suite.zipand publishes the release. Sites see the update within about 12 hours, or right away with Check for updates on the Plugins screen.
To build the zip locally, run bin/build.sh; the zip lands in dist/da-clinic-suite.zip.
wp-config.php options:
define( 'DACS_GITHUB_TOKEN', 'github_pat_…' );: required only if the repo is made private. Use a fine-grained token with read-only Contents access to this one repo.define( 'DACS_DISABLE_UPDATES', true );: stops a site checking for updates.define( 'DACS_UPDATE_REPO', 'https://github.com/owner/repo/' );: point a site at a fork.