Publishing

SIA Publishing manages the editorial and publishing layer of the Social Impact Award website. It covers the content types, layouts, and distribution workflows that editors use to produce the site’s public-facing material — from news articles and event listings to press mentions, resources, and testimonials.

The plugin is built to serve a distributed team: country programme managers publish their own content through a shared editorial workflow, and the plugin ensures consistent formatting and presentation regardless of which site the content was created on.

Main features

Content types

Publishing adds post types for articles, events, jobs, press mentions, resources, testimonials, and venues. Each type carries its own set of fields, validation rules, and admin interfaces, and is excluded or included in sitemaps according to editorial needs.

Layout system

A block-based layout engine lets editors compose pages from reusable components. Blocks can be nested, themed, and filled with content from any registered post type. The system uses Twig templates for rendering, keeping presentation logic out of the database.

Contact forms

A repository of contact form configurations is managed centrally and shared across sites. Forms are tied to specific pages or content types and can trigger notifications, record submissions, and forward data to Airtable.

REST API and sharing

Publishing exposes a REST API used by other plugins and the theme to retrieve content. It also manages social sharing metadata and integration with Jetpack’s sharing tools, ensuring articles carry correct Open Graph and Twitter card markup.

Activity tracking

Content edits — publishing, updating, and removing entries — are forwarded to the Website Network Activity Airtable base. This gives the team a record of editorial activity across all country sites without needing to query each one individually.

SIA_Publishing_Public::send_website_network_activity() is hooked to simple_history/log/inserted at priority 50. It receives every event Simple History logs and decides whether and how to forward it.

Logger filtering — only these loggers are processed; all others are silently ignored:

  • SimplePostLogger — post type must be in SIA_Publishing::$postTypesWithActivity (job, page, post, press-mention, testimonial, tribe_events, resource; plus profile, organizations, and teams on non-Play sites). WP-CLI-initiated events are skipped.
  • SimpleCategoriesLogger — all taxonomy term events (created, edited, deleted) unless the taxonomy is in the skip list (Polylang translation taxonomies).
  • SimpleOptionsLogger — all option saves except a set of noisy internal options (cron locks, Tribe timestamps, mail counters).
  • SimpleUserLogger — login and logout events only; profile updates and user creation are skipped.
  • SimpleMenuLogger, SimplePluginLogger, SimpleThemeLogger — all events forwarded as-is.

Operation (op) — derived from the Simple History _message_key via SIA_Ariel_Activity_Repository::get_op_from_message_key(): post_createdcreate, post_updated / edited_termupdate, post_deleted / post_trashed / deleted_termdelete. Set to NULL for loggers that do not map to a CRUD operation.

Payload fields — assembled and forwarded via SIA_Ariel_Activity_Repository::post_event():

Field Source
blog_id get_current_blog_id() — added by the webhook method for all callers
user_email $context['_user_email'] or $data['initiator']
website get_blog_option($blogId, 'blogname')
service 'SIA Play' on Play; 'SIA Marketing Website' otherwise
event Plain-text log row from Simple History
details Rendered log row details; post diffs processed by process_simple_history_post_log_details(); option diffs by process_simple_history_option_log_details()
type _message_key converted to title case
level Simple History log level, title-cased
op create, update, or delete — entity events only; NULL otherwise
entityType Post type (SimplePostLogger), taxonomy slug (SimpleCategoriesLogger), or 'user' (SimpleUserLogger)
entityId Post ID, term ID, or user ID
slug post_name (posts) or term slug; empty for other loggers
entityTitle post_title (posts) or term name; empty for other loggers
post_status Current post status via get_post_status(); empty for term and other events
post_date Post creation date; empty for term and other events
post_modified Post last-modified date; empty for term and other events
category_id Comma-separated category term IDs via wp_get_post_terms(); empty when the post has none or for non-post events
parent Integer parent term ID for term events; empty for post and other events
show_in_archive The term was marked by an editor as show in archive — glossary_term posts only
is_event_topic The term was marked by an editor as event topic — glossary_term posts only
is_testimonial_topic The term was marked by an editor as testimonial topic — glossary_term posts only
is_partnership_type The term was marked by an editor as partnership type — glossary_term posts only
is_community_role The term was marked by an editor as community role — glossary_term posts only
is_SIA_team_member_role The term was marked by an editor as SIA team member role — glossary_term posts only
is_SIA_program The term was marked by an editor as SIA program — glossary_term posts only