Ariel Changelog

Changelog

14.2.2

Presence tracking no longer loads profile data from Play unnecessarily [*]

Fixes

  • Replace WP_Query in get_active_slack_users() with a direct query against the presence table, removing the blog switch and the profile post load
  • Drop the second blog switch in record_user_presence() that fetched slack_status and slack_handle from post meta; values already in the presence table row are used directly
  • Load only airtable_uuid, email, and full_name from the Play blog in post_presence_to_iti(); skip the load entirely when post_id is 0

14.2.1

Presence cron scheduling now runs once on upgrade rather than on every admin request [*]

Fixes

  • Version-gate schedule_slack_presence_cron_event() at 14.2.1 so it runs once per installation on upgrade, not on every admin request

14.2.0

Bot users tracked in presence table and membership events record last-seen date [*]

New

  • Add process_bot_user() — bots are now upserted directly into the presence table on user_change events, using post_id = 0 since bots have no profile; op is set to create or update based on whether a row already exists

Improvements

  • Call process_activity_event() from process_user_event() so that team_join and user_change events also update the member’s last_seen_date

Fixes

  • Remove the is_bot early-return from process_team_join() and process_user_change() — bot events are now intercepted in process_user_event() before reaching those methods, so the guards were dead code
  • Ensure the nightly presence poller is scheduled on every admin request to the Play site, registering it if missing without switching blog context

14.1.0

Slim cached ventures and add a cache-warming CLI command [*]

New

  • Add warm-profile-transients WP-CLI command to bust and rewrite all profile, team, organisation, and venture caches; dry-run by default, --letsgo executes the bust and rewrite and reports object counts
  • Add SIA_Ariel_Transient_Service::bust_transient_variants_in_all_blogs() — runs a LIKE-based bust on every blog, complementing the existing bust_transient_in_all_blogs() which only deletes exact-keyed transients

Improvements

  • Strip unused SIA_Website properties (active_plugins, country_user, maintainer) and heavy nested team collections (hosts, organizations, teamMembers) from venture objects before serialization, reducing the size of profile and team-member transients

Fixes

  • warm-profile-transients --letsgo now correctly busts all get_blog_profiles variants; previously called bust_transient_in_all_blogs which deleted the bare key but not the parametered variants like _include_inactive_0
  • Include last_seen_date and last_seen_source in the ITI webhook payload when processing team_join and user_change events; previously these fields were absent, causing Airtable to clear the stored values on every membership update

14.0.0

Unify Slack member data in the presence table [*]

New

  • Add backfill-slack-presence-meta CLI command to populate the new columns from existing profile meta for all members with a non-blank Slack ID; dry-run by default, --letsgo executes and reports totals
  • Add slack_status, slack_handle, and slack_type columns to wp_slack_user_presence
  • Write slack_status and slack_handle to the presence table on every presence upsert in record_user_presence()
  • Write slack_status, slack_handle, and slack_type to the presence table when processing team_join and user_change events; slack_type is only available from the live Slack user object so it is not backfilled by the migration command

Improvements

  • Rename upgrade_to_13_6_0() to setup_slack_presence_tracking() to describe its role rather than its version

13.7.2

Fix access-log polling failures and add totals to the CLI output [*]

Improvements

  • Add a totals line at the end of poll-slack-presence output: “X of Y members seen today”

Fixes

  • Return WP_Error (instead of NULL) when the token is missing or the Slack API returns an error; the poll-slack-presence CLI command now surfaces these as a fatal error message

13.7.1

Fix access-log pagination so all of today’s entries are found [*]

Fixes

  • Switch poll_access_logs() from cursor-based to page-based pagination, which is what team.accessLogs actually uses; add an early-exit once a page contains no today entries, since logs are sorted newest-first

13.7.0

Keep a local record of when each Slack member was last seen [*]

Active members who have not interacted with Slack in the past 14 days can now be identified automatically. The Events API captures real interactions, and a nightly access-log poll catches members who only open the app without posting or reacting.

New

  • Create wp_slack_user_presence table on plugin activation to store each active member’s last-seen date, the source that recorded it, and when the access log poll last ran for that user
  • Add SIA_Ariel_Slack_Presence::get_active_slack_users() to query all profiles with slack_status = 'active' and a slack_id, returning a map of Slack user ID to profile post ID; result is cached for the request lifetime
  • Add record_user_presence( $slack_id, $source ) to upsert today’s date into the presence table, skipping inactive users and honouring a once-per-day gate to avoid redundant writes
  • Add poll_access_logs() to call team.accessLogs with cursor-based pagination for members not already seen today, recording access-log presence and stamping last_polled for all active users
  • Add get_inactive_users( $days = 14 ) to return all active members whose last-seen date is older than the threshold or who have no presence record yet
  • Subscribe to message.*, reaction_added, file_created, and member_joined_channel events in process_event() and route each to process_activity_event(), which calls record_user_presence with source event; bot messages and deletions are skipped
  • Add SLACK_NET_CRM_APP_ACCESSLOGS_USER_TOKEN constant for the user OAuth token (admin scope) required by team.accessLogs
  • Schedule poll_access_logs as a daily WP-Cron job at 23:00 UTC on the Play blog; applied automatically on first page load after deployment via maybe_upgrade(); unschedule on deactivation
  • Add poll-slack-presence CLI command: dry-run lists active members not yet seen today; --letsgo runs the poll and shows the post-poll outcome for each user (✅ seen today, ❌ not in logs, or ⏸️ in dry-run)
  • Add post_presence_to_iti() to POST a presence update to the ITI Airtable webhook after each successful upsert; payload mirrors process_team_join/process_user_change structure and includes last_seen_date and last_seen_source

