Actions and Filters
WooCommerce Product Table comes with a number of filters which allow you to customize the plugin's behavior.
Please note that this code is aimed at developers and if you don't know how to use it then you should ask your developer.
Filters
Language filters
There are various filters provided for manipulating text strings and messages used in the plugin. Please refer to this article for filters to override the text strings.
wc_product_table_args
This filter allows you to change the product table arguments that are defined either on the settings backend or through the shortcode attributes.
add_filter( 'wc_product_table_args', function( $args ) {
// Add your specific condition here.
if ( is_product_category( 'books' ) ) {
$args['columns'] = 'image,name,price,add-to-cart';
}
return $args;
} );
wc_product_table_custom_class
This filter allows you to add extra CSS classes to the product table's <table>
element. Any classes will be added in addition the standard classes used by the plugin. It should return a string. For example:
add_filter( 'wc_product_table_custom_class', function( $class, $product_table ) {
return 'my-class another-class';
}, 10, 2 );
wc_product_table_row_class
This filter allows you to modify the row classes used for each row (<tr>
) in the table. It expects an array of classes to be returned and takes two parameters - the classes array and the$product
object for the current row.
add_filter( 'wc_product_table_row_class', function( $classes, $product ) {
$classes[] = 'trade';
return $classes;
}, 10, 2 );
wc_product_table_row_attributes
Filters the row attributes used for each product row in the table. Expects an array of attributes to be returned as key => value
pairs. Takes two parameters - the classes array and the $product
object.
add_filter( 'wc_product_table_row_attributes', function( $atts, $product ) {
$atts['data-foo'] = 'bar';
return $atts;
}, 10, 2 );
wc_product_table_header_class_<column>
This filter allows you to add additional CSS classes to the column headings (i.e. the <th>
elements) in the product table. The filter name is dynamic - <column>
should be replaced with the column name you wish to modify. It should return an array or classes, which are later joined together to form the CSS class.
wc_product_table_column_class_<column>
This filter allows you to add additional CSS classes to all column cells (i.e. the <td>
elements) in the product table. The filter name is dynamic - <column>
should be replaced with the column name you wish to modify. It should return an array or classes, which are later joined together to form the CSS class. For example:
add_filter( 'wc_product_table_column_class_price', function( $classes ) {
$classes[] = 'on-sale';
return $classes;
} );
wc_product_table_column_heading_<column>
Filters the column heading for the specified column for all product tables on your site. If a custom heading is specified within the shortcode itself (in the columns
option), then it will take precedence over the value returned from this filter.
// Override the 'name' column heading
add_filter( 'wc_product_table_column_heading_name', function( $heading ) {
return 'Item Name';
} );
wc_product_table_column_priority_<column>
Filters the column priority for all product tables. If a priority is specified within the shortcode itself (using the priorities
option), then it will take precedence over the value returned from this filter.
add_filter( 'wc_product_table_column_priority_date', function( $priority ) {
return 10; // a high number means low priority
} );
wc_product_table_column_width_<column>
Filter which allows you to override a column width for all product tables on your site. If a width is specified within the shortcode itself (using the widths
option), then it will take priority over the value returned from this filter.
add_filter( 'wc_product_table_column_width_sku', function( $width ) {
return '100px';
} );
wc_product_table_column_searchable_<column>
Set whether or not a column is "searchable" in the product table. If a column is searchable, it means that the column will be used when the user types something into the search box above the table.
By default, the plugin includes all columns for searching, except for the image
column (unless you're using the lazy load option, in which case only the title and content columns are searchable). To override this behavior when you're not using lazy load, use this filter with the appropriate column name added to the filter.
E.g. to exclude the price column from the table search:
add_filter( 'wc_product_table_column_searchable_price', '__return_false' );
If you want to disable searching for custom fields, attributes or taxonomies, use the column name without the cf:
, att:
or tax:
prefix:
add_filter( 'wc_product_table_column_searchable_my_custom_field', '__return_false' );
wc_product_table_column_sortable_<column>
Set whether or not a column is "sortable" in the product table. If a column is sortable, the table can be re-ordered by that column using the up/down arrows that appear in the column heading.
If you're using lazy load, the sorting is restricted to certain columns only. If you're not using lazy load, then sorting is enabled for all columns except image
, buy
and button
.
E.g. to prevent the table being sorted by price:
add_filter( 'wc_product_table_column_sortable_price', '__return_false' );
See the note above about using this filter for custom field, attribute or taxonomy columns.
wc_product_table_minimum_search_term_length
Set the minimum search term length allowed in the search box. The default is 2 characters (e.g. st
would perform a search but s
would not).
Note: due to limitations of the underlying DataTables library, this filter only applies to lazy loaded tables (lazy_load="true"
). You cannot apply this to standard loaded tables.
add_filter( 'wc_product_table_minimum_search_term_length', function( $length ) {
// Set a minimum search term length of 4 characters.
return 4;
} );
wc_product_table_process_shortcodes
Whether to process shortcodes in the product table. By default, the plugin will remove shortcodes from the product description so any content that would appear inside these shortcodes will not appear in the table. If you wish to override this behavior globally (for all tables), return tru
e from this filter. If you wish to enable it for just one table, use the shortcodes
option.
add_filter( 'wc_product_table_process_shortcodes', '__return_true' );
wc_product_table_search_filter_get_terms_args
Filters the arguments passed to get_terms
when retrieving the lists of terms (i.e. categories, tags, attribute or taxonomy terms) for the search filter dropdown menus. The filter passes an array
of arguments - see get_terms
for details.
wc_product_table_search_filter_terms_<filter>
Filters the list of items shown in the search filter dropdown menu for the specified filter. The dynamic portion of the hook - <filter>
- is the filter name as used in the filters
option, without the att:
or tax:
prefix.
Example filters:
wc_product_table_search_filter_terms_categories
wc_product_table_search_filter_terms_tags
wc_product_table_search_filter_terms_my_taxonomy
wc_product_table_search_filter_terms_pa_size
The filter accepts two parameters: an array of WP_Term
objects and the Table_Args
object.
add_filter( 'wc_product_table_search_filter_terms_pa_size', function( array $terms, $args ) {
return $terms;
}, 10, 2 );
wc_product_table_data_filters
Modify all the dropdown search filters at once. Returns an array of arrays, with the filter's taxonomy used as the top-level array key.
add_filter( 'wc_product_table_data_filters', function( $filters ) {
// Do something with the filters, e.g:
$filters['category']['heading'] = 'Choose a category';
return $filters;
} );
wc_product_table_data_config
Filter the table configuration used when the jQuery DataTables object is initialised. You can use this filter to (for example) disable or enable specific features. The following example disables sorting in all product tables:
// Disable all column sorting
add_filter( 'wc_product_table_data_config', function( $config ) {
$config['ordering'] = false;
return $config;
} );
wc_product_table_data_<column>
Filter the data for a specific column before it is added to the table. One filter is provided for each column in the table in this format: wc_product_table_data_<column>
.
The list of available filters are:
wc_product_table_data_button
wc_product_table_data_buy
wc_product_table_data_categories
wc_product_table_data_date
wc_product_table_data_date_modified
wc_product_table_data_description
wc_product_table_data_dimensions
wc_product_table_data_id
wc_product_table_data_image
wc_product_table_data_name
wc_product_table_data_price
wc_product_table_data_reviews
wc_product_table_data_sku
wc_product_table_data_stock
wc_product_table_data_summary
wc_product_table_data_tags
wc_product_table_data_weight
Each filter takes two parameters: the data to add to the table, and the WC_Product
object for the current product being added to the table.
// Example: adding a 'Read more' link to the product description.
add_filter( 'wc_product_table_data_description', function( $description, WC_Product $product ) {
return $description . ' ' . '<a href="' . esc_url( $$product->get_permalink() ) . '">Read more</a>';
}, 10, 2 );
For the button
, id
, sku
, name
, and image
columns, depending on the value of the links
option, the data may be wrapped in a HTML link to the single product page.
For example, with the name
column the data will contain a HTML link if the links
option is all
or name
. If you wish to filter the data before the link is added, use the wc_product_table_data_<column>_before_link
filter.
wc_product_table_data_<column>_before_link
Filter the data for a specific column before it is added to the table, and before the link to the single product page is added.
The list of available filters are:
wc_product_table_data_button_before_link
wc_product_table_data_id_before_link
wc_product_table_data_image_before_link
wc_product_table_data_name_before_link
wc_product_table_data_sku_before_link
Each filter takes two parameters: the data to add to the table, and the WC_Product
object for the current product being added to the table.
wc_product_table_data_attribute_<attribute>
This filter allows you to override data for an attribute column. Replace the <attribute> portion of the filter with the relevant attribute slug. For global attributes, the attribute slug is always prefixed with pa_
, e.g. pa_color
. So in this case the filter would be: wc_product_table_data_attribute_pa_color
.
For product-specific (or "text") attributes, you use the name defined in the Edit Product screen. So for product-specific attribute size
, the filter would be: wc_product_table_data_attribute_size
.
The filter accepts 2 parameters – the current attribute value and the current product object (WC_Product
).
add_filter( 'wc_product_table_data_attribute_pa_color', function( $value, $product ) {
return 'Color: ' . $value;
}, 10, 2 );
wc_product_table_data_taxonomy_<taxonomy>
This filter allows you to override data for a custom taxonomy column. Replace the <taxonomy> portion of the filter with the taxonomy slug. For example, if your taxonomy is called region
, the filter would be wc_product_table_data_taxonomy_region
.
The filter accepts 2 parameters – the current taxonomy value and the current product object (WC_Product
).
add_filter( 'wc_product_table_data_taxonomy_region', function( $value, $product ) {
return 'Region: ' . $value;
}, 10, 2 );
wc_product_table_data_custom_field
Filters which allows you to override the value of any custom field displayed in the table. It accepts 3 parameters – the custom field value, the custom field name, and the current product object (WC_Product
).
// Override data for the 'extra_notes' custom field.
add_filter( 'wc_product_table_data_custom_field', function( $value, $field, $product ) {
if ( 'extra_notes' === $field ) {
// do something with $value
}
return $value;
}, 10, 3 );
wc_product_table_data_custom_field_<field_name>
Filters which allows you to override a specific custom field in the table. Replace <field_name>
in the filter with the custom field you want to filter, e.g. wc_product_table_data_custom_field_some_field
.
It accepts 2 parameters – the custom field value and the current product object (WC_Product
).
// Override data for the 'extra_notes' custom field.
add_filter( 'wc_product_table_data_custom_field_extra_notes', function( $value, $product ) {
$value = 'xyz'; // example
return $value;
}, 10, 2 );
wc_product_table_custom_column_<column>
This filter allows you to add a custom column to the table. See the in-depth article for more information.
wc_product_table_custom_table_data_<column>
This filter is an alternative method to add a custom column to the table. See the in-depth article for more information.
wc_product_table_acf_value
Filters which allows you to override the custom field value returned from Advanced Custom Fields. It accepts 3 parameters – the custom field value, the ACF field object and the current post (i.e. product) ID.
add_filter( 'wc_product_table_acf_value', function( $value, $field_obj, $post_id ) {
if ( 'file' === $field_obj['type'] ) {
// do something with $value
}
return $value;
}, 10, 3 );
wc_product_table_custom_field_stored_date_format
If you are using date-based custom fields in your table, you may find that your dates are sometimes incorrectly sorted or formatted. The most likely cause of this is the date conversion functions used by the plugin which are built into PHP.
For example, dates such as “12/04/2018” are assumed to be in U.S. format with the month first (m/d/Y
). So this example date would be December 4th, 2018.
If the date is separated by dash (-), dot (.) or other symbol, it’s assumed to be a European/Australian date with the day before the month. If you’re using dates separated by a forward slash but in this format: d/m/Y, the plugin will not be able to sort these correctly (or format them if you’re using the date_format
option). To fix this, you will need to set this filter.
Note: this is not related to how the custom field is displayed in the table - see the date_format option for controlling the output of date custom fields.
add_filter( 'wc_product_table_custom_field_stored_date_format', function( $format, $field ) {
if ( 'despatch_date' === $field ) {
return 'd/m/Y';
}
return '';
}, 10, 2 );
wc_product_table_custom_field_is_eu_au_date
An alternative to the above filter, you can use this shorthand filter to quickly indicate your field is stored in European/Australian format (i.e. day before month).
The filter can be applied globally to all date-based custom fields, as follows:
add_filter( 'wc_product_table_custom_field_is_eu_au_date', '__return_true' );
Or you can use it for individual fields only, like this:
add_filter( 'wc_product_table_custom_field_is_eu_au_date', function( $is_eu_date, $field ) {
if ( 'event_date' === $field ) {
return true;
}
return false;
}, 10, 2 );
wc_product_table_separator_<type>
Filter which allows you to change the separator used between categories, tags, terms, attributes and custom fields. For example, a product can have multiple categories, each separated by a comma. This filter allows you to change the comma for a different character, line breaks, or other custom HTML.
The filter must include the relevant type
. Possible values for type
are: categories
, tags
, terms
, attributes
, custom_field
, and custom_field_row
.
For example, to change the separator between categories in the table, add this filter:
add_filter( 'wc_product_table_separator_categories', function( $sep ) {
return '<br/>';
} );
wc_product_table_data_cache_expiry
The length of time in seconds that the product table data will be cached. Defaults to 24 * HOUR_IN_SECONDS
(1 day).
wc_product_table_use_data_cache
Filter whether to use data caching globally across all product tables. Should return true
or false
.
wc_product_table_get_products
Filters the WooCommerce product objects retrieved from the database. It receives two parameters - the WC_Product
objects and the Table_Query
object.
add_filter( 'wc_product_table_get_products', function( $products, $table_query ) {
// do something with $products
return $products;
}, 10, 2 );
wc_product_table_query_args
Filters the query args passed to WP_Query
prior to retrieving products from the database. See WP_Query documentation for details. It receives two parameters - the query args and the Table_Query
object.
add_filter( 'wc_product_table_query_args', function( $args, $table_query ) {
// do something with $args
return $args;
}, 10, 2 );
wc_product_table_meta_query
Filter the meta query used in building the product table. It receives two parameters - the meta_query
array and the Table_Query
object.
wc_product_table_tax_query
Filter the tax query used in building the product table. It receives two parameters - the tax_query
array and the Table_Query
object.
wc_product_table_user_products_query_args
Filters the query args passed to wc_get_orders
prior to retrieving products from the database when displaying user products using the user_products shortcode option. See wc_get_orders and WC_Order_Query documentation for details. Takes one parameter - the query args ($order_args
).
add_filter( 'wc_product_table_user_products_query_args', function( $order_args ) {
// do something with $order_args
return $order_args;
}, 10, 1 );
wc_product_table_optimize_table_query
Filter whether the product table query should be optimized. Defaults to true
.
Optimization involves removing the content
and excerpt
columns from the wp_posts query to reduce the amount of data returned from the database. The optimization only occurs if the description
or summary
columns are used.
add_filter( 'wc_product_table_optimize_table_query', '__return_false' );
wc_product_table_use_numeric_skus
By default, Product Table will use alphabetical sorting for SKUs. If your store uses only numeric SKUs (e.g. 256, 321, etc), you can enable numerical SKUs using this filter, in order for the column sorting to work correctly. Add the following code:
add_filter( 'wc_product_table_use_numeric_skus', '__return_true' );
If you enable this filter and you also use lazy load, you must ensure that all products have a valid SKU. Due to a limitation of lazy load when using numerical SKUs, if a product has no SKU defined, that product will not appear in the table when sorting by numerical SKU.
wc_product_table_enable_lazy_load_sku_search
When using lazy load, the search box will include SKUs when searching for products. You can enable or disable this behavior by returning true or false from this filter. For example, to disable SKU searching for lazy load tables:
add_filter( 'wc_product_table_enable_lazy_load_sku_search', '__return_false' );
wc_product_table_get_table_output
Allows you to modify the result of the Product_Table->get_table()
function. Depending on the return type, the value passed to this filter could be an HTML_Data_Table
object, a HTML string, and array or JSON. It takes 3 parameters: the result, the output type, and the Product_Table
instance.
add_filter( 'wc_product_table_get_table_output', function( $result, $output_type, $table ) {
// Assuming get_data() was called with 'object' return type
if ( 'object' === $output_type ) {
$result->add_attribute( 'data-foo', 'bar' );
}
return $result;
}, 10, 3 );
wc_product_table_shortcode_output
Allows you to modify the HTML returned by the [wc_product_table]
shortcode. It takes 2 parameters: the HTML and the Product_Table
object.
add_filter( 'wc_product_table_shortcode_output', function( $html, $table ) {
// do something with HTML
return $html;
}, 10, 2 );
wc_product_table_multi_cart_class
Allows you to change the button class used for the multi add to cart button. Defaults to ‘button’.
add_filter( 'wc_product_table_multi_cart_class', function( $class ) {
return "btn";
} );
wc_product_table_multi_add_to_cart_data
Filters the data used for the 'Add Selected to Cart' form which adds multiple products to the cart based on the selected products. Expects an array of key => value
pairs, where the key
name is the name given to the hidden field input to be included in the cart data.
add_filter( 'wc_product_table_multi_add_to_cart_data', function( $data ) {
$data['foo'] = 'bar';
return $data;
} );
wc_product_table_open_products_in_new_tab
Product tables contain various links to the product details page. For example, the name
and button
columns will (by default) include a link to the product page.
These will open in the same tab or window by default. To open them in a new tab use the wc_product_table_open_products_in_new_tab
filter. For example:
add_filter( 'wc_product_table_open_products_in_new_tab', '__return_true' );
wc_product_table_enable_fitvids
Whether to use the FitVids library to make videos in the table responsive. Enabled by default. To disable:
add_filter( 'wc_product_table_enable_fitvids', '__return_false' );
wc_product_table_enable_select2
Whether to use the Select2 library to add enhancements to the search filters and page length dropdowns above and below the table. Enabled by default. To disable:
add_filter( 'wc_product_table_enable_select2', '__return_false' );
wc_product_table_use_table_layout
Whether to use the table layout on a specific page. Enabled by default. To disable:
add_filter( 'wc_product_table_use_table_layout', function( $use ) {
// Add your specific condition here.
if ( is_product_category( 'books' ) ) {
return false;
}
return $use;
} );
wc_product_table_args_id
This filter allows you to change the product table id argument that is created and used by the table builder.
add_filter( 'wc_product_table_args_id', function( $id ) {
// Add your specific condition here.
if ( is_user_logged_in() ) {
// Show a specific table for logged in users.
return 2;
}
return $id;
} );
Actions
wc_product_table_parse_args
This action is fired when the product table arguments have been parsed and set. Takes one argument - the Table_Args
object for the current table.
wc_product_table_before_get_table
This action is fired once before each table is created on the page. It receives one argument - the current Product_Table
object.
wc_product_table_after_get_table
This action is fired once after each table is created on the page. It receives one argument - the current Product_Table
object.
wc_product_table_before_get_data
This action is fired once before the data is fetched and added to the table. It receives one argument - the current Product_Table
object.
wc_product_table_after_get_data
This action is fired once after the data is added to the table. It receives one argument - the current Product_Table
object.
wc_product_table_<product type>_add_to_cart
This action is fired prior to adding a product to the cart from the table. If a hook has been registered with that name, this will be run instead of the add to cart functionality built into the plugin. The hook name is dynamic and includes the product type being added - simple
, variable
, etc. If you want to handle the add to cart behvior yourself for a given product type, use this action.