Suma Dealer Locator
Overview
The Suma Dealer Locator plugin provides store/dealer location functionality with map display, proximity search, and category filtering. Users can find authorized Walkers retailers nearest to their location.
Plugin Details
Plugin Name: Suma Dealer Locator
Version: 3.0.2
Developer: Rhino Group
Location: wp-content/plugins/suma-dealer-locator/
Namespace: Suma\DealerLocator\
Features
- Interactive Map: Google Maps integration with custom markers
- Proximity Search: Find dealers by address, city, or ZIP code
- Category Filtering: Filter by dealer type or product specialization
- Responsive Design: Bootstrap-free responsive templates
- Gutenberg Block: Native WordPress editor block
- Visual Composer Support: Legacy VC integration
- Elementor Widget: Custom Elementor integration
- IP-Based Location: MaxMind GeoIP automatic location detection
- Directions: Get directions link from user location to dealer
Directory Structure
suma-dealer-locator/
├── suma-dealer-locator.php # Main plugin file
├── readme.txt # Plugin readme
├── admin/ # Admin interface
├── frontend/ # Public-facing functionality
├── includes/ # Core classes
│ ├── class-activator.php # Activation logic
│ ├── class-deactivator.php # Deactivation logic
│ ├── class-suma-dealer-locator.php # Main plugin class
│ ├── class-custom-routes.php # REST API routes
│ ├── class-elementor-block.php # Elementor widget
│ ├── class-elementor.php # Elementor integration
│ ├── class-geo-ip-lookup.php # GeoIP functionality
│ ├── class-utils.php # Utility functions
│ └── class-visual-composer.php # VC integration
├── framework/ # Suma framework
├── templates/ # Frontend templates
├── assets/ # CSS, JS, images
├── languages/ # Translation files
└── vendor/ # Composer dependencies
Installation & Activation
Activation Process
When activated, the plugin:
- Creates custom post type:
dealer - Registers dealer taxonomies
- Flushes rewrite rules
- Creates database tables (if needed)
- Sets default options
Dependencies
- Carbon Fields: Custom field management (bundled)
- MaxMind GeoIP: IP-based location detection (optional)
- Google Maps API: Map display and geocoding (API key required)
Custom Post Type: Dealer
Post Type: dealer
Supports: title, editor, thumbnail, excerpt
Hierarchical: No
Public: Yes (queryable)
Show in REST: Yes
Custom Fields (Carbon Fields)
Dealer location data stored as post meta:
| Field | Type | Purpose |
|---|---|---|
dealer_address | Text | Street address |
dealer_city | Text | City |
dealer_state | Text/Select | State/province |
dealer_zip | Text | Postal code |
dealer_country | Select | Country |
dealer_phone | Text | Phone number |
dealer_email | Contact email | |
dealer_website | URL | Dealer website |
dealer_latitude | Hidden | Geocoded latitude |
dealer_longitude | Hidden | Geocoded longitude |
Taxonomies
dealer_category:
- Hierarchical: Yes
- Purpose: Categorize dealers (e.g., "Authorized Retailer", "Service Center")
Shortcodes
Main Dealer Locator
[suma_dealer_locator]
Attributes:
categories— Comma-separated category IDs or slugs to filterradius— Default search radius in miles (default: 25)zoom— Initial map zoom level (default: 10)height— Map height in pixels (default: 500)
Example:
[suma_dealer_locator categories="authorized-retailer" radius="50" height="600"]
Gutenberg Block
Block Name: Suma Dealer Locator
Category: Widgets
Icon: Location marker
Settings:
- Category selection
- Default radius
- Map height
- Initial zoom level
Elementor Widget
Widget Name: Suma Dealer Locator
Category: Suma Widgets
Controls:
- Map Settings: Height, zoom, center point
- Search Settings: Default radius, units (miles/km)
- Filter Settings: Enable/disable category filters
- Style Settings: Colors, fonts, spacing
Frontend Functionality
Search Flow
User enters address/ZIP
↓
Geocode address via Google Maps API
↓
Query dealers by proximity (SQL with Haversine formula)
↓
Display results on map + in list
↓
User clicks marker or listing
↓
Show dealer info window
Proximity Search Query
Uses Haversine formula to calculate distance:
SELECT *,
( 3959 * acos(
cos( radians( :user_lat ) ) *
cos( radians( dealer_latitude ) ) *
cos( radians( dealer_longitude ) - radians( :user_lng ) ) +
sin( radians( :user_lat ) ) *
sin( radians( dealer_latitude ) )
) ) AS distance
FROM dealers
HAVING distance < :radius
ORDER BY distance ASC
LIMIT :limit
Units:
- Miles: 3959 (Earth radius in miles)
- Kilometers: 6371 (Earth radius in km)
GeoIP Auto-Location
MaxMind Integration (class-geo-ip-lookup.php):
- Detect user's IP address
- Query MaxMind GeoIP database
- Get approximate latitude/longitude
- Auto-populate search field with detected location
Fallback: Browser geolocation API (requires user permission)
Templates
Template Hierarchy
Plugin templates can be overridden in theme:
Plugin Location: plugins/suma-dealer-locator/templates/
Theme Override: themes/your-theme/suma-dealer-locator/
Available Templates
dealer-locator.php— Main locator interfacedealer-list.php— Dealer list displaydealer-map.php— Map containerdealer-info-window.php— Map marker popupdealer-filters.php— Category filter UIdealer-search-form.php— Search input form
Template Example
<?php
/**
* Theme override: suma-dealer-locator/dealer-locator.php
*/
?>
<div class="suma-dealer-locator">
<?php echo do_action('suma_dealer_locator_before_search'); ?>
<div class="dealer-search">
<input type="text" id="dealer-search-input" placeholder="Enter ZIP or address">
<button id="dealer-search-btn">Search</button>
</div>
<div class="dealer-map" id="dealer-map"></div>
<div class="dealer-results" id="dealer-results">
<!-- Results populated via AJAX -->
</div>
</div>
REST API Endpoints
Search Dealers
Endpoint: /wp-json/suma-dealer-locator/v1/search
Method: GET
Parameters:
lat(required) — User latitudelng(required) — User longituderadius(optional) — Search radius in miles (default: 25)categories(optional) — Comma-separated category IDslimit(optional) — Maximum results (default: 20)
Response:
{
"dealers": [
{
"id": 123,
"name": "Joe's Gun Shop",
"address": "123 Main St",
"city": "Springfield",
"state": "IL",
"zip": "62701",
"phone": "(555) 123-4567",
"website": "https://joesgunshop.com",
"latitude": 39.7817,
"longitude": -89.6501,
"distance": 2.34,
"categories": ["Authorized Retailer"]
}
],
"count": 1
}
Geocode Address
Endpoint: /wp-json/suma-dealer-locator/v1/geocode
Method: GET
Parameters:
address(required) — Address string to geocode
Response:
{
"latitude": 39.7817,
"longitude": -89.6501,
"formatted_address": "Springfield, IL 62701, USA"
}
JavaScript API
Map Initialization
// Included in plugin assets
SumaDealerLocator.init({
mapElement: '#dealer-map',
defaultRadius: 25,
zoomLevel: 10,
markerIcon: '/path/to/custom-marker.png'
});
Events
Dealer selected:
jQuery(document).on('dealer_selected', function(e, dealer) {
console.log('Selected dealer:', dealer);
});
Search completed:
jQuery(document).on('dealer_search_complete', function(e, results) {
console.log('Found dealers:', results.length);
});
Styling
CSS Classes
Main wrapper classes:
.suma-dealer-locator— Overall container.dealer-search— Search form container.dealer-map— Map container.dealer-results— Results list container.dealer-card— Individual dealer card.dealer-info-window— Map popup content
Responsive Breakpoints
- Mobile: < 768px (single column, map below search)
- Tablet: 768px - 1024px (side-by-side layout)
- Desktop: > 1024px (full layout with filters)
Configuration
Google Maps API Key
Location: WordPress admin → Settings → Suma Dealer Locator
Required APIs:
- Maps JavaScript API
- Geocoding API
- Places API (optional, for autocomplete)
MaxMind GeoIP
Setup:
- Download MaxMind GeoLite2 database
- Upload to
wp-content/uploads/geoip/ - Configure path in plugin settings
Database Update: Monthly (automated via wp-cron)
Changelog
Version 3.0.2 (Current)
- Fixed broken Visual Composer blocks after refactoring
- Improved compatibility with latest VC version
Version 3.0.1
- Fixed broken Visual Composer blocks after refactoring
Version 3.0.0
- Added: Gutenberg editor block with sidebar settings
- Converted: Front-end templates to remove Bootstrap CSS dependency
- Improved: Descriptions on default options
- Removed: ACF dependency, integrated Carbon Fields
Version 2.0.6
- Integrated MaxMind IP lookup for auto-loading locations
Version 2.0.5
- Added pin bounce on listing hover
- Added "Get Directions" functionality in map info box
- Added dynamic zoom based on bounding shape of closest 10 locations
Version 2.0.4
- Fixed category filter
- Added "Get Directions" feature
Version 2.0.0
- Added Suma Framework integration
- Reworked for scalability
Performance Considerations
Database Optimization
- Indexes: Add indexes on
dealer_latitudeanddealer_longitudemeta keys - Caching: Geocode results cached as transients (24 hours)
- Pagination: Limit initial results to 20, load more on demand
Asset Loading
- Conditional loading: Only load on pages with shortcode/widget
- Deferred Maps API: Load Google Maps JS asynchronously
- Minified assets: Production CSS/JS minified
Troubleshooting
Map Not Displaying
- Verify Google Maps API key is set
- Check browser console for API errors
- Ensure API key has required APIs enabled
- Verify billing is enabled (Google requires CC on file)
No Results Found
- Check that dealers have latitude/longitude populated
- Verify geocoding is working (test address in Geocoding API directly)
- Increase search radius
- Check category filters are not over-restrictive
GeoIP Not Working
- Verify MaxMind database exists in correct path
- Check database file permissions (readable by PHP)
- Ensure cron job is updating database
- Fallback to manual entry or browser geolocation
Next Steps
- Theme Customizations — Elementor widget integration
- Development Setup — Local testing environment