13.5.0

Enrich IT Infrastructure payload with Slack member type and full name [*]

Improvements

  • Extend the ITI webhook payload with slack_type (resolved from user flags: Bot, Single-Channel Guest, Multi-Channel Guest, Primary Owner, Owner, Admin, Member) and slack_full_name (from profile.real_name)
  • Forward bots and users without a matching profile to IT Infrastructure instead of silently dropping them; airtable_uuid and email are sent as NULL in those cases
  • Add get_slack_user_type() to resolve Slack member type from user object flags
  • Include slack_full_name in the sync-slack-users-to-iti CLI payload (from $profile->full_name); slack_type is sent as NULL since the profile does not store it

13.4.0

Import Slack workspace members from a CSV export [*]

New

  • Add import-slack-users-from-csv CLI command in SIA_Ariel_WP_CLI: reads a Slack admin member CSV export (userid, username, email, status), looks up each row by email, and writes slack_id, slack handle, and slack_status to the matching profile; dry-run by default, --letsgo to execute; bots (non-U/W user IDs) and rows without an email or user ID are skipped

Fixes

  • Rename AIRTABLE_ITI_APP_ID env var to AIRTABLE_ITI_REPORTS_APP_ID in constants.php
  • Rename DEBUG_ITI to DEBUG_ITI_REPORTS and AIRTABLE_ITI_REQUEST_TOKEN to AIRTABLE_ITI_REPORTS_REQUEST_TOKEN in post_slack_user_to_airtable_iti_webhook()
  • Guard json_decode result with is_array() before accessing message keys in fetch()

13.3.0

Sync all Slack workspace members to IT Infrastructure on demand [*]

New

  • Add sync-slack-users-to-iti CLI command in SIA_Ariel_WP_CLI: queries all profiles with a slack_id, builds the same payload as process_user_change, and calls post_slack_user_to_airtable_iti_webhook for each; dry-run by default, --letsgo to execute, --quiet to suppress output

13.2.1

Make the Slack users connection name more specific

Fixes

  • Rename AIRTABLE_ITI_SLACK_SUFFIX to AIRTABLE_ITI_SLACK_USERS_SUFFIX in constants.php and update its reference in post_slack_user_to_airtable_iti_webhook()

13.2.0

Sync Slack membership changes to member profiles

When a new member joins the Slack workspace, or when an existing member’s account is updated or deactivated, their profile is automatically kept in sync and IT Infrastructure is notified in real time.

New

  • Add AIRTABLE_ITI_BASE_URL and AIRTABLE_ITI_SLACK_SUFFIX constants and post_slack_user_to_airtable_iti_webhook() in SIA_Ariel_Remote_Abstract to POST Slack user data to the IT Infrastructure Airtable base
  • Add SIA_Ariel_Slack_Event_Listener::process_user_event() as a category dispatcher that collects processor output and calls the ITI webhook; process_event() routes to it for all user-related event types
  • Add process_team_join(): looks up the profile by email, writes slack_id, slack handle, and slack_status = 'active' to profile meta, and returns the ITI payload
  • Add process_user_change(): keeps slack_id, slack handle, and slack_status in sync on every user mutation, and returns the ITI payload
  • Fix the process_event() switch to dispatch on event->type instead of the raw event object

13.1.1

Fix fatal error in has_community_role() when community role is empty

Fixes

  • Guard against a null/empty $communityRoles in SIA_Team_Member::has_community_role() before passing to in_array()

13.1.0

Normalize Team hosts exportable to Net/CRM

New

  • Add a new case SIA_Profiles_Public::TEAMS_POST_TYPE_MACHINE_NAME to NETCRM_Entity::normalize_data() to send airtable_uuids back to Net/CRM

13.0.0

Listen to Slack team events and send to IT Infrastructure

Create the boilerplate that gets the webhooks authorized.

New

  • Create the Slack event listener in SIA_Ariel_Slack_Event_Listener loaded by SIA_Ariel::load_dependencies()
  • Load the listener as property SIA_Ariel_Public::$SlackEventListener
  • Register the routes for Play in SIA_Ariel::define_public_hooks()

12.2.0

Enrich and adapt parameters posted to Website Reports

