ACF Service Management Suite
A comprehensive WordPress plugin for service-based businesses managing multiple locations, team members, and service areas.
by Ryan T. M. Reiffenberger · github.com/reclaimergold/acf-location-shortcodes · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/reclaimergold/acf-location-shortcodes/archive/refs/heads/main.zipA comprehensive WordPress plugin for service-based businesses managing multiple locations, team members, and service areas.
Built on Advanced Custom Fields (ACF), this plugin provides powerful shortcodes, Elementor integration, and a complete post type structure for location and team management.
Table of Contents
- Why Use This Plugin?
- Features
- Requirements
- Installation
- Admin Interface
- Quick Start Guide
- Shortcode Reference
- Usage Examples
- ACF Field Schema
- Troubleshooting
- Performance
- Contributing
- Support
- License
Why Use This Plugin?
- 🏢 Complete Service Business Solution - Manage locations, service areas, and team members from one plugin
- 📍 Physical & Service Area Support - Distinguish between physical offices and service-only areas
- 🚀 Easy to Use - Simple shortcodes that work anywhere in WordPress
- 🎯 Flexible - Display communities, locations, team members, or any ACF field data
- 🎨 Elementor Ready - Built-in query filters for Loop Grids and Carousels
- 🔍 Developer Friendly - Debug mode, comprehensive logging, and extensible architecture
- ⚡ Performance Optimized - Intelligent caching and minimal resource usage
- 🛡️ Secure - Follows WordPress coding standards with proper sanitization and escaping
- 📦 Complete Post Type Structure - Includes ACF field configurations for immediate deployment
- 🌐 Site Location Settings - (New in 2.3.0) Configure site-specific location info for multisite networks
- 🔄 Enhanced Media Sync - (New in 2.3.0) Improved attachment synchronization with smart duplicate detection
Features
🌐 Site Location Settings (New in 2.3.0)
Associate each site with a Location post to access all location data globally:
- Per-Site Configuration: Settings > Site Location
- How It Works: Select a Location post in Settings > Site Location. All ACF fields from that location are automatically available sitewide.
- Required ACF Fields: Add these fields to your Location post type:
location_city(Text) - City namelocation_state(Text) - Full state namelocation_state_abbrev(Text) - 2-letter state abbreviation- Plus any existing fields:
metro_area_name,county_name,full_service_area_name, etc.
- Shortcodes: Access location data anywhere:
[location_info field="county_name"],[site_service_areas] - Elementor Integration: Dynamic tags pull data from the associated location
- Perfect for: Multi-location businesses where each site represents a different location
Setup Steps:
- Add the required ACF fields (
location_city,location_state,location_state_abbrev) to your Location post type - Edit your Location posts and populate all fields (city, state, county, metro area, etc.)
- Go to Settings > Site Location on each site
- Select the Location post that represents that site
- Use shortcodes to display location data anywhere on the site
📖 See Site Location Settings Documentation
📦 Complete Post Type Structure
Includes pre-configured ACF field groups for:
-
Service Locations (
locationpost type)- Physical locations with addresses
- Service areas without physical offices
- Parent/child location relationships
- Community and service area management
-
Team Members (
team-memberpost type)- Team member profiles with photos
- Location assignments
- Profile management
See acf-export-2025-10-28.json for the complete field structure ready to import.
�🏠 Community List Shortcode
Display surrounding communities as a responsive horizontal list with customizable emoji bullets.
[location_communities]
[location_communities location_id="123" limit="5"]
[location_communities class="my-style" show_emoji="no"]
Perfect for: Showing service areas, neighborhoods, or nearby communities
📍 Location List Shortcode
Display all service locations with flexible filtering and ordering options.
[location_list]
[location_list type="physical" orderby="title"]
[location_list location_specific="true"]
Two display modes:
- All Locations Mode: Show all locations with type filtering (physical/service/all)
- Location-Specific Mode: Context-aware display showing only parent and related children
Perfect for: Location directories, office listings, service area pages
📋 Location Info Shortcode
Display any ACF field from a location post with fallback support.
[location_info field="service_area_shorthand"]
[location_info field="phone_number" default="Contact us"]
[location_info field="metro_area_name" location_id="123"]
Perfect for: Dynamic content, location details, custom field display
🏢 Location Address Shortcode
Get physical addresses for locations or their servicing parent location.
[location_address]
[location_address location_id="456"]
Perfect for: Maps integration, address display, automatic parent location lookup
🎨 Elementor Query Filters
Advanced filtering for Elementor Loop Grids, Loop Carousels, and Posts widgets.
Features:
- Multi-location selection with AND/OR logic
- Custom relationship field support
- Dynamic location detection
- Visual controls in Elementor editor
- Filter team members, posts, or any CPT by assigned location
Perfect for: Team member grids, service listings, location-based blog posts
Requirements
Minimum Requirements
- WordPress: 5.8 or higher
- PHP: 7.4 or higher
- ACF (Advanced Custom Fields): 5.0+ (Free or Pro)
Optional Requirements
- Elementor: 3.0+ (for query filtering features)
Included
- Complete ACF Field Export - Pre-configured field groups in
acf-export-2025-10-28.json - Location Post Type - Custom post type for service locations
- Team Member Post Type - Custom post type for team management
- Team Member Type Taxonomy - Taxonomy for categorizing team members
Recommended Environment
- WordPress 6.4+
- PHP 8.1+
- ACF Pro (for enhanced field types)
- Elementor Pro (for Loop Grid/Carousel widgets)
Installation
📦 Method 1: WordPress Admin (Recommended)- Download the latest release as a ZIP file
- Go to Plugins > Add New > Upload Plugin
- Choose the ZIP file and click Install Now
- Click Activate Plugin
- Download and extract the plugin ZIP file
- Upload the
acf-service-management-suitefolder to/wp-content/plugins/ - Go to Plugins in WordPress admin
- Find and activate "ACF Service Management Suite"
cd wp-content/plugins/
git clone https://github.com/ReclaimerGold/acf-service-management-suite.git
Then activate via WordPress admin or WP-CLI:
wp plugin activate acf-service-management-suite
Admin Interface
The plugin includes a comprehensive admin interface accessible from ACF SMS in your WordPress admin menu.
Dashboard Tab
ACF Status Check
- Displays whether Advanced Custom Fields is installed and active
- Provides one-click link to install ACF if missing
- Shows one-click Activate ACF button if installed but inactive
- Shows template sync status
Template Management
- Auto-Install Template button for one-click installation when ACF is active
- Automatically detects if template is installed or outdated
- Manual download option (
acf-template.json) with version stamping - Direct link to ACF import tools
- Visual indicators for template status (installed, outdated, missing)
Multisite Sync (Multisite installations only)
- Shows sync status across network sites
- Displays number of sites configured for sync
- Link to network settings for administrators
- Automatically syncs locations and team members when enabled
Quick Links
- Manage Locations
- Manage Team Members
- ACF Field Groups (when ACF is active)
- GitHub Repository
README Tab
Displays this documentation directly in your WordPress admin for easy reference.
Admin Notices
The plugin shows dismissible notices at the top of WordPress admin when:
ACF Not Installed
- Appears on all admin pages (except plugin settings page)
- Provides one-click link to install ACF from WordPress.org plugin directory
- Link includes pre-search query to show ACF first
- Can be dismissed per user
Template Mismatch Detected
- Appears when installed ACF field groups don't match the plugin template
- Provides link to download latest template
- Helps ensure all features work correctly
- Can be dismissed per user
How to Access:
- Go to WordPress admin
- Click ACF SMS in the left sidebar
- Use tabs to navigate between Dashboard and README
Quick Start Guide
🔌 Step 1: Install Dependencies
The plugin requires Advanced Custom Fields to function. The admin interface will alert you if ACF is not installed.
Option A: Install via Admin Interface (Easiest)
- Go to ACF SMS in your WordPress admin menu
- If ACF is not installed, you'll see a warning with an "Install ACF Now" button
- Click the button to go directly to the ACF plugin installation page
- Click Install Now, then Activate
Option B: Manual Installation
- Go to Plugins > Add New
- Search for "Advanced Custom Fields"
- Install and activate ACF Free (or ACF Pro if you have it)
📥 Step 2: Import ACF Field Groups
This plugin includes pre-configured field groups ready to import.
Option A: Auto-Install via Admin Interface (Easiest!)
- Go to ACF SMS > Dashboard in your WordPress admin
- If templates are not installed, you'll see an Auto-Install Template button
- Click the button and wait a few seconds
- Templates will be automatically imported into ACF
- Page will reload showing updated status
Option B: Manual Download and Import
- Go to ACF SMS > Dashboard in your WordPress admin
- Click the Download Template (Manual) button
- The file
acf-template-2.2.0.jsonwill download - Go to ACF → Tools → Import Field Groups
- Choose the downloaded JSON file
- Click Import JSON
Option C: Import from Plugin Files
- Go to ACF → Tools
- Click on Import Field Groups tab
- Choose File: Select
acf-import-templates/acf-template.jsonfrom the plugin directory - Click Import JSON
This will create:
- ✅ Location Details field group (11 fields for service locations)
- ✅ Team Member Details field group (4 fields for team members)
- ✅ Service Locations post type
- ✅ Team Members post type
- ✅ Team Member Types taxonomy
🎉 Auto-Installation on ACF Activation
When you activate the ACF plugin on any site, the plugin will automatically:
- Detect that ACF was just activated
- Check if field groups are already installed
- Auto-install the template if not present or outdated
- Show a success notice when complete
This means you can install ACF and the templates will be configured automatically!
📍 Step 3: Create Your First Location
- Go to Service Locations > Add New
- Title: Enter city name (e.g., "Sioux Falls")
- Service Area Shorthand:
Sioux Falls, SD - Surrounding Community List:
Brooks Harbor, Eagle Run, Shadow Wood, Charleswood - Physical Address: (Enter if physical location, leave empty if service area only)
- Add other fields as needed
- Publish
🚀 Step 4: Use Shortcodes
Add to any page or post:
[location_communities location_id="123"]
Or on the location post itself:
[location_communities]
[location_info field="service_area_shorthand"]
[location_list location_specific="true"]
Expected Output:
🏠 Brooks Harbor 🏠 Eagle Run 🏠 Shadow Wood 🏠 Charleswood
🐛 Step 5: Enable Debug Mode (Optional)
For troubleshooting, add to your wp-config.php:
define( 'ACF_LS_DEBUG', true );
This enables verbose error messages with helpful debugging information (only visible to users with edit permissions).
Shortcode Reference
💡 Pro Tip: For site-wide location data, use
[location_info field="FIELD_NAME"]to access ANY ACF field from the Location post associated in Settings > Site Location. This works forcounty_name,metro_area_name,full_service_area_name, and any custom fields you add!
[location_communities]
Display surrounding communities as a horizontal list.
| Attribute | Type | Default | Description |
|---|---|---|---|
location_id |
int | Current post ID | Location post to display |
limit |
int | 0 (all) | Maximum communities to show |
class |
string | '' | Additional CSS class |
show_emoji |
string | 'yes' | Show house emoji ('yes'/'no') |
Example:
[location_communities location_id="123" limit="5" show_emoji="yes"]
[location_info]
Display any ACF field from a location post.
| Attribute | Type | Default | Description |
|---|---|---|---|
location_id |
int | Current post ID | Location post to display |
field |
string | (required) | ACF field name |
default |
string | '' | Fallback if field is empty |
Example:
[location_info field="phone_number" default="Contact us"]
[location_list]
Display a directory of locations with filtering.
| Attribute | Type | Default | Description |
|---|---|---|---|
location_specific |
bool | false | Enable context-aware mode (parent + children only) |
location_id |
int | Current post ID or Site Location | Location post to use |
type |
string | 'all' | Filter: 'all', 'physical', 'service' |
orderby |
string | 'title' | Sort by: 'title', 'date', 'ID' |
order |
string | 'ASC' | Sort order: 'ASC' or 'DESC' |
limit |
int | 0 (all) | Maximum locations to show |
class |
string | '' | Additional CSS class |
show_emoji |
string | 'yes' | Show map pin emoji |
Smart Behavior:
- On Location pages: Uses the current Location post
- On non-Location pages (e.g., homepage): Automatically uses the Location from Settings > Site Location and enables location-specific mode
- Override: Explicitly set
location_idto use a specific location anywhere
Example:
[location_list type="physical" orderby="title" order="ASC"]
[location_list location_id="123"]
[location_address]
Get the physical address for a location (or its parent location).
| Attribute | Type | Default | Description |
|---|---|---|---|
location_id |
int | Current post ID | Location post to display |
Returns format: Site Title, Address
Example:
[location_address location_id="456"]
[site_location_title]
Display the post title from the associated Location post (typically the city name).
No attributes
Requires:
- A Location selected in Settings > Site Location
Example:
[site_location_title]
Returns: Sioux Falls (the title of the Location post)
[site_location_city]
Display the city from the associated Location post's ACF fields.
No attributes
Requires:
- ACF field
location_cityon your Location post type - A Location selected in Settings > Site Location
Example:
[site_location_city]
Returns: Sioux Falls
[site_location_state]
Display the state from the associated Location post's ACF fields.
No attributes
Requires:
- ACF field
location_stateon your Location post type - A Location selected in Settings > Site Location
Example:
[site_location_state]
Returns: South Dakota
[site_location_state_abbrev]
Display the state abbreviation from the associated Location post's ACF fields.
No attributes
Requires:
- ACF field
location_state_abbrevon your Location post type - A Location selected in Settings > Site Location
Example:
[site_location_state_abbrev]
Returns: SD
[site_location_city_state]
Display the city and state from the associated Location post's ACF fields.
| Attribute | Type | Default | Description |
|---|---|---|---|
format |
string | 'abbrev' | Format: 'abbrev' or 'full' |
Requires:
- ACF fields
location_city,location_state, andlocation_state_abbrevon your Location post type - A Location selected in Settings > Site Location
Examples:
[site_location_city_state]
[site_location_city_state format="full"]
Returns:
abbrev:Sioux Falls, SDfull:Sioux Falls, South Dakota
[site_service_areas]
Display service areas for the associated location (automatically retrieves child Location posts).
| Attribute | Type | Default | Description |
|---|---|---|---|
format |
string | 'comma_and' | Format: 'comma', 'comma_and', 'comma_and_surrounding', or 'list' |
Requires:
- A Location selected in Settings > Site Location
- Child Location posts (service areas) associated with the parent location
Examples:
[site_service_areas]
[site_service_areas format="comma"]
[site_service_areas format="comma_and_surrounding"]
[site_service_areas format="list"]
Returns (examples):
comma_and:Sioux Falls, Brandon, and Harrisburgcomma:Sioux Falls, Brandon, Harrisburgcomma_and_surrounding:Sioux Falls, Brandon, and surrounding locationslist:<ul class="acf-sms-service-areas-list"> <li>Sioux Falls</li> <li>Brandon</li> <li>Harrisburg</li> </ul>
Configure via: Settings > Site Location
[team_member_locations]
Display a list of locations assigned to the team member. Should be used on a team-member post page.
| Attribute | Type | Default | Description |
|---|---|---|---|
team_member_id |
int | Current post ID | Team member post to display |
format |
string | 'comma' | Format: 'comma', 'comma_and', or 'list' |
class |
string | '' | Additional CSS class |
Formats:
comma: Comma-separated list (e.g., "Sioux Falls, Brandon, Harrisburg")comma_and: Comma-separated with "and" before last item (e.g., "Sioux Falls, Brandon, and Harrisburg")list: HTML unordered list
Requires:
- Must be used on a team-member post page (or provide
team_member_idattribute) - Team member must have locations assigned via the
locationACF field
Examples:
[team_member_locations]
[team_member_locations format="comma_and"]
[team_member_locations format="list" class="my-locations"]
[team_member_locations team_member_id="123" format="comma"]
Returns (examples):
comma:Sioux Falls, Brandon, Harrisburgcomma_and:Sioux Falls, Brandon, and Harrisburglist:<ul class="acf-ls-team-member-locations"> <li>Sioux Falls</li> <li>Brandon</li> <li>Harrisburg</li> </ul>
[team_member_specialties]
Display a list of specialties (services) assigned to the team member. Should be used on a team-member post page.
| Attribute | Type | Default | Description |
|---|---|---|---|
team_member_id |
int | Current post ID | Team member post to display |
format |
string | 'comma' | Format: 'comma', 'comma_and', or 'list' |
class |
string | '' | Additional CSS class |
Formats:
comma: Comma-separated list (e.g., "Dermatology, Cosmetic Surgery, Botox")comma_and: Comma-separated with "and" before last item (e.g., "Dermatology, Cosmetic Surgery, and Botox")list: HTML unordered list
Requires:
- Must be used on a team-member post page (or provide
team_member_idattribute) - Team member must have specialties assigned via the
specialtiesACF field
Examples:
[team_member_specialties]
[team_member_specialties format="comma_and"]
[team_member_specialties format="list" class="my-specialties"]
[team_member_specialties team_member_id="123" format="comma"]
Returns (examples):
comma:Dermatology, Cosmetic Surgery, Botoxcomma_and:Dermatology, Cosmetic Surgery, and Botoxlist:<ul class="acf-ls-team-member-specialties"> <li>Dermatology</li> <li>Cosmetic Surgery</li> <li>Botox</li> </ul>
📖 For more documentation: See DEVELOP.md for extension guide and CHANGELOG.md for version history
Usage Examples
Example 1: Location Landing Page
<h1>[location_info field="full_service_area_name"]</h1>
<p>Serving [location_info field="county_name"] and the [location_info field="metro_area_name"]</p>
<h2>Communities We Serve</h2>
[location_communities limit="10"]
<h2>Our Service Locations</h2>
[location_list location_specific="true"]
<h3>Contact Us</h3>
<p>Phone: [location_info field="phone_number"]</p>
<p>Located near: [location_info field="located_near"]</p>
Example 2: Location Directory Page
<h2>Our Physical Office Locations</h2>
[location_list type="physical" orderby="title"]
<h2>Service Areas</h2>
[location_list type="service" orderby="title"]
Example 3: Team Members by Location (Elementor)
- Add Loop Grid widget
- Query > Post Type:
team-member - Query > Filter by Service Location: Yes
- Query > Select Locations: Choose location(s)
- Query > Relationship Field Name:
assigned_location
Example 4: Team Member Profile Page
On a team-member post page, display assigned locations and specialties:
<h2>Service Locations</h2>
<p>I serve the following locations:</p>
[team_member_locations format="comma_and"]
<h2>Specialties</h2>
<p>My areas of expertise include:</p>
[team_member_specialties format="comma_and"]
Or as lists:
<h2>Service Locations</h2>
[team_member_locations format="list"]
<h2>Specialties</h2>
[team_member_specialties format="list"]
Example 5: Google Maps Integration
In Elementor Google Map widget Address field:
[location_address]
This automatically shows the correct physical address, even for service areas (uses parent location).
Example 6: Custom Styled Communities
[location_communities class="badge-style" show_emoji="no"]
Add CSS:
.badge-style .acf-ls-communities__item {
background: #0073aa;
color: white;
padding: 8px 16px;
border-radius: 20px;
}
Project Structure
acf-service-management-suite/
├── acf-service-management-suite.php # Main plugin (bootstrap)
├── includes/ # Core plugin classes
│ ├── class-acf-helpers.php # ACF data retrieval
│ ├── class-shortcodes.php # Shortcode handlers
│ └── class-elementor-integration.php # Elementor integration
├── assets/ # Frontend assets
│ ├── css/shortcodes.css # Shortcode styles
│ └── js/elementor-controls.js # Elementor editor JS
├── acf-export-2025-10-28.json # ACF field structure (ready to import)
├── DEVELOP.md # Development guide
├── CHANGELOG.md # Version history
├── copilot-instructions.md # AI development guidelines
└── README.md # This file
For detailed architecture, see DEVELOP.md
ACF Field Schema
This plugin includes a complete ACF export file (acf-export-2025-10-28.json) ready to import. It creates:
⚠️ Important for Site Location Features: To use site-wide location shortcodes (
[site_location_city], etc.), you must ADD these additional fields to your Location post type:
location_city(Text) - City namelocation_state(Text) - Full state namelocation_state_abbrev(Text) - 2-letter state abbreviationThese are not included in the default export but are required for the site location association feature.
Post Types
Service Locations (location)
- Purpose: Physical locations and service areas
- Permalink:
/locations/{post-name} - Features: Title, editor, author, revisions, thumbnail
- Icon: 📍 Dashicons Store
Team Members (team-member)
- Purpose: Staff and team member profiles
- Permalink:
/people/{post-name} - Features: Title, revisions
- Icon: 👥 Dashicons Admin Users
Taxonomies
Team Member Types (team-member-type)
- Purpose: Categorize team members (e.g., Doctor, Nurse, Admin)
- Hierarchical: Yes
- Assigned To:
team-memberpost type
Location Field Group (11 Fields)
| Field Name | Field Type | Required | Description | Example |
|---|---|---|---|---|
service_area_shorthand |
Text | No | Short service area name | Sioux Falls, SD |
address |
Text | No | Physical address (determines location type) | 123 Main St, Sioux Falls, SD 57104 |
phone_number |
Text | No | Contact phone (shown if address exists) | (605) 555-1234 |
location_site_url |
URL | No | Dedicated location website | https://siouxfalls.example.com |
servicing_physical_location |
Post Object | No | Parent physical location (shown if no address) | (relationship to location post) |
full_service_area_name |
Text | No | Full regional name | Sioux Falls & The Sioux Empire |
located_near |
Text | No | Nearby landmark | Near Falls Park |
metro_area_name |
Text | No | Metropolitan area | Sioux Falls Metro |
county_name |
Text | No | County name | Minnehaha County |
surrounding_community_list |
Text | No | Comma-separated communities | Brooks Harbor, Eagle Run, Shadow Wood |
team_members_assigned |
Relationship | No | Assigned team members | (relationship to team-member posts) |
Team Member Field Group (4 Fields)
| Field Name | Field Type | Required | Description | Example |
|---|---|---|---|---|
profile_picture |
Image | No | Team member photo | (image file) |
title |
Text | No | Job title/position | Lead Physician |
location |
Select (Multiple) | No | Assigned locations | Sioux Falls, SD |
full_profile_url |
URL | No | Link to full bio page | https://example.com/people/john-doe |
Physical Location Logic:
- Location WITH
addressfield value = Physical Location - Location WITHOUT
addressfield = Service Area (must setservicing_physical_location)
Import Instructions:
- Go to ACF > Tools
- Select Import Field Groups tab
- Choose
acf-export-2025-10-28.jsonfrom plugin directory - Click Import JSON
Multisite Features
Automatic Post Synchronization
For WordPress multisite networks, the plugin can automatically synchronize locations and team members across all sites.
How It Works:
- When you create, update, or delete a location or team member on one site, it syncs to other sites
- Each synced post maintains a reference to its source site and post ID
- ACF field data, taxonomies, and post status are all synchronized
- Supports trash/untrash operations
Enabling Sync:
- Go to Network Admin > ACF SMS Network Settings (coming soon)
- Enable "Multisite Synchronization"
- Select which sites should receive synced content
- Save settings
Current Limitations:
- Relationship fields (like team member → location assignments) are not remapped across sites yet
- Featured images are referenced but not copied to media libraries
- Syncing is currently one-way (from source to targets)
Configuration:
// Enable sync network-wide
update_site_option( 'acf_sms_sync_enabled', true );
// Set specific sites to sync to (or leave empty for all sites)
update_site_option( 'acf_sms_sync_sites', array( 2, 3, 5 ) );
// Disable sync for specific site via filter
add_filter( 'acf_sms_sync_enabled', function( $enabled ) {
if ( get_current_blog_id() === 4 ) {
return false; // Don't sync on site 4
}
return $enabled;
} );
Viewing Sync Status:
- Network administrators can see sync status in ACF SMS > Dashboard
- Shows number of sites configured for synchronization
- Displays whether sync is enabled or disabled
Troubleshooting
Common Issues
❓ Shortcode shows raw text instead of output
- Ensure the plugin is activated
- Verify ACF is installed and active
- Check that you're using the correct shortcode syntax
❓ "Invalid location ID" error
- Verify the location post ID is correct
- Ensure the post type is
location - Check that the post is published
❓ "No communities found" error
- Add content to the
surrounding_community_listfield - Ensure it's a comma-separated list
- Check field name matches exactly
❓ Elementor filtering not working
- Verify the relationship field name is correct
- Ensure posts have locations assigned
- Check that ACF field is a Relationship or Post Object type
❓ Debug Information
Enable debug mode in wp-config.php:
define( 'ACF_LS_DEBUG', true );
This will show detailed error messages with:
- Post IDs and types
- Available fields
- Edit links to fix issues
- Suggested solutions
See DEVELOP.md for complete troubleshooting guide.
Performance
Caching
- WordPress object cache with 1-hour expiration
- Efficient ACF field queries
- Lazy loading of Elementor integration
- Minimal CSS/JS footprint
Optimization Tips
- Use specific location IDs instead of querying all locations
- Limit the number of communities displayed
- Cache full pages with a caching plugin
- Use a persistent object cache (Redis/Memcached)
Security
- All user input is sanitized
- All output is properly escaped
- Capability checks for debug output
- Follows WordPress coding standards
- Regular security audits
Browser Support
- Chrome (last 2 versions)
- Firefox (last 2 versions)
- Safari (last 2 versions)
- Edge (last 2 versions)
- Mobile browsers (iOS Safari, Chrome Mobile)
Contributing
We welcome contributions! Here's how to get started:
- Report Bugs: Open an issue with detailed reproduction steps
- Suggest Features: Describe your use case and proposed solution
- Submit Pull Requests: Follow the guidelines in DEVELOP.md
- Improve Documentation: Help make our docs clearer
Development Setup
See DEVELOP.md for:
- Local development environment setup
- Coding standards and guidelines
- Testing procedures
- Extension and customization guide
Support
- Documentation: This README + DEVELOP.md
- Issues: https://github.com/ReclaimerGold/acf-service-management-suite/issues
- Source Code: https://github.com/ReclaimerGold/acf-service-management-suite
Changelog
See CHANGELOG.md for complete version history.
License
This plugin is licensed under the GNU General Public License v2 or later.
ACF Service Management Suite - Complete service business location & team management
Copyright (C) 2025 Falls Technology Group, LLC
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
For the full license text, see LICENSE or visit: https://www.gnu.org/licenses/gpl-2.0.html
Credits
Developed by: Falls Technology Group, LLC
Author: Ryan T. M. Reiffenberger
GitHub: https://github.com/ReclaimerGold
Version: 2.0.0
Last Updated: October 28, 2025