Files
cultureat-bak/.claude/ARCHITECTURE.md

18 KiB

ARCHITECTURE.md - CCAT Data Structure Reference

Table of Contents


Custom Post Types Overview

CPT Name Label GraphQL Single Rewrite Slug Hierarchical Description
contributor Contributor Contributor -- No Artist/organization profiles
event Event Event evenement Yes Base event descriptions without specific dates
listing Listing Listing offre No Job offers and opportunities
location Location Location lieu Yes Venue information with hierarchical structure
page Page Page page Yes WordPress default pages with flexible content
profile Profile Profile profil No User cultural profiles for members
project Project Project projet No CCAT projects and initiatives
representation Representation Representation -- No Specific event instances with dates/times/locations
resource Resource Resource ressource No Document/link repository
template Template Template -- No Reusable content blocks for flexible layouts

Taxonomies Overview

Taxonomy Name Label Associated CPTs Hierarchical GraphQL Single Description
discipline Discipline contributor, event Yes Discipline Artistic/cultural categories
listing-category Listing Category listing Yes ListingCategory Job/proposal types
project-category Project Category project Yes ProjectCategory CCAT project types
resource-category Resource Category resource Yes ResourceCategory Resource organization categories

Custom Post Type Fields

Contributor (group_post_contributor)

Purpose: Artist/organization profiles that can be linked to events

Field Name Label Type Required Description
contributor_type Contributor type select Yes Type of contributor (individual, organisation)
alternative_titles Alternative titles repeater No Alternative names for the contributor
alternative_titles.name Name text Yes Alternative name entry
description Description wysiwyg No Rich text description of contributor
localities Localities repeater No Physical locations associated with contributor
localities.address Address clone Yes Clones city address field for location
disciplines Discipline(s) taxonomy No Links to discipline taxonomy terms
entity Entity clone No External identifiers
gallery Gallery clone No Media gallery
social Social clone No Social media profiles

Event (group_post_event)

Purpose: Base event information without specific dates/times

Field Name Label Type Required Description
event_type Event type select Yes Type of event (Exposition, Festival, Spectacle)
target_audience Target audience select Yes Age group (Tout public, Enfants, Familial, Adultes 18+)
description Description wysiwyg No Rich text event description
disciplines Discipline(s) taxonomy No Links to discipline taxonomy terms
is_wordless Wordless true_false No Indicates if event is wordless
languages Language(s) acfe_languages No Event languages (conditional: shown if not wordless)
entity Entity clone No Clones abstract entity group (external identifiers)
social Social clone No Clones abstract social group (social media profiles)
gallery Gallery clone No Clones abstract gallery group (images/videos)
credits Credits clone No Clones abstract credits group (contributors and roles)

Listing (group_post_listing)

Purpose: Job offers and opportunities

Field Name Label Type Required Description
listing_category Listing category taxonomy Yes Links to listing_category taxonomy
deadline Application deadline date_picker No Application deadline date
external_link External link url No Link to external application

Location (group_post_location)

Purpose: Venue information for events

Field Name Label Type Required Description
location_type Location type select Yes Type of location (virtual, Bar, Salle de spectacle)
description Description wysiwyg No Rich text description of location
address Address clone No Clones geo address field (conditional: not shown for virtual)
configurations Possible configurations repeater No Different setup configurations for venue
configurations.name Configuration name text Yes Name of the configuration
universal_access Universal access checkbox No Accessibility features available
entity Entity clone No External identifiers
social Social clone No Social media profiles
gallery Gallery clone No Media gallery

Page (group_post_page)

Purpose: WordPress default pages with flexible content capabilities

Field Name Label Type Required Description
builder Builder clone No Clones abstract builder group (flexible content sections)

Note: This field group extends WordPress's default page post type with flexible content capabilities. The default content editor is hidden (hide_on_screen: the_content) in favor of the flexible builder system.

Profile (group_post_profile)

Purpose: User profile information for members