Match level names, add an expected service, and use component to reflect the plugin (i.e. software component)

New

  • Introduce the SIA_Ariel_Remote_Abstract::$softwareComponentName property that’s processed from $plugin_name
  • Reduce the default services to 2: ‘SIA Play’ or ‘SIA Marketing Website’ in SIA_Ariel_Remote_Abstractpost_website_network_activity_to_airtable_webhook()
  • Send the from component in SIA_Ariel_Remote_Abstract::post_website_network_activity_to_airtable_webhook
  • Process the event ‘level’ to capitalize and match expected values in SIA_Ariel_Remote_Abstract::post_website_network_activity_to_airtable_webhook)_

**

12.1.1

Fix sending Scaling Lead member the invite to empty email address

Improvements

  • Clarify the credentials section in the ‘basic’ invite type in SIA_Ariel_Messaging_Repository::scalingLeadTeamMemberPlayEmailInvite()

Fixes

  • Fix the check for a temporary password preventing the identification of a profile invite email in SIA_Team_Member::sendPlayInvite() in the non-SIA Passport case

12.1.0

Send emails to a specified invite_email paramenter for SIA Passports

Invited users with SIA Passports don’t have access to them yet and need to be invited on a different email.

New

  • Add a stated invite email parameter to SIA_Team_Member::sendPlayInvite() and when present use it to when calling the SIA_Ariel_Messaging_Repository::passportTeamMemberPlayEmailInvite()
  • When present, forward the invite_email parameter from CRUD_User::create() to the entity using the trait’s sendPlayInvite() method
  • Add a SIA_Team_Member::has_sia_passport() helper method using the SIA_Ariel_Public::is_sia_passport() static
  • Adapt the SIA_Ariel_WP_CLI::team_member_send_invite() method to the necessary invite_email parameter

12.0.0

Send automatic customized invites for CRUD create candidate and host team members

Create a messaging repository to compose, for now, invite emails. When it’s a passport user account, consider access credentials when including sections regarding the Playbook and Slack.

Add SIA Passport user creation and custom invite creation when a Team member object is created via the REST API and its CRUD User trait.

New

  • Refine SIA_Team_Member::sendPlayInvite() to make use of the new messaging repository, have a specific behavior for SIA Passport users, and use a $simulate parameter
  • Add a signature building method used in email to SIA_Team_Member as buildSignature()
  • Add an $accessCredentials property to SIA_Team_Member mirroring the usage in SIA_Profile, and separate as a method set_accessLevels() used both by the contructor and after a profile change in CRUD_User
  • Improve the new team member to their profile connection by reordering operations in CRUD_User::update() when updating the profile and making use of the new SIA_Team_Member::set_accessLevels()
  • Include inviteType and a specific ‘PASSWORDLESS-ACCOUNT’ temporary_password in the CRUD_User::create() output
  • Account for passwordless (i.e. SIA Passport) accounts in CRUD_User::create()
  • Add a messaging repository building email headers, signature, and composing 2 types of emails for now: scaling (scalingLeadTeamMemberPlayEmailInvite()) and passport (passportTeamMemberPlayEmailInvite()) in SIA_Ariel_Messaging_Repository, based on the sender user and the subject $teamMemberObject, loaded by SIA_Ariel::load_dependencies()
  • Remove all invite composing functionality from SIA_Team_Member::sendPlayInvite() and replace with a call to the SIA_Ariel_Messaging_Repository
  • New base registration URL constants for SLACK_SIGNING_BASE_URL and GOOGLE_WORKSPACE_SIGNING_BASE_URL in constants.php grabbing values from .env, used to build URLs in email invites by the messaging repository
  • New repository method listing base registration URLs in SIA_Ariel_Repository::getAccessRootUrl(), used to compose invite emails

Improvements

  • Strengthen validation of the team member POST ‘create’ operation by checking there’s a Profile post id sent and the Profile can be loaded in SIA_Ariel_REST::team_member()
  • Remove the necessity to send an email and use the Profile email property during the POST ‘create’ operation SIA_Ariel_REST::team_member()
  • Include the used email and the invite typewhen formulating the output of SIA_Ariel_REST::team_member()
  • Simplify development by also considering ‘.net’ emails as SIA Passports when on development environment in SIA_Ariel_Public::is_sia_passport()
  • New CLI command disconnect-team-member calling SIA_Ariel_WP_CLI::disconnect_team_member_from_profile() and removing the connection between a user account and a profile to be able to restart the creation process
  • Fix the simulation and resend flags in the invite-team-member calling SIA_Ariel_WP_CLI::team_member_send_invite() to be able to read an output of SIA_Team_Member::sendPlayInvite()
  • New Play URL constant PLAY_URL using the WANDA_DOMAIN in constants.php, used to be included in invites
  • Ensure a new entity has an author even when not sent via $args by using the admin email’s user in CRUD_Entity::create()

Fixes

  • Use the Profile’s post title when sending the POST ‘create’ operation outcome in SIA_Ariel_REST::profile()

