Skip to main content

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 category
  • state - Filter by state
  • count - Number of dealers to show (default: -1 for 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 category
  • state - Filter by state
  • per_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 views
    • product/clicked - Product link clicks
    • product/added-to-cart - Add to cart actions
    • cart/viewed - Cart page views
    • checkout/viewed - Checkout initiation
    • checkout/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 category
  • tag - Filter by tag
  • product_id - Show downloads for specific product
  • count - 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

[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

  1. Performance Optimization
  2. Security Hardening
  3. WooCommerce/BigCommerce Enhancements
  4. Admin UI Customizations
  5. Image Handling Improvements
  6. 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');

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

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