Filters reference
Who this is for
This page is for developers who need to change plugin behavior or data using WordPress filters. Most users can accomplish everything through WP Enhanced > Free Download Woo without code.
Core filters
somdn_product_page_args
Modify arguments passed to product page rendering.
Parameters:
$args(array) - Display arguments$product_id(int) - Product ID
Returns: Array of arguments
Usage:
add_filter('somdn_product_page_args', 'modify_display_args', 10, 2);
function modify_display_args($args, $product_id) {
// Modify button text for specific product
if ($product_id == 123) {
$args['button_text'] = 'Get Your Free Copy';
}
return $args;
}
Available Arguments:
button_text- Download button textbutton_classes- CSS classes for buttonlink_classes- CSS classes for linksshow_files- Whether to show file listarchive- Whether displaying on archive page
somdn_product_page_content_woo
Modify WooCommerce hook for download UI placement.
Parameters:
$hook(string) - WooCommerce hook name
Returns: String (hook name)
Default: woocommerce_single_product_summary
Usage:
add_filter('somdn_product_page_content_woo', 'custom_product_page_hook');
function custom_product_page_hook($hook) {
return 'woocommerce_simple_add_to_cart';
}
Use Cases:
- Change download button position
- Integrate with custom themes
- Adjust layout
somdn_get_button_classes
Modify download button CSS classes.
Parameters:
$classes(string) - CSS classes
Returns: String of CSS classes
Usage:
add_filter('somdn_get_button_classes', 'custom_button_classes');
function custom_button_classes($classes) {
return $classes . ' button custom-class';
}
Example: Remove Default Class
add_filter('somdn_get_button_classes', 'remove_default_class');
function remove_default_class($classes) {
return ' button'; // Only 'button' class
}
somdn_get_link_classes
Modify download link CSS classes.
Parameters:
$classes(string) - CSS classes
Returns: String of CSS classes
Usage:
add_filter('somdn_get_link_classes', 'custom_link_classes');
function custom_link_classes($classes) {
return $classes . ' custom-link-class';
}
Download Filters
somdn_download_path
Modify file path before download.
Parameters:
$file_path(string) - Original file path$product_id(int) - Product ID
Returns: String (file path)
Usage:
add_filter('somdn_download_path', 'modify_download_path', 10, 2);
function modify_download_path($file_path, $product_id) {
// Serve from different location
if ($product_id == 123) {
return '/custom/path/to/file.pdf';
}
return $file_path;
}
Use Cases:
- External file hosting
- PDF watermarking
- Dynamic file generation
- CDN integration
somdn_download_filename
Modify downloaded filename.
Parameters:
$filename(string) - Original filename$product_id(int) - Product ID
Returns: String (filename)
Usage:
add_filter('somdn_download_filename', 'custom_filename', 10, 2);
function custom_filename($filename, $product_id) {
$product = wc_get_product($product_id);
return sanitize_file_name($product->get_name()) . '.pdf';
}
somdn_zip_filename
Modify ZIP archive filename.
Parameters:
$filename(string) - Original ZIP filename$product_id(int) - Product ID
Returns: String (filename)
Usage:
add_filter('somdn_zip_filename', 'custom_zip_name', 10, 2);
function custom_zip_name($filename, $product_id) {
return 'product-' . $product_id . '-files.zip';
}
Login & Validation Filters
somdn_is_required_login_check
Override login requirement check.
Parameters:
$required(bool) - Whether login is required$setting(bool) - Login requirement setting$product_id(int) - Product ID
Returns: Boolean
Usage:
add_filter('somdn_is_required_login_check', 'custom_login_check', 10, 3);
function custom_login_check($required, $setting, $product_id) {
// Allow downloads without login for specific category
if (has_term('free', 'product_cat', $product_id)) {
return false; // No login required
}
return $required;
}
Use Cases:
- Category-based login rules
- User role exceptions
- Time-based access
somdn_is_login_check_valid
Override login validation on download page.
Parameters:
$valid(bool) - Whether login check is valid$require_login(bool) - Login requirement setting$product_id(int) - Product ID$product(WC_Product) - Product object$args(array) - Display arguments
Returns: Boolean
Usage:
add_filter('somdn_is_login_check_valid', 'custom_login_valid', 10, 5);
function custom_login_valid($valid, $require_login, $product_id, $product, $args) {
// Allow guests for specific category
if (has_term('free', 'product_cat', $product_id)) {
return true;
}
return $valid;
}
Download Limits Filters (Pro)
somdn_user_limits_excluded
Check if user is excluded from download limits.
Parameters:
$excluded(bool) - Whether user is excluded$user_id(int) - User ID
Returns: Boolean
Usage:
add_filter('somdn_user_limits_excluded', 'exclude_vip_users', 10, 2);
function exclude_vip_users($excluded, $user_id) {
$user = get_user_by('id', $user_id);
// Exclude administrators and VIP role
if (in_array('administrator', $user->roles) || in_array('vip', $user->roles)) {
return true;
}
return $excluded;
}
Use Cases:
- Exclude specific users
- Exclude user roles
- Exclude by membership
- Temporary exclusions
somdn_get_user_custom_limits
Modify user's download limits.
Parameters:
$limits(array) - Limit configuration$user_id(int) - User ID$product_id(int) - Product ID
Returns: Array of limit configuration
Limit Array Structure:
array(
'type' => 'user', // 'user' or 'ip'
'amount' => 5, // Number of downloads
'freq' => 'Day', // 'Day', 'Week', 'Month', 'Year'
'products' => array(), // Product IDs (empty = all)
'error' => 'Message', // Error message
'login_req' => true // Require login
)
Usage:
add_filter('somdn_get_user_custom_limits', 'custom_user_limits', 10, 3);
function custom_user_limits($limits, $user_id, $product_id) {
// Double limits for premium members
if (user_has_premium_membership($user_id)) {
$limits['amount'] = $limits['amount'] * 2;
}
return $limits;
}
Use Cases:
- Membership-based limits
- Role-based limits
- Product-specific limits
- Time-based limits
somdn_check_product_in_limit
Control which products are subject to limits.
Parameters:
$in_limit(bool) - Whether product is limited$product_id(int) - Product ID$limits(array) - Limit configuration
Returns: Boolean
Usage:
add_filter('somdn_check_product_in_limit', 'exclude_products', 10, 3);
function exclude_products($in_limit, $product_id, $limits) {
// Exclude specific products from limits
$excluded = array(100, 200, 300);
if (in_array($product_id, $excluded)) {
return false;
}
return $in_limit;
}
somdn_are_downloads_tracked
Override whether tracking is enabled.
Parameters:
$tracked(bool) - Whether tracking is enabled
Returns: Boolean
Usage:
add_filter('somdn_are_downloads_tracked', 'conditional_tracking');
function conditional_tracking($tracked) {
// Don't track admin downloads
if (current_user_can('administrator')) {
return false;
}
return $tracked;
}
Email Capture Filters (Pro)
capture_emails_active
Override whether email capture is active.
Parameters:
$active(bool) - Whether email capture is active
Returns: Boolean
Usage:
add_filter('capture_emails_active', 'conditional_email_capture');
function conditional_email_capture($active) {
// Disable for specific products
if (is_product() && get_the_ID() == 123) {
return false;
}
return $active;
}
somdn_capture_email_invalid
Validate email addresses.
Parameters:
$invalid(bool) - Whether email is invalid$email(string) - Email address
Returns: Boolean
Usage:
add_filter('somdn_capture_email_invalid', 'block_disposable_emails', 10, 2);
function block_disposable_emails($invalid, $email) {
$blocked_domains = array('tempmail.com', 'throwaway.email');
$domain = substr(strrchr($email, "@"), 1);
if (in_array($domain, $blocked_domains)) {
return true; // Mark as invalid
}
return $invalid;
}
somdn_capture_email_empty
Customize "email required" error message.
Parameters:
$message(string) - Error message
Returns: String
Usage:
add_filter('somdn_capture_email_empty', 'custom_email_error');
function custom_email_error($message) {
return 'Please provide your email address to continue.';
}
somdn_capture_email_label
Customize email field label.
Parameters:
$label(string) - Field label
Returns: String
Usage:
add_filter('somdn_capture_email_label', 'custom_email_label');
function custom_email_label($label) {
return 'Enter your email to download:';
}
somdn_capture_fname_label
Customize first name field label.
Parameters:
$label(string) - Field label
Returns: String
Usage:
add_filter('somdn_capture_fname_label', 'custom_fname_label');
function custom_fname_label($label) {
return 'Your first name:';
}
Statistics Filters (Pro)
somdn_get_downloads_data_args
Modify statistics export query arguments.
Parameters:
$args(array) - WP_Query arguments$original_args(array) - Original arguments
Returns: Array of WP_Query arguments
Usage:
add_filter('somdn_get_downloads_data_args', 'custom_export_query', 10, 2);
function custom_export_query($args, $original_args) {
// Export only guest downloads
$args['meta_query'] = array(
array(
'key' => 'somdn_user_id',
'value' => '0',
'compare' => '='
)
);
return $args;
}
Example: Export Only Subscribers
add_filter('somdn_get_downloads_data_args', 'export_subscribers_only');
function export_subscribers_only($args) {
$args['meta_query'] = array(
array(
'key' => 'somdn_user_subbed',
'value' => '',
'compare' => '!='
)
);
return $args;
}
somdn_stats_get_headers_all
Add custom columns to statistics export.
Parameters:
$headers(array) - Export column headers
Returns: Array of headers
Header Structure:
array(
'header_id' => array(
'type' => 'custom', // 'custom' or 'default'
'title' => 'Column Name',
'content' => 'string' // Data type
)
)
Usage:
add_filter('somdn_stats_get_headers_all', 'add_custom_columns');
function add_custom_columns($headers) {
$headers['user_role'] = array(
'type' => 'custom',
'title' => 'User Role',
'content' => 'string'
);
return $headers;
}
somdn_stats_get_custom_field_{header_id}
Populate custom export column data.
Parameters:
$value(mixed) - Column value$download_id(int) - Download log post ID
Returns: Mixed (column value)
Usage:
add_filter('somdn_stats_get_custom_field_user_role', 'get_user_role_data', 10, 2);
function get_user_role_data($value, $download_id) {
$user_id = get_post_meta($download_id, 'somdn_user_id', true);
if ($user_id) {
$user = get_user_by('id', $user_id);
return $user ? implode(', ', $user->roles) : 'Guest';
}
return 'Guest';
}
somdn_max_downloads_to_report_xlsx
Change maximum export record count.
Parameters:
$max(int) - Maximum records
Returns: Integer
Default: 15000
Usage:
add_filter('somdn_max_downloads_to_report_xlsx', 'increase_export_limit');
function increase_export_limit($max) {
return 20000; // Increase to 20,000
}
Warning: Higher limits require more memory and execution time.
MailChimp Filters (Pro)
somdn_newsletter_sub_tags
Modify MailChimp subscription tags.
Parameters:
$tags(array) - Tag array$product_id(int) - Product ID$variation_id(int) - Variation ID
Returns: Array of tags
Usage:
add_filter('somdn_newsletter_sub_tags', 'custom_mailchimp_tags', 10, 3);
function custom_mailchimp_tags($tags, $product_id, $variation_id) {
// Add user role tag
$user = wp_get_current_user();
if ($user->ID) {
$tags[] = 'role-' . $user->roles[0];
}
// Add custom tag
$tags[] = 'source-website';
return $tags;
}
somdn_mailchimp_subscriber_data
Modify subscriber data before sending to MailChimp.
Parameters:
$data(array) - Subscriber data$email(string) - Email address
Returns: Array of subscriber data
Usage:
add_filter('somdn_mailchimp_subscriber_data', 'add_merge_fields', 10, 2);
function add_merge_fields($data, $email) {
// Add custom merge fields
$data['merge_fields']['WEBSITE'] = home_url();
$data['merge_fields']['SOURCE'] = 'Free Download';
return $data;
}
somdn_mailchimp_notify_on_error
Enable error notifications.
Parameters:
$notify(bool) - Whether to notify on error
Returns: Boolean
Usage:
add_filter('somdn_mailchimp_notify_on_error', '__return_true');
somdn_mailchimp_error_email
Set error notification email address.
Parameters:
$email(string) - Email address
Returns: String
Usage:
add_filter('somdn_mailchimp_error_email', 'custom_error_email');
function custom_error_email($email) {
return '[email protected]';
}
PDF Watermarking Filters (Pro)
somdn_enable_pdf_watermark
Control watermarking per download.
Parameters:
$enable(bool) - Whether to watermark$product_id(int) - Product ID$user_id(int) - User ID
Returns: Boolean
Usage:
add_filter('somdn_enable_pdf_watermark', 'conditional_watermark', 10, 3);
function conditional_watermark($enable, $product_id, $user_id) {
// Don't watermark for VIP users
$user = get_user_by('id', $user_id);
if ($user && in_array('vip', $user->roles)) {
return false;
}
return $enable;
}
somdn_pdf_watermark_text
Modify watermark text.
Parameters:
$text(string) - Watermark text$product_id(int) - Product ID
Returns: String
Usage:
add_filter('somdn_pdf_watermark_text', 'custom_watermark_text', 10, 2);
function custom_watermark_text($text, $product_id) {
if ($product_id == 123) {
return 'Premium Content - Licensed to {user_name}';
}
return $text;
}
somdn_pdf_watermark_style
Customize watermark appearance.
Parameters:
$style(array) - Style configuration$product_id(int) - Product ID
Returns: Array of style settings
Style Array:
array(
'font_size' => 12,
'color' => array(0, 0, 0), // RGB
'opacity' => 50,
'rotation' => 0,
'position' => 'bottom-center'
)
Usage:
add_filter('somdn_pdf_watermark_style', 'custom_watermark_style', 10, 2);
function custom_watermark_style($style, $product_id) {
$style['font_size'] = 16;
$style['color'] = array(255, 0, 0); // Red
$style['opacity'] = 75;
$style['rotation'] = 45;
return $style;
}
somdn_pdf_watermark_placeholders
Add custom watermark placeholders.
Parameters:
$placeholders(array) - Placeholder array$user_id(int) - User ID$product_id(int) - Product ID
Returns: Array of placeholders
Usage:
add_filter('somdn_pdf_watermark_placeholders', 'add_custom_placeholders', 10, 3);
function add_custom_placeholders($placeholders, $user_id, $product_id) {
$placeholders['{company}'] = get_user_meta($user_id, 'company', true);
$placeholders['{license}'] = get_post_meta($product_id, 'license_key', true);
return $placeholders;
}
Account History Filters (Pro)
somdn_account_tab_title
Change My Account tab title.
Parameters:
$title(string) - Tab title
Returns: String
Usage:
add_filter('somdn_account_tab_title', 'custom_tab_title');
function custom_tab_title($title) {
return 'Download History';
}
somdn_history_per_page
Change pagination count.
Parameters:
$per_page(int) - Items per page
Returns: Integer
Usage:
add_filter('somdn_history_per_page', 'custom_per_page');
function custom_per_page($per_page) {
return 20;
}
somdn_allow_redownload
Control re-download permission.
Parameters:
$allow(bool) - Whether to allow$download_id(int) - Download log post ID
Returns: Boolean
Usage:
add_filter('somdn_allow_redownload', 'time_limit_redownload', 10, 2);
function time_limit_redownload($allow, $download_id) {
// Only allow re-download within 30 days
$download_date = get_post_time('U', false, $download_id);
$days_ago = (time() - $download_date) / DAY_IN_SECONDS;
return $days_ago <= 30;
}
somdn_history_columns
Modify history table columns.
Parameters:
$columns(array) - Column array
Returns: Array of columns
Usage:
add_filter('somdn_history_columns', 'custom_history_columns');
function custom_history_columns($columns) {
// Add custom column
$columns['custom'] = 'Custom Column';
// Remove files column
unset($columns['files']);
return $columns;
}
Email Download Link Filters
somdn_expire_temp_download_email_hours
Set email download link expiration time.
Parameters:
$hours(int) - Hours until expiration
Returns: Integer
Default: 24 hours
Usage:
add_filter('somdn_expire_temp_download_email_hours', 'custom_expire_hours');
function custom_expire_hours($hours) {
return 480; // 20 days
}
somdn_delete_temp_download_email_days
Set email download link deletion time.
Parameters:
$days(int) - Days until deletion
Returns: Integer
Default: 30 days
Usage:
add_filter('somdn_delete_temp_download_email_days', 'custom_delete_days');
function custom_delete_days($days) {
return 40; // 40 days
}
Best Practices
Return Values
Always return a value:
add_filter('somdn_product_page_args', 'my_filter', 10, 2);
function my_filter($args, $product_id) {
// Modify $args
return $args; // MUST return
}
Data Validation
Validate and sanitize:
add_filter('somdn_get_user_custom_limits', 'my_limits', 10, 3);
function my_limits($limits, $user_id, $product_id) {
// Validate
$limits['amount'] = absint($limits['amount']);
$limits['freq'] = sanitize_text_field($limits['freq']);
return $limits;
}
Performance
Keep filters fast:
- Avoid database queries when possible
- Use caching
- Return early when possible
Compatibility
Check before modifying:
add_filter('somdn_product_page_args', 'my_filter', 10, 2);
function my_filter($args, $product_id) {
// Check if key exists
if (isset($args['button_text'])) {
$args['button_text'] = 'Custom Text';
}
return $args;
}
What's Next
- Actions reference - Action hooks to run custom code
- Templates reference - Override download templates