11.1.0

Add the profile deactivation functionality to CRUD profiles

Ensure cache busting when only a meta field is changed, in this case the value of the “active” field.

  • Trigger a post update after (instead of before) custom fields are updated from CRUD_Entity::update()
  • Include the value of the profile active field in responses from SIA_Ariel_REST::profile()

11.0.0

Send automatic invites for CRUD create scaling lead team members

When requested, send an invite to Scaling lead profile user from CRUD_User::create()

New

  • Add a property that tracks wheter or not the Team member’s profile invite was sent in SIA_Team_Member::$inviteSent, directly picking up the value from the $profile property
  • Add a method to send invites for team members upon request in SIA_Team_Member::sendPlayInvite() and track the outcome in $inviteSent
  • Include the result of sending an invite in CRUD_User::create() and include it in the response of SIA_Ariel_REST::team_member() POST method
  • Add a CLI method ‘invite-team-member’ using TeamMember::sendPlayInvite() calling back SIA_Ariel_WP_CLI::team_member_send_invite()

10.4.0

Create users for Profiles via REST

Provide the GET, PATCH, POST endpoint and callback for adding a Team member user account, or update it.

New

  • Create a user focused CRUD trait, CRUD_User, with create() (Creates a new WordPress user account and, upon success, instantiates self and returns it.) and update() (Update user meta values, depending in provided properties) and include it from SIA_Ariel::load_dependencies()
  • Use the CRUD_User trait in SIA_Team_Member
  • Add 2 new properties to be provided from SIA_Team_Member::__construct(): $profilePostId and $username
  • Add 1 new property used only to respond to the create() method: SIA_Team_Member::$temporary_password
  • Add the play/team_member WP REST Route with SIA_Ariel_REST::team_member() callback
  • Adapt the request validator SIA_Ariel_REST::request_is_well_formed() to pass through user focused requests
  • Add a method to identify the request callback function in SIA_Ariel_REST::get_request_callback()
  • Include in constants.php the profile community role constant setting (brought verbatim from SIA Profiles) in SIA_Ariel::set_profile_role_constants() to prevent needing not yet defined values for role conversion
  • Since description is now a SIA_Organization exportable (SIA Profiles 15.12.0), normalize value by removing HTML in NETCRM_Entity::normalize_data()

Fixes

  • Allow taking a post status parameter as post_status instead of creating only “pending” posts in CRUD_Entity::create()
  • Fix reversed guard clause logic for defined() in CRUD_Entity::update()
  • Fix incorrect field value identification for “team” in when there are fields that ACF finds on the wrong post type by using field IDs prevents the error. If none is recorded, use the string field name in CRUD_Entity::update() and use WP meta update function, otherwise use ACF field methods

10.3.0

Include the post status in the REST response

New

  • Include post_status in all POST and PATCH success responses for CRUD entities from SIA_Ariel_REST

10.2.0

Integrate Profile in the Net/CRM framework and improve CLI

New

  • Consider ‘profile’ in SIA_Ariel_Public::maybe_send_data_to_netcrm() hooked to wp_after_insert_post since 10.0.0
  • Consider ‘profile’ in SIA_Ariel_Remote_Abstract::post_netcrm_data_to_airtable_webhook()
  • Add new constant to faciliate posting to Net/CRM webhook: AIRTABLE_NETCRM_PROFILES_SUFFIX in constants.php
  • Introduce the ‘send-post-netcrm-data’ command in the new SIA_Ariel_WP_CLI to send a single entity

Improvements

  • Rename send-netcrm-data into send-all-of-post-type-to-netcrm for clarity

10.1.0

Create a CLI command to post all organizations’ data to Net/CRM

New

  • Introduce the ‘ariel send-netcrm-data’ command in the new SIA_Ariel_WP_CLI

10.0.0

Create the framework to send data to Net/CRM

Provide a standardized posting method via a new Trait, and processing from the remote abstract. Requests are tokenized, formatted, and sent forward to an Airtable webhook defined as a constant.

To prevent infinite loops, when updating a CRUD entity via API, set a constant that blocks processing in the method hooked to the Wordpress update hook.

New

  • Add a method to the remote abstract to format data sent to the Net/CRM in SIA_Ariel_Remote_Abstract::post_netcrm_data_to_airtable_webhook()
  • Create a new Trait to be used by entities sending data to Net/CRM, called NETCRM_Entity, for now providing only one method: post_data_to_netcrm(), and loaded from SIA_Ariel::load_dependencies()
  • Add new constants to faciliate posting to Net/CRM webhook: AIRTABLE_NETCRM_ORGANIZATIONS_SUFFIX and AIRTABLE_NETCRM_BASE_URL in constants.php
  • Hook into the wp_after_insert_post in SIA_Ariel::define_public_hooks() to send update to Net/CRM via SIA_Ariel_Public::maybe_send_data_to_netcrm()
  • Prevent circular updates of entities by setting DOING_API_ENTITY_UPDATE in CRUD_Entity::create() and CRUD_Entity::update() and checking it in SIA_Ariel_Public::maybe_send_data_to_netcrm()
  • Start checking environment match with request in SIA_Ariel_REST::request_is_well_formed() to ensure there are no crossed wires

