Voxel Stats Padder
The {CODICTS} Voxel Stats Padder plugin generates realistic artificial visit data and injects it into the Voxel Theme’s statistics system. It populates your analytics dashboards with configurable dummy traffic — useful for demonstrations, client presentations, testing, and giving new directory sites a credible data foundation.
Installation & Activation
Start by downloading the plugin from the Downloads page on your dashboard on the CoDicts website.
After downloading, install and activate the plugin in WordPress by navigating to “Plugins” > “Add New” > “Upload Plugin” and selecting the downloaded zip file. Click “Install Now” and then “Activate”.
Once activated, navigate to “Stats Padder” in the WordPress admin sidebar to configure your settings.
Before you start: Make sure statistics tracking is enabled in Voxel → Settings → Statistics for the post types you want to pad. Only post types with tracking enabled will appear in the Stats Padder settings.
Key Features
| Feature | Description |
|---|---|
| Automated Daily Padding | A daily cron job automatically generates artificial views every day. |
| Per-Post-Type Control | Enable padding independently for each Voxel post type. |
| Voxel Filter Targeting | Use Voxel’s search filters to target specific subsets of posts. |
| Realistic Data | Generates randomized visitor profiles with realistic IPs, browsers, operating systems, devices, countries, and referrers. |
| Daily Traffic Variation | Configurable “Daily Bias” creates natural-looking ups and downs in traffic volume. |
| Backdate Support | Pad data retroactively for up to 100 past days. |
| Custom Referrers | Define weighted referrer domains for realistic traffic sources. |
| Batch Processing | Multi-stage pipeline prevents server timeouts on large datasets. |
| Unlisted Taxonomy Padding | Generate views tied to taxonomy terms without a specific listing. |
| Safe Cleanup | Delete all artificial data with one click — real traffic is never affected. |
How It Works
The plugin creates fake visit records and inserts them into Voxel’s wp_voxel_visits database table. Each record looks like a real visit — with a simulated IP address, browser, operating system, device type, country, referrer, and a randomized timestamp within the target day. Voxel’s built-in analytics then displays these records alongside any real traffic.
All artificial records are flagged internally with a c_artificial marker, so they can always be identified and deleted without affecting real data.
The plugin supports two padding modes:
| Mode | Description |
|---|---|
| Listed Post Padding | Generates views for specific Voxel posts matching your filter criteria. |
| Unlisted Taxonomy Padding | Generates views tied to taxonomy terms (categories, tags, etc.) without a specific listing. Useful for boosting category-level analytics. |
Settings Overview
Navigate to “Stats Padder” in the admin sidebar to access the settings page.
Concurrent Insert Process
| Setting | Default | Description |
|---|---|---|
| Process Records | 1 | Number of records to insert per batch cycle. Higher values insert faster but use more server resources. Increase this if padding is running too slowly; decrease if you experience server timeouts. |
Daily Bias
Daily bias controls traffic volume variation — instead of inserting exactly the same number of views every day, the bias randomly scales the total by a percentage within your configured range.
| Setting | Default | Description |
|---|---|---|
| Min % | 100 | Minimum percentage of views to insert (1–100). |
| Max % | 100 | Maximum percentage of views to insert (1–100). |
Examples:
| Min / Max | Effect |
|---|---|
| 100 / 100 | No variation — full views every day. |
| 70 / 80 | Very consistent — slight daily variation. |
| 40 / 100 | Natural-looking ups and downs in traffic. |
Tip: For the most realistic-looking analytics, use a range like 40–100. This creates the kind of natural variation you’d see in real traffic.
Configuring Post Type Padding
For each Voxel post type that has statistics tracking enabled, you’ll see a configuration section in the settings.
Step 1: Enable the Post Type
Toggle the switch to enable padding for the post type.
Step 2: Add Filter Groups
Each post type supports multiple filter groups. A filter group lets you target a specific subset of posts with independent settings. Click “Add” to create a new filter group.
Step 3: Configure Each Filter Group
| Setting | Description |
|---|---|
| Voxel Filters | Use Voxel’s search filters (categories, keywords, etc.) to target which posts receive padded views. Leave empty to target all posts of this type. |
| Min Padding | Minimum number of views per post per day. |
| Max Padding | Maximum number of views per post per day. The actual number is randomized between min and max. |
| Unique Chance % | Probability (0–100) that each view comes from a unique visitor vs. a returning one. |
| Countries | Restrict generated views to specific countries. Leave empty for a worldwide distribution based on population weights. |
| Custom Referrers | Add weighted referrer domains (see Custom Referrers). |
| Site Weight | Weight percentage for your site’s own URL as a referrer (direct/internal traffic). |
Example setup — a restaurant directory:
| Filter Group | Filters | Min | Max | Purpose |
|---|---|---|---|---|
| Group 1 | Category: “Fine Dining” | 15 | 40 | Premium restaurants get more views |
| Group 2 | Category: “Fast Food” | 5 | 15 | Standard restaurants get moderate views |
| Group 3 | (no filters) | 2 | 8 | All other restaurants get baseline views |
Custom Referrers
Each filter group lets you define weighted referrer domains that appear as traffic sources in the analytics. This creates realistic-looking referral traffic.
Your site’s own URL is always included as a referrer (representing direct or internal traffic), with a configurable weight. You can add additional domains with their own weights.
Example:
| Referrer | Weight | Approximate Share |
|---|---|---|
| Your site (direct) | 30 | ~33% |
| https://google.com | 40 | ~44% |
| https://facebook.com | 20 | ~22% |
The weights are relative — they don’t need to add up to 100. The plugin calculates probabilities proportionally.
Realistic Data Generation
Each artificial visit record is generated with a full visitor profile to look realistic in Voxel’s analytics:
| Data Point | How It’s Generated |
|---|---|
| IP Address | Random IP from residential-like ranges. |
| Operating System | Weighted random: Windows (~38%), macOS (~21%), Android (~17%), Linux (~13%), iOS (~6%), others. |
| Browser | Weighted random: Chrome (~65%), Firefox (~10%), Safari (~10%), Edge (~8%), others. |
| Device Type | Weighted random: Mobile (~60%), Desktop (~40%). |
| Country | Weighted by population/internet usage (250+ countries), or restricted to your selected countries. |
| Referrer | Weighted random from your configured referrer domains. |
| Timestamp | Random time within the target day. |
The plugin also maintains a global visitor pool during each run. When the “Unique Chance” setting allows a returning visitor, the plugin reuses a profile from the pool rather than creating a new one. This simulates realistic returning-visitor patterns.
Running the Padder
Automatic Daily Padding
Once configured, the plugin runs automatically every day via WP-Cron. It generates views for the current day based on your settings. If the cron was missed for any reason (server downtime, etc.), the plugin automatically catches up on all missed days the next time it runs.
Manual Padding & Backdating
On the right side of the settings page, you’ll find the Padding Data panel:
1. Enter the number of past days to backdate in the “Days Ago” field (0–100). Set to 0 to pad only today.
2. Click “Start Padding”. The plugin begins generating and inserting data.
3. A progress bar shows the current status, including which day is being processed and how many records have been inserted.
Note: For large datasets (many posts × many days), the batch processor runs in the background via WP-Cron. You can leave the page — processing continues automatically. Return to the settings page to check progress.
Cancelling a Run
If you need to stop a running batch, click “Cancel Padding”. This stops processing and cleans up temporary data. Records already inserted will remain in the database.
Unlisted Taxonomy Term Padding
The unlisted taxonomy padder generates views that aren’t tied to any specific listing. Instead, they’re associated with taxonomy terms (categories, tags, etc.) for boosting category-level or tag-level analytics.
| Setting | Description |
|---|---|
| Enable Toggle | Turn on/off unlisted taxonomy padding. |
| Taxonomy Selects | Choose specific terms from any public taxonomy. |
| Include All Terms | Automatically include every term for a taxonomy instead of selecting individually. |
| Empty Terms Only | When enabled, only pads terms that currently have zero views. |
| Listing Type Filter | When “Empty Terms Only” is enabled, filter the empty check against specific listing types. |
Deleting Artificial Data
Click “Delete Artificial Data” on the settings page to remove all artificially generated visit records from the database. You will be asked to confirm before deletion proceeds.
This only removes artificial records (flagged with the c_artificial marker). Real visitor traffic is never affected.
Tip: If you’re testing different settings, you can safely delete and re-generate data as many times as needed.
Custom Functions (For Developers)
Developers can extend the padding behavior with two custom PHP function hooks, configured per filter group in the settings.
Custom Target ID Function
Provide a PHP function name to generate a custom c_target_id value for each view record. The function receives the post ID and should return a string (max 16 characters).
// For listed posts
function my_custom_target_id( $post_id ) {
return substr( md5( $post_id . '_custom' ), 0, 16 );
}
// For unlisted taxonomy terms
function my_taxonomy_target_id( $taxonomy_term_groups ) {
// $taxonomy_term_groups = ['category' => ['restaurants', 'cafes'], ...]
return 'tax_' . substr( md5( json_encode( $taxonomy_term_groups ) ), 0, 12 );
}
Custom Multiplier Function
Provide a PHP function name that dynamically multiplies the view count for each post. The function receives the post ID and should return a number.
function my_view_multiplier( $post_id ) {
// Featured posts get 3x views
$is_featured = get_post_meta( $post_id, '_is_featured', true );
return $is_featured ? 3 : 1;
}
Note: Custom functions must be defined in a file that loads before the cron runs (e.g., your theme’s
functions.phpor a mu-plugin). Errors in custom functions are silently caught and logged — the padder continues with default behavior.
ClickHouse Compatibility
If you use the {CODICTS} Voxel ClickHouse Visits plugin for high-performance analytics, the Stats Padder integrates automatically. When the ClickHouse plugin is active, record insertion and deletion are delegated to the ClickHouse handler instead of using direct MySQL queries. No additional configuration is needed.
Troubleshooting
“Voxel Theme Not Detected” Error
Ensure the Voxel Theme is installed and set as the active theme. Go to Appearance → Themes to verify.
No Post Types Showing in Settings
Enable statistics tracking in Voxel → Settings → Statistics for the post types you want to pad. Only tracked post types appear in the Stats Padder settings.
Padding Not Running Automatically
| Cause | Solution |
|---|---|
DISABLE_WP_CRON is set to true | Either set it to false in wp-config.php, or set up a server-side cron job to trigger WP-Cron externally. |
| Cron event not scheduled | Deactivate and reactivate the plugin to re-schedule the daily cron. |
| Batch stuck | Click “Cancel Padding” on the settings page and restart. |
Padding Produces No Data
| Cause | Solution |
|---|---|
| Min/Max set to 0 | Set both Min and Max to values greater than 0. |
| No posts match filters | Check that your Voxel filter criteria match existing published posts. Try removing filters to target all posts. |
| All posts already processed today | The padder skips posts that have already been padded for the current day. Use manual backdate to reprocess past days. |
| Daily Bias too low | Increase the Daily Bias Min percentage. A very low value might result in very few records on some days. |
Batch Process Stuck or Not Progressing
1. Click “Cancel Padding” on the settings page.
2. If that doesn’t resolve it, manually delete the codicts_voxel_stats_padder_batch_processing option from the wp_options table in your database.
3. Click “Start Padding” to restart.
Data Not Showing in Voxel Analytics
Check that the generated records exist in the wp_voxel_visits table. Verify the post_id values match published Voxel posts, and that the timestamps fall within the date range you’re viewing in the analytics dashboard.
Custom Function Not Working
| Cause | Solution |
|---|---|
| Function not loaded | Ensure the function is defined in functions.php or a mu-plugin so it’s available when WP-Cron runs. |
| Function throwing an error | Errors are silently caught. Check the PHP error log for details. |
| Return value too long | Target ID values must be 16 characters or fewer. |
“Delete Artificial Data” Not Removing All Records
If you use the ClickHouse plugin, make sure the ClickHouse handler properly implements the deletion action. For standard MySQL setups, verify the c_artificial column exists in the wp_voxel_visits table — the plugin creates this column automatically on activation.
For further support, visit codicts.com or contact us at support@codicts.com.