Custom Plugins
Suma-branded custom plugins for dealer locator, analytics tracking, reviews, downloads, FAQs, and WordPress core patches.
Overview
StealthCam uses six custom Suma plugins developed by Rhino Group to extend WordPress functionality with specialized features for e-commerce, content management, and system optimization.
Suma Dealer Locator v3.0.2
Location: wp-content/plugins/suma-dealer-locator/
Version: 3.0.2
Author: Rhino Group
Purpose
Provide customers with an interactive store finder to locate StealthCam dealers by address, zip code, or geolocation with Google Maps integration.
Features
- Dealer Custom Post Type - Manage dealers in WordPress admin
- Google Maps Integration - Visual location display with markers
- GeoIP Detection - Automatically detect user's location
- Radius Search - Find dealers within X miles
- Category Filtering - Filter by dealer type (retailer, pro shop, etc.)
- Dealer Profiles - Contact info, hours, website, custom fields
- Elementor Widget - Native Elementor page builder integration
- Visual Composer Support - Legacy VC compatibility
- Shortcodes - Flexible embedding options
- REST API - Custom endpoints for dealer data
- Import/Export - Bulk dealer management
Directory Structure
suma-dealer-locator/
├── suma-dealer-locator.php # Plugin header (v3.0.2)
├── admin/
│ ├── class-admin.php # Admin UI and settings
│ ├── class-import.php # CSV import functionality
│ └── views/
│ ├── settings.php # Settings page
│ └── import.php # Import interface
├── frontend/
│ ├── class-frontend.php # Public-facing functionality
│ ├── class-shortcodes.php # Shortcode handlers
│ └── class-ajax.php # AJAX endpoint handlers
├── includes/
│ ├── class-suma-dealer-locator.php # Core plugin class
│ ├── class-post-type.php # Dealer CPT registration
│ ├── class-custom-fields.php # Carbon Fields integration
│ ├── class-custom-routes.php # REST API routes
│ ├── class-utils.php # Helper functions
│ ├── class-geoip.php # GeoIP detection
│ └── class-elementor-widget.php # Elementor integration
├── templates/ # Frontend templates
│ ├── locator-search.php # Search form
│ ├── locator-map.php # Google Maps display
│ ├── locator-results.php # Results list
│ └── dealer-single.php # Single dealer profile
├── assets/
│ ├── css/
│ │ └── suma-dealer-locator.css
│ ├── js/
│ │ ├── admin.js # Admin scripts
│ │ ├── frontend.js # Public scripts
│ │ └── google-maps.js # Maps integration
│ └── images/
└── vendor/ # Composer dependencies
└── carbon-fields/ # Custom fields library
Custom Post Type: Dealer
Post Type: suma_dealer
Supports: Title, editor, thumbnail, custom-fields
Hierarchical: No
Public: Yes
Has Archive: Yes (/dealers/)
Custom Fields (Carbon Fields)
Container::make('post_meta', 'Dealer Information')
->where('post_type', '=', 'suma_dealer')
->add_fields([
// Contact
Field::make('text', 'dealer_phone', 'Phone'),
Field::make('text', 'dealer_email', 'Email'),
Field::make('text', 'dealer_website', 'Website URL'),
Field::make('text', 'dealer_fax', 'Fax'),
// Address
Field::make('text', 'dealer_address', 'Street Address'),
Field::make('text', 'dealer_city', 'City'),
Field::make('text', 'dealer_state', 'State/Province'),
Field::make('text', 'dealer_zip', 'Zip/Postal Code'),
Field::make('text', 'dealer_country', 'Country'),
// Location
Field::make('text', 'dealer_latitude', 'Latitude')
->set_attribute('type', 'number')
->set_attribute('step', 'any'),
Field::make('text', 'dealer_longitude', 'Longitude')
->set_attribute('type', 'number')
->set_attribute('step', 'any'),
// Business Details
Field::make('textarea', 'dealer_hours', 'Business Hours'),
Field::make('textarea', 'dealer_notes', 'Additional Notes'),
// Categories
Field::make('multiselect', 'dealer_categories', 'Dealer Categories')
->set_options([
'retail' => 'Retail Store',
'pro_shop' => 'Pro Shop',
'online' => 'Online Retailer',
'distributor' => 'Distributor'
])
]);
Shortcodes
Main Dealer Locator
[suma_dealer_locator]
Display full dealer locator interface with search, map, and results.
Attributes:
map_height- Height of map container (default:500px)default_radius- Default search radius in miles (default:50)zoom_level- Google Maps zoom level (default:10)show_filters- Show category filters (default:true)results_per_page- Dealers per results page (default:10)
Example:
[suma_dealer_locator map_height="600px" default_radius="25" show_filters="true"]
Dealer List
[suma_dealer_list]
Display list of dealers without map.
Attributes:
category- Filter by dealer categorystate- Filter by statecount- Number of dealers to show (default:-1for all)orderby- Sort by field (default:title)order- ASC or DESC (default:ASC)
Example:
[suma_dealer_list category="retail" state="TX" count="20"]
Single Dealer
[suma_dealer id="123"]
Display single dealer profile.
REST API Endpoints
Base URL: /wp-json/suma-dealer-locator/v1/
GET /dealers
List all dealers with optional filtering.
Query Parameters:
category- Filter by categorystate- Filter by stateper_page- Results per page (default: 10)page- Page number
Response:
{
"dealers": [
{
"id": 123,
"title": "Outdoor Outfitters",
"address": "123 Main St, Austin, TX 78701",
"phone": "(512) 555-1234",
"email": "[email protected]",
"website": "https://outdooroutfitters.com",
"latitude": 30.2672,
"longitude": -97.7431,
"categories": ["retail", "pro_shop"],
"distance": null
}
],
"total": 150,
"pages": 15
}
GET /dealers/:id
Single dealer details.
POST /dealers/search
Search dealers by location.
Request Body:
{
"address": "Austin, TX",
"radius": 50,
"category": "retail"
}
Or with coordinates:
{
"latitude": 30.2672,
"longitude": -97.7431,
"radius": 50,
"category": "retail"
}
Response:
{
"dealers": [
{
"id": 123,
"title": "Outdoor Outfitters",
"distance": 2.3,
// ... other fields
}
],
"search_location": {
"latitude": 30.2672,
"longitude": -97.7431,
"address": "Austin, TX"
}
}
GET /dealers/geoip
Get user's approximate location via GeoIP.
Response:
{
"latitude": 30.2672,
"longitude": -97.7431,
"city": "Austin",
"state": "TX",
"country": "US"
}
Elementor Widget
Widget Name: Dealer Locator
Category: Suma Widgets
Settings:
- Map height
- Default radius
- Zoom level
- Show/hide filters
- Custom styling options
Google Maps Configuration
API Key: Set via Settings → Dealer Locator or wp-config.php:
define('SUMA_DEALER_LOCATOR_GOOGLE_API_KEY', 'your-api-key-here');
Required APIs:
- Maps JavaScript API
- Geocoding API
- Places API (optional, for autocomplete)
Template Overrides
Theme can override templates by creating:
wp-content/themes/suma-elementor/suma-dealer-locator/
├── locator-search.php
├── locator-map.php
├── locator-results.php
└── dealer-single.php
Suma Analytics v1.4.1
Location: wp-content/plugins/suma-analytics/
Version: 1.4.1
Author: Rhino Group
Purpose
Track e-commerce events for BigCommerce products and send structured data to Google Analytics 4 (GA4) and Klaviyo for marketing attribution and analytics.
Features
- GA4 Integration - Google Analytics 4 event tracking
- Klaviyo Integration - Marketing event tracking
- BigCommerce Support - Product data from BC API
- WooCommerce Support - Alternative WC integration
- Event Types:
product/viewed- Product page viewsproduct/clicked- Product link clicksproduct/added-to-cart- Add to cart actionscart/viewed- Cart page viewscheckout/viewed- Checkout initiationcheckout/complete- Order completion
- Data Layer - Structured event data
- Custom Dimensions - Product attributes, user segments
- Consent Management - GDPR/CCPA compliance
Event Tracking
Product Viewed
Fired on single product pages.
dataLayer.push({
'event': 'product_viewed',
'ecommerce': {
'items': [{
'item_id': '123',
'item_name': 'Trail Camera Pro',
'item_brand': 'StealthCam',
'item_category': 'Trail Cameras',
'item_variant': 'Black',
'price': 199.99,
'currency': 'USD'
}]
}
});
// Also tracked in Klaviyo
klaviyo.push(['track', 'Viewed Product', {
'ProductID': '123',
'Name': 'Trail Camera Pro',
'Brand': 'StealthCam',
'Price': 199.99,
'URL': 'https://stealthcam.com/products/trail-camera-pro',
'ImageURL': 'https://...'
}]);
Product Added to Cart
Fired when "Add to Cart" button is clicked.
dataLayer.push({
'event': 'add_to_cart',
'ecommerce': {
'items': [{
'item_id': '123',
'item_name': 'Trail Camera Pro',
'quantity': 1,
'price': 199.99
}]
}
});
klaviyo.push(['track', 'Added to Cart', { /* ... */ }]);
Checkout Completed
Fired on order confirmation page.
dataLayer.push({
'event': 'purchase',
'ecommerce': {
'transaction_id': 'ORD-12345',
'value': 199.99,
'tax': 15.00,
'shipping': 10.00,
'currency': 'USD',
'items': [{ /* ... */ }]
}
});
Configuration
Settings Location: Settings → Suma Analytics
- GA4 Measurement ID - Google Analytics 4 property ID
- Klaviyo Public API Key - Klaviyo account key
- BigCommerce Store Hash - BC API credentials
- Tracking Scope - Pages to track events
- Debug Mode - Console logging for testing
Filters & Hooks
// Modify tracked product data
add_filter('suma_analytics_product_data', function($data, $product) {
$data['custom_field'] = get_post_meta($product->ID, 'custom_field', true);
return $data;
}, 10, 2);
// Track custom events
add_action('suma_analytics_custom_event', function($event_name, $event_data) {
// Send to additional analytics platforms
}, 10, 2);
Suma BazaarVoice Integrator v1.1.4
Location: wp-content/plugins/suma-bazaarvoice-integrator/
Version: 1.1.4
Author: Rhino Group
Purpose
Integrate BazaarVoice product reviews and ratings system with BigCommerce products. Generates product feed XML for BazaarVoice ingestion and displays review widgets on product pages.
Features
- Product Feed Generation - Automated XML feed for BazaarVoice
- Review Display Widgets - BV review components
- Ratings & Reviews - Star ratings and customer reviews
- Questions & Answers - Product Q&A module
- Syndication - Cross-site review sharing
- SEO Benefits - Schema.org markup for rich snippets
- Automated Updates - Cron-based feed regeneration
- Variant Support - Reviews for product variants
- UPC/EAN Handling - Product identifier mapping
Product Feed XML
Feed URL: /wp-content/uploads/bazaarvoice/product-feed.xml
Cron Schedule: Daily at 2:00 AM
Feed Structure:
<?xml version="1.0" encoding="UTF-8"?>
<Feed xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/14.7">
<Products>
<Product>
<ExternalId>123</ExternalId>
<Name><![CDATA[Trail Camera Pro]]></Name>
<Description><![CDATA[Professional trail camera...]]></Description>
<Brand><![CDATA[StealthCam]]></Brand>
<CategoryPath><![CDATA[Trail Cameras > HD Cameras]]></CategoryPath>
<ProductPageUrl><![CDATA[https://stealthcam.com/products/trail-camera-pro]]></ProductPageUrl>
<ImageUrl><![CDATA[https://cdn.stealthcam.com/image.jpg]]></ImageUrl>
<ManufacturerPartNumbers>
<ManufacturerPartNumber>STC-123</ManufacturerPartNumber>
</ManufacturerPartNumbers>
<UPCs>
<UPC>012345678901</UPC>
</UPCs>
</Product>
</Products>
</Feed>
BazaarVoice Widgets
Reviews Widget
Display product reviews with star ratings, review count, and review list.
<div id="BVRRContainer" data-bv-show="reviews" data-bv-product-id="123"></div>
Ratings Summary
Display star rating and review count.
<div id="BVRRSummaryContainer" data-bv-show="rating_summary" data-bv-product-id="123"></div>
Questions Widget
Display product questions and answers.
<div id="BVQAContainer" data-bv-show="questions" data-bv-product-id="123"></div>
Configuration
Settings Location: Settings → BazaarVoice
- BV Client Name - BazaarVoice account identifier
- BV Deployment Zone - Production or staging environment
- BV Site ID - Site identifier
- Feed Schedule - Cron update frequency
- Product ID Type - BC product ID or SKU
- Include Variants - Generate feed entries for variants
Manual Feed Generation
// Trigger feed generation manually
do_action('suma_bazaarvoice_generate_feed');
// Or via WP-CLI
wp suma-bazaarvoice generate-feed
Suma Downloads v2.1.0
Location: wp-content/plugins/suma-downloads/
Version: 2.1.0
Author: Rhino Group
Purpose
Managed download system for product manuals, spec sheets, software updates, and other downloadable resources with access control and download tracking.
Features
- Download Custom Post Type - Manage downloads in WordPress admin
- File Management - Upload and organize files
- Access Control - Public, registered users, or specific roles
- Download Tracking - Track download counts and user activity
- Categories & Tags - Organize downloads
- Search Integration - Algolia-powered search
- Version Management - Track file versions
- Related Products - Associate downloads with BC products
- Shortcodes - Embed download lists
- REST API - Programmatic access
Custom Post Type: Download
Post Type: suma_download
Supports: Title, editor, thumbnail, custom-fields
Taxonomies: download_category, download_tag
Custom Fields
- File Upload - Primary download file
- File Version - Version number
- File Size - Automatically calculated
- File Type - PDF, ZIP, EXE, etc.
- Related Products - Associated BC product IDs
- Access Level - Public, registered, or role-specific
- Download Count - Tracked automatically
Shortcodes
Download List
[suma_downloads category="manuals" count="10"]
Attributes:
category- Filter by categorytag- Filter by tagproduct_id- Show downloads for specific productcount- Number to display
Single Download Button
[suma_download_button id="123" text="Download Manual"]
Download Tracking
// Get download count
$count = get_post_meta($download_id, 'suma_download_count', true);
// Track download event
do_action('suma_download_tracked', $download_id, $user_id);
Suma FAQs v1.0.2
Location: wp-content/plugins/suma-faqs/
Version: 1.0.2
Author: Rhino Group
Purpose
Searchable FAQ system with categories, Algolia instant search integration, and accordion display widgets.
Features
- FAQ Custom Post Type - Manage FAQs in admin
- Categories - Organize by topic
- Algolia Search - Instant FAQ search
- Accordion Display - Collapsible Q&A
- Shortcodes - Embed FAQ sections
- Schema Markup - SEO-optimized markup
- Related Products - Link FAQs to products
- Analytics Integration - Track FAQ views
Custom Post Type: FAQ
Post Type: suma_faq
Taxonomy: faq_category
Shortcodes
FAQ List
[suma_faq_list category="cameras" style="accordion"]
Styles: accordion, list, grid
FAQ Search
[suma_faq_search placeholder="Search FAQs..."]
Suma Patches v1.5.19
Location: wp-content/plugins/suma-patches/
Version: 1.5.19
Author: Rhino Group
Purpose
WordPress core patches and customizations standardized across all Rhino Group sites. Centralizes modifications that would otherwise be repeated per-site.
Feature Categories
- Performance Optimization
- Security Hardening
- WooCommerce/BigCommerce Enhancements
- Admin UI Customizations
- Image Handling Improvements
- Search Integration Patches
Performance Patches
Disable Emojis
Removes WordPress emoji scripts and styles.
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
Disable Embeds
Removes oEmbed functionality.
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_oembed_add_host_js');
jQuery to Footer
Moves jQuery to footer for faster page load.
add_action('wp_enqueue_scripts', function() {
wp_scripts()->add_data('jquery', 'group', 1);
wp_scripts()->add_data('jquery-core', 'group', 1);
wp_scripts()->add_data('jquery-migrate', 'group', 1);
});
Security Patches
Hide WordPress Version
Remove version meta tag.
remove_action('wp_head', 'wp_generator');
Disable XML-RPC
Block XML-RPC attacks.
add_filter('xmlrpc_enabled', '__return_false');
Remove WP-JSON User Endpoint
Hide user enumeration.
add_filter('rest_endpoints', function($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
return $endpoints;
});
BigCommerce Patches
Bypass Pricing Nonce
Allow price updates without nonce validation for caching.
add_filter('bigcommerce/pricing/skip_nonce_check', '__return_true');
Custom Product Query Args
Modify BC product queries.
add_filter('bigcommerce/query/product_args', function($args) {
// Custom query modifications
return $args;
});
Admin UI Customizations
Custom Login Logo
Replace WordPress logo on login page.
add_action('login_head', function() {
echo '<style>
.login h1 a {
background-image: url(' . get_stylesheet_directory_uri() . '/assets/images/logo.svg);
width: 200px;
height: 80px;
background-size: contain;
}
</style>';
});
Remove Admin Bar Items
Clean up admin bar.
add_action('admin_bar_menu', function($wp_admin_bar) {
$wp_admin_bar->remove_node('wp-logo');
$wp_admin_bar->remove_node('comments');
}, 999);
Image Handling
Add WebP Support
Enable WebP uploads.
add_filter('mime_types', function($mimes) {
$mimes['webp'] = 'image/webp';
return $mimes;
});
Custom Image Sizes
Add theme-specific image sizes.
add_image_size('product-card', 400, 400, true);
add_image_size('product-hero', 1200, 600, true);
Search Integration
Algolia Index Filters
Customize indexed content.
add_filter('algolia_post_shared_attributes', function($attributes, $post) {
// Add custom attributes to Algolia index
return $attributes;
}, 10, 2);
Plugin Dependencies
Suma Dealer Locator
- Carbon Fields (included via Composer)
- Google Maps API key
Suma Analytics
- GA4 Measurement ID
- Klaviyo Public API Key (optional)
Suma BazaarVoice Integrator
- BazaarVoice account credentials
- Cron execution
Suma Downloads
- File upload directory write permissions
Suma FAQs
- WP Search with Algolia (optional for search)
Suma Patches
- No external dependencies