9.5.0

ComVo report phase identifier in remote abstract

New

  • Get the SIA website or country slug from bloginfo or athe blog option from the static SIA_Ariel::get_site_slug()
  • Figure out whether the installation is on a development vhosts, when the WP_HOME TLD is ‘oxx’ in SIA_Ariel::is_development_domain()
  • Build the phase slug depending on environment and, if sent, the ‘countrySlug’ in $args in SIA_Ariel_Remote_Abstract::post_community_voting_data_to_airtable_webhook()

9.4.0

Staging is an International website

New

  • STAGING_BLOG_ID in constants.php
  • SIA_Ariel::is_staging()
  • SIA_Ariel_Public::wsl_hook_alter_provider_config() has a team case for staging

9.3.0

Bring the CRUD Trait closer to production

Better guard clauses and extensible to Profile, an entity that doesn’t have a “name” like Organization.

Fixes

  • Add a guard clause testing if the environment property is set in CRUD_Entity methods to not throw useless Warnings
  • Return an object when staging to prevent Fatal triggered by array returns

9.2.0

Kick-start the CRUD API for Play entity operations

New enpoints for team, profile, and organization using GET for retrieval, POST for creation, and PATCH for updates via a new CRUD trait.

New

  • Add 3 new endpoints in Ariel REST for the new ‘play’ route (replaces the unused ‘directory’): ‘profile’, ‘organization’, and ‘team’ added to SIA_Ariel_REST::$RESTRoutes
  • Add POST and PATCH as allowed methods for WP Rest Request routes in SIA_Ariel_Rest::register_rest_routes()
  • Add a new authorization method to Ariel REST to validate a request against a Bearer authorization in SIA_Ariel_Rest::request_is_authorized() that validates a token against the .env token using the new get_bearer_token() RegExp extractor
  • Add a new helper method to check if a request $method (GET, POST, PATCH) matches the body of the request in SIA_Ariel_Rest::request_is_well_formed()
  • Create a trait to operate the create() and update() operations in CRUD_Entity included from SIA_Ariel::load_dependencies()

Improvements

  • Deprecate the less secure SIA_Ariel_Rest::request_is_valid() method used for A&AP related method that will follow

9.1.0

Don’t add empty parameters to transient names

Improvements

  • A null parameter is no longer added to the suffix in SIA_Ariel_Transient_Service::get_transient_name()

9.0.0

Remote abstract handlers to Mailjet API

Subscribe a contact to an audience & add a contact to one or more lists. In the case of duplicates, especially during adding contacts to lists, when the Mailjet “error” contains specific text, treat it as a success.

New

  • Create SIA_Ariel_Remote_Abstract::subscribe_contact_to_mailjet_list() that takes a list id and contact data and posts to the Mailjet API
  • Create SIA_Ariel_Remote_Abstract::subscribe_contact_to_mailjet_audience() that takes a contact data and posts to the Mailjet API
  • Create SIA_Ariel_Remote_Abstract::post_to_mailjet() which – belonging in a separate class – takes a single argument, prepares the request, and passes it forward to SIA_Ariel_Remote_Abstract->fetch()
  • Define Mailjet API specific constants in constants.php

8.10.0

Add ComVo daily summary new args to doc comment

Improvements

  • Include type and date params of summary in DocBlock of SIA_Ariel_Remote_Abstract::post_community_voting_data_to_airtable_webhook()

8.9.0

Include ComVo daily summary creation in the remote

Improvements

  • Include Project Voting summary creation documentation SIA_Ariel_Remote_Abstract::post_community_voting_data_to_airtable_webhook() and switch case and a new webhook endpoint constant in constant.php

8.8.0

Include ComVo votes creation in the remote

Improvements

  • Include Project Voting raw vote creation documentation and account for empty $args['slug'] when votes are sent (each has its own) in the SIA_Ariel_Remote_Abstract::post_community_voting_data_to_airtable_webhook()

8.7.0

Include ComVo project updates in the remote

Add a readiness describer to the repo and adjust the Airtable posting remote for project updates.

New

  • Add a readiness status describer in the repository as SIA_Ariel_Repository::describe_readiness()
  • Add readiness constants IS_READY 200 and IS_NOT_READY 403 to constants.php

Improvements

  • Include Project Voting project updates documentation and account for empty $args['state'] in the SIA_Ariel_Remote_Abstract::post_community_voting_data_to_airtable_webhook()

8.6.0

Provide Project Voting with a remote for posting to the ComVo Reports Airtable base