Field Name Label Type Required Description
contact Contact clone Yes Clones abstract contact group (personal info & address)
billing_same Same as contact true_false No Whether billing matches contact info
billing Billing clone No Separate billing contact info (conditional: shown if billing_same is false)
profile_type Profile type select Yes Type of profile (individual, collective, organization, institution)
email_preferences Email preferences group No Group containing email subscription preferences
email_preferences.categories Categories checkbox No Email categories to subscribe to
email_preferences.disciplines Disciplines checkbox No Discipline-based email preferences
email_preferences.event_types Event types checkbox No Event type email preferences
email_preferences.mrc MRC checkbox No Regional email preferences

Project (group_post_project)

Purpose: CCAT projects and initiatives

Field Name Label Type Required Description
project_categories Project categories taxonomy Yes Links to project_category taxonomy
period Period group No Project timeline
period.start_month Start month date_picker Yes Project start (month/year format)
period.end_month End month date_picker No Project end (month/year format)
builder Builder clone No Clones abstract builder group (flexible content sections)

Representation (group_post_representation)

Purpose: Specific event instances with dates/times

Field Name Label Type Required Description
event Event post_object Yes Links to base Event post
description Description wysiwyg No Specific description for this representation
schedule_type Schedule type select Yes Type of scheduling (range, days, multiple)
range Range group No Date range fields (conditional: when schedule_type = range)
range.start_date Start date date_picker Yes Range start date
range.end_date End date date_picker Yes Range end date
days Days repeater No Individual days (conditional: when schedule_type = days/multiple)
days.start_date_time Start date/time date_time_picker Yes Event start with time
days.end_time End time time_picker No Event end time
offer Offer clone No Clones abstract offer group (pricing, location, registration)

Resource (group_post_resource)

Purpose: Document repository

Field Name Label Type Required Description
resource_category Resource category taxonomy Yes Links to resource_category taxonomy
documents Documents repeater No List of documents
documents.title Title text Yes Document title
documents.document_type Document type select Yes Type of document (file, url)
documents.file File file Yes File upload (conditional: when document_type = file)
documents.url URL url Yes External URL (conditional: when document_type = url)

Template (group_post_template)

Purpose: Reusable content templates

Field Name Label Type Required Description
builder Builder clone No Clones abstract builder group (flexible content sections)

Abstract Field Groups

Address City (group_abstract_address_city)

Purpose: City-level address information

Field Name Label Type Required Description
address Address acfe_address Yes Address with city-level search, Canada only

Address Contact (group_abstract_address_contact)

Purpose: Full contact address information

Field Name Label Type Required Description
address Address acfe_address Yes Complete address with street details, Canada only

Address Geo (group_abstract_address_geo)

Purpose: Geographic address with coordinates

Field Name Label Type Required Description
address Address acfe_address Yes Address with establishment search and lat/lng coordinates

Builder (group_abstract_builder)

Purpose: Flexible content builder with layout sections

Field Name Label Type Required Description
sections Sections flexible_content No Flexible content with layouts:
sections.text_block Text block layout - WYSIWYG content block
sections.text_block.content Content wysiwyg Yes Rich text content
sections.template Template layout - Reference to template post
sections.template.template Template post_object Yes Links to Template post type

Contact (group_abstract_contact)

Purpose: Personal contact information

Field Name Label Type Required Description
first_name First name text Yes Contact's first name
last_name Last name text Yes Contact's last name
email Email email Yes Contact email address
phone Phone acfe_phone_number Yes Phone number (Canada format)
address Address clone Yes Clones contact address field

Credits (group_abstract_credits)

Purpose: Attribution and contributor roles

Field Name Label Type Required Description
contributions Contributions repeater No List of contributor roles
contributions.contributionTypes Contribution types checkbox Yes Types of contribution (Auteur, Compositeur, Interprète)
contributions.contributor Contributor post_object Yes Links to Contributor post

Entity (group_abstract_entity)

Purpose: External entity identifiers

Field Name Label Type Required Description
identifiers Identifiers repeater No External identifier URLs
identifiers.uri URI url Yes External identifier URL

Purpose: Media gallery with images and videos