New

  • Send Project Voting phase updates to the ComVo Reports Airtable base from SIA_Ariel_Remote_Abstract::post_community_voting_data_to_airtable_webhook()
  • Create a status describing repository in SIA_Ariel_Repository::describe_status(), added in the new class-sia-ariel-repository.php included in SIA_Ariel::load_dependencies()
  • Add ComVo Reports base url (AIRTABLE_COMVO_BASE_URL) using the app specific AIRTABLE_COMVO_REPORTS_APP_ID .env and webhook suffixes to constants.php

Fixes

  • Move the AIRTABLE_WNA_ACTIVITY_ENDPOINT Airtable app specific string into .env as AIRTABLE_WNA_APP_ID and load it in constants.php via env()

8.5.0

Reduced scope of replacement of Google WSL provider with Login with SIA Passport

In order to let other plugins hook into the rendering of WSL provider names, replace Google with Login with SIA Passport only when necessary: login page and non-team blogs.

Other plugins hook into the provider name render to change the login modal, present on other pages

Improvements

  • Limit the scope of the wsl_render_auth_widget_alter_provider_name filtering to only non-team blogs or the wp-login.php page in SIA_Ariel_Public::wsl_provider_name()
  • Mention the number of parameters for the mmlr_wls_action_params filter in SIA_Ariel::define_public_hooks()

8.4.0

Add a registration url property to the A&AP class

New

  • Register SIA_AAP::$registration_url and, in the constructor, if there are no issue and the SIA_AAP::$url is set, append “user/register” to it

8.3.0

Send Host Privacy policy and Imprint page URLs to the A&AP

New

  • Add the layouts imprint-host and privacy-policy-host to the switch as triggers in SIA_Ariel_Admin::send_application_platform_importable_from_post() hooked to save_post
  • Include imprint_url and privacy_policy_url in the list of constants sent to the local A&AP from SIA_AAP::set_application_platform_constant_importables()

8.2.0

Send the Host contact page post URL to the A&AP

New

  • Include contact_url in the list of constants sent to the local A&AP from SIA_AAP::set_application_platform_constant_importables()

8.1.0

Send post dependant or constant importables to A&AP

When the application landing page is updated, send its title. Provide a method to send constant importables, like the site email, to A&AP.

New

  • Create a method that checks current site and updated post’s layout and sends specific importables to A&AP, for now the title of the about-application-host post, in SIA_Ariel_Admin::send_application_platform_importable_from_post() hooked to save_post in SIA_Ariel::define_admin_hooks()
  • Create a method that sends constant importables to A&AP in SIA_AAP::set_application_platform_constant_importables()

8.0.0

Send importable variables to A&AP when Implementation or Stencil options are saved

When the Implementation options page is saved, pass config values through to the A&AP class to POST to the website’s repsective platform in the mapped language. When Stencil options are updated, iterate through website to do the same thing.

New

  • Create SIA_Ariel_Remote_Abstract::post_importable_variable_to_country_aap() that sends importables to the A&AP endpoint as formatted data
  • Create the importables map of option id to variable id in SIA_AAP::$importables
  • Create the data formatter in SIA_AAP::update_application_platform_importables() that takes a $content and optionally $ISO639Language as parameters, formats the data, and passes is to SIA_Ariel_Remote_Abstract::run() with the post_importable_variable_to_country_aap function as a parameter
  • Create the English variable sender in SIA_Ariel_Admin::update_english_application_platforms_importables() to iterate websites’ AAPs and use their formatter
  • Create the localized variable sender in SIA_Ariel_Admin::update_application_platform_importables()that takes an $updatedConfig parameter, finds the local website’s AAPs, formats SIA_Publishing_Config data as array, and sends it to the formatter
  • Hook saved_implementation_options to saved_implementation_options and update_english_application_platforms_importables to saved_stencil_options in SIA_Ariel::define_admin_hooks()

7.8.0

Fix empty transient value while setting a transient in AJAX calls

New

  • Return transient $value instead of FALSE while setting a transient during an AJAX call from SIA_Ariel_Transient_Service::setTransient()

7.7.0

New mirosite identifier helper

  • Add SIA_Ariel::is_microsite() to identify at once is_summit() and is_retreat()

7.6.1

Fix empty A&AP card ‘details’ notice

  • Check that $details exists when adding to $cardAtts in SIA_AAP::get_state_card()

7.6.0

Mature A&AP cache busting connected to sitemaps

Introduce the notion of cacheable properties in the AAP objects, and when they are changed, bust sitemap and static caches.

  • Add the SIA_AAP::cacheable property to store data that shows on other pages
  • Add the SIA_AAP::majorUpdate() method that takes the old AAP object and compares submodules data that is also shown on other pages
  • Add A&AP class caches buster in SIA_AAP::__bust_cache() that empties transients and, when the update is major, , also bust sitemaps cache by calling SIA_Publishing_Sitemap::__bust_cache() for both the AAP’s team blog id and the international blog id
  • Add the “Finished” status to SIA_AAP shown between the application close and announcement (after which it becomes “Overdue”)
  • Call the AAP cache buster when storing new data from SIA_Ariel_REST::store_country_aap_data()

7.5.0

New shorthands for the retreat and summit blogs

  • Add SIA_Ariel::is_retreat() and SIA_Ariel::is_summit()

7.4.0

Improve transient management, especially busting

  • Since the Team AAP property is now a pointer method, bust only that transient upon update from SIA_Ariel_REST::store_country_aap_data()
  • Load SIA_Website $team and $maintainer from transients
  • Add a method to bust all variants of a transient based on the name root (class and function) in SIA_Ariel_Transient_Service::bust_transient_variants() using a partial name LIKE%% query
  • Add a method listing all local or site transient in SIA_Ariel_Transient_Service::listTransients()
  • Add a method setting local or site transients in SIA_Ariel_Transient_Service::setTransient()
  • Add a $network parameter to SIA_Ariel_Transient_Service::bust_transient() in order to reuse it for site (“network”) transients
  • Add a method busting a site (“network”) transient in SIA_Ariel_Transient_Service::bust_network_transient() that passes parameters to bust_transient() with the $network parameter set to TRUE
  • Rename bust_network_transients() to SIA_Ariel_Transient_Service::bust_transient_in_all_blogs() in order to clarify its purpose and actually not use it anywhere
  • Adapt all refactored methods

7.3.0

Introduce the concept of critical posts for a SIA Website

  • Add the page_for_privacy_policy, page_on_front, and page_for_posts properties that load the blog options in SIA_Website::__construct()
  • Add SIA_Website::post_is_critical() with a $postId parameter that checks if it’s one of the above

7.2.0

Allow members of suspended organizations to log into Play

  • If an inactive organization is suspended let the user pass through in SIA_Ariel_Public::block_access_for_inactive_accounts()
  • Reformulate SIA_Team_Member::can_edit_team() to use the SIA_Team::$licensingStatus property

7.1.0

Add a helper checking a team member can update a licensing status

Check if a specific Organization’s licensing status can be edited by the current team member to replace checking each status with each permission.

  • Add the static SIA_Team_Member::can_manage_organization_with_status() that takes a status as a parameter and checks it against the which types of organizations the current user can manage

7.0.0

Create an activity repository that posts service updates to Airtable

Isolate all existing event processors into the new Activity repository to be used by other plugins, and send the service name in the event to adapt to the new Network Activity event structure.

  • Add the Activity repository (SIA_Ariel_Activity_Repository) to contain all methods related to posting activity events to Airtable
  • Adapt to the new Airtable base structure for logging events by sending services (e.g. SIA Play) instead of containers to the activity log Airtable automation from SIA_Ariel_Remote_Abstract::post_website_network_activity_to_airtable_webhook()
  • Move the post_event() shorthand out of SIA_Ariel_Remote_Abstract and into SIA_Ariel_Activity_Repository
  • Bring all Simple History processors out of SIA_Publishing_Public and into SIA_Ariel_Activity_Repository

6.5.0

Include stylesheet, active plugins, and is_restricted in Website class websites CLI reports

6.4.0

New shorthand to get a website’s state

  • Add the shorthand SIA_Website::validate_website() to simplify repeated checks whether the website is maintained or its license

6.3.0

New shorthand for posting to Airtable and refined logs

  • Add a shorthand helper in SIA_Ariel_Remote_Abstract::post_event() to not have every call from instantiating a new object from the class
  • Set sane and comprehensive defaults for activity events in SIA_Ariel_Remote_Abstract::post_website_network_activity_to_airtable_webhook()
  • Don’t post website activity from post_website_network_activity_to_airtable_webhook() when in production or when the DEBUG_ACTIVITY_LOG environment value is not TRUE
  • Fix setting incorrect website details when running from WP_CLI and $sia_website is stale by generating data o n the fly in SIA_Ariel_Remote_Abstract::post_website_network_activity_to_airtable_webhook()

6.2.0

Add a method to post to an Airtable base webhook

Send activity updates to the Airtable automation triggered by a webhook. The webhook accepts JSON and includes a custom “security” token picked up from .env

  • New method that POSTs updates to be processed by an Airtable automation: SIA_Ariel_Remote_Abstract::post_website_network_activity_to_airtable_webhook()
  • Set a constant for AIRTABLE_WNA_ACTIVITY_ENDPOINT pointing to Website Activity webhook

6.1.0

Provide a single site transient buster

  • Refactor SIA_Ariel_Transient_Service::bust_transient() to only bust local transients
  • Rename the buster above into bust_network_transients() and only do the blog looping and passing parameters to the method above
  • Annotate the SIA_Team_Member::$off_limits_post_ids property

6.0.0

Create a transient management service

  • New class SIA_Ariel_Transient_Service with 2 methods:
  • Consistent transient names (get_transient_name()) depending on class, function, and arguments
  • Easy busting of transients (bust_transient()) across the network provided for other plugins to call when state changes
  • Make use of the service namer in the new SIA_Ariel::get_websites() moved over from SIA_Profiles and SIA_Ariel::get_blog_ids()
  • Make use of the service buster in SIA_Ariel_Admin::bust_site_transients() hooked to: wp_insert_site, wp_delete_site, and wp_update_site