Field Name Label Type Required Description
medias Medias repeater No List of media items
medias.mediaType Media type select Yes Type of media (image, youtube)
medias.image Image image Yes Image upload (conditional: when mediaType = image)
medias.youtube_url YouTube URL url Yes YouTube video URL (conditional: when mediaType = youtube)

Offer (group_abstract_offer)

Purpose: Event offering details (pricing, registration, location)

Field Name Label Type Required Description
attendance_mode Attendance mode select Yes How event is attended (offline, online, mixed)
is_async Is asynchronous true_false No Whether online event is asynchronous
offer_status Offer status select Yes Event status (upcoming, confirmed, complete, cancelled, postponed)
where Where group No Location details (conditional: for offline/mixed events)
where.location Location post_object Yes Links to Location post
where.configuration Configuration select No Venue configuration
pricing Pricing group No Price information
pricing.is_free Free true_false No Whether event is free
pricing.min_price Minimum price number Yes Minimum price (conditional: if not free)
registration Registration group No Registration details
registration.form Form select No Registration form
registration.url URL url No Registration URL
registration.email Email email No Registration email
registration.phone Phone acfe_phone_number No Registration phone
notifications Notifications repeater No Scheduled notifications
notifications.date_time Date/time date_time_picker Yes When to send notification
notifications.subject Subject text Yes Email subject
notifications.message Message wysiwyg Yes Email message content
notifications.sent_status Sent status select Yes Notification status (planned, sent, failed)

Social (group_abstract_social)

Purpose: Social media profiles

Field Name Label Type Required Description
profiles Profiles repeater No List of social media profiles
profiles.url URL url Yes Social media profile URL

Field Relationships

Post Object Relationships

  • Event → Representation: Base events are instantiated through representations
  • Representation → Event: Each representation references one base event
  • Representation → Location: Event instances specify venue through offer.where.location
  • Contributor → Credits: Contributors are linked to events through credits system
  • Template → Builder: Templates contain flexible content sections that can be referenced

Taxonomy Relationships

  • Discipline: Applied to both event and contributor CPTs
  • Resource Category: Applied to resource CPTs only
  • Project Category: Applied to project CPTs only
  • Listing Category: Applied to listing CPTs only

Clone Field Usage

Abstract Group Used By CPTs
Address City Contributor (locality)
Address Contact Profile (contact, billing)
Address Geo Location (address)
Builder Project, Template, Page
Contact Profile (contact, billing)
Credits Event
Entity Event, Contributor, Location
Gallery Event, Contributor, Location
Offer Representation
Social Event, Contributor, Location, Options Page

Technical Implementation

GraphQL Integration

  • All CPTs enabled for GraphQL with custom single/plural names
  • All fields set show_in_graphql: 1 for API exposure
  • Required fields use graphql_non_null: 1 for schema validation
  • Custom GraphQL field names follow camelCase convention

ACF Extended Pro Features

  • Advanced Address Fields: Google Places integration, Canada-specific
  • Phone Number Fields: Country-specific formatting (Canada)
  • Language Selection: Multi-language support with conditional logic
  • Flexible Content: Modal editing, preview capabilities
  • Template System: Reusable content blocks with clone functionality

Conditional Logic Patterns

  • Address fields hidden for virtual locations (location_type != 'virtual')
  • Language fields hidden for wordless events (is_wordless != 1)
  • Billing fields conditional on "same as contact" toggle
  • Pricing fields conditional on free/paid status
  • Schedule layouts vary based on schedule type selection

WordPress Integration

  • Custom rewrite slugs in French for public-facing URLs
  • Hierarchical structure for events and locations
  • Thumbnail and excerpt support for content display
  • Page attributes for ordering and parent-child relationships
  • Translation-ready with __() functions and 'ccat' text domain

Performance Considerations

  • Clone fields reduce field duplication and maintain consistency
  • Taxonomy relationships indexed for efficient querying
  • GraphQL schema optimized with proper field exposure
  • Conditional field loading reduces unnecessary data transfer