5.9.0

Move WSL login filters from Parlament

  • New and refined SIA_Ariel_Public::display_wsl_widget() and SIA_Ariel_Public::wsl_provider_name()

5.8.0

Provide a switch to check current blog in the stack

  • New static SIA_Ariel::is_switched_from() checking in the stack if we originally started from the queried blog id
  • Add a bool param to SIA_Ariel::is_play() using the above to ensure that we’re not saying yes during a switch for profiles

5.7.0

Suggest a profile REST route with an empty callback

  • Fix usage of SIA_Profiles_Public::is_playbook() instead of own SIA_Ariel::is_play().

5.6.0

New permission to manage board members

  • Add the ‘manage_board_members’ case to SIA_Team_Member::can() and map it to manage_sites for now;
  • This file is not Markdown.

5.5.0

Add the language property to SIA SIA_Website

  • Include $language in SIA_Website::__construct() via get_blog_option() for 'WP_LANG'.

5.4.0

Refactor REST API calls to use Bearer authentication

  • Replace hard-coded “tokens” with .env hashes in SIA_Ariel_Remote_Abstract
  • Replace checking for token existance with checking if the method exists in SIA_Ariel_Remote_Abstract::request_is_valid()
  • In each fetching method of SIA_Ariel_Remote_Abstract throw a WP_Error if the .env constant is not set

5.3.0

Define a LICENSOR_ORGANIZATION_POST_ID constant for SIA gGmbH

5.2.0

Expand the SIA_Website class to include ISO2 and sia.click url and link

  • New SIA_Website::get_ISO2() method adapted from SIA_Team
  • New $shortUrl and $shortLink properties

5.1.0

Include country user in the Sites network admin report and fix admin email

5.0.0

Get archival data from AAP API and use salted authorization tokens using the .env salt and tokens

4.8.0

Parametrize Ariel::is... and ensure SIA_Ariel_Public::initialize_sia_website() doesn’t perform double duty

4.6.0

New status constants

4.5.0

New REST route to show Application & Assessment data

4.4.0

Allow Communications Coordinator user role to edit own organization

  • When checking for edit_own_organization permission in SIA_Team_Member::can(), return TRUE for users with the “communications_coordinator” role

4.3.0

Check if a team member belongs to an organization and can edit it

  • New SIA_Team_Member::user_is_member_of_organization() method
  • Include ‘edit_own_organization’ permission check into SIA_Team_Member::can() and check if a user is holds either “Coordinator” or “Organizational lead” community roles
  • New SIA_Team_Member::get_user_organization() method to get a user’s organization (can be only one)
  • New SIA_Team_Member::can_edit_organization() helper

4.2.1

Fix incorrect empty community role values from team member profile by stopping to try to chain SIA_Team_Member::get() with SIA_Post_Interface::get() which only gets values of WP_Post

4.2.0

New SIA_Website class to hold license details

  • Move custom Sites admin page columns registration and display from SIA Deployment

4.1.0

Improve permission check in SIA_Team_Member::can() when global $current_team_member is already set

3.2.0

Filter mmlr_wls_action_params to only show Google as Wordpress Social Login provider

3.1.0

Migrate the WSL config alter hook from Deployment

3.0.0

First version as Ariel

2.3.0

Return country name after AAP REST; Improve error messages

2.2.0

Add a WANDA_DOMAIN constant from env() and re-use in other URL constants

2.1.1

Fix not adding the “slug” key to AAP meta.

2.1.0

Pivot to using ISO2 in AAP REST.

2.0.3

Fix not sending AAP REST error text.

2.0.2

Fix only recording AAP REST data only for active teams.

2.0.1

Fix check for Restricted Site Access being enabled.

2.0.0

Create a REST endpoint for adding A&AP data to teams

  • When play.socialimpactaward.net/wp-json/team/store_country_aap_data is called with a valid token and base64 encoded JSON params requiring the country slug, store a post meta with the entire payload.
  • Create constants for AAP, CLICK, and INKA domains.

1.8.0

New umbrella manage_implementation_partners permission.

1.7.0

Provide static methods to verify blog purpose (stencil, team, management).

1.6.0

Switch the Team member profile permissions to default capabilities.

1.5.0

Improve creation of profiles that don’t use Passports

  • Maybe prevent sending emails to users on pass and email changes.
  • Include Profile details in the Network User delete form, and delete profile when the user is deleted.

1.4.1

Fix lack or return from get_sia_profile and improve yet another edge case: valid profile, missing org.

1.3.0

Integrate access levels to support Profiles, Play, and themes.

  • Include access level in Team Member constructor;
  • Create a SIA_Team_Member::can method to supplement the default Wordpress permissions with SIA statuses and roles;