Overview

This filter lets you customize the display order of choices within a facet.

How it works

FacetWP uses the facetwp_index table to store facet values. When loading values for a facet, the SQL query looks like the following:

SELECT * FROM wp_facetwp_index f WHERE {where} ORDER BY {orderby};

This filter lets you dynamically customize the {orderby} above. You have access to the table columns (facet_value, facet_display_value, term_id, etc.), but not menu_order. If you need to sort by arbitrary values, see the example below.

Parameters

  • $orderby | string | The original “ORDER BY”
  • $facet | array | An array of facet properties (see below)

How to use custom PHP code?

PHP code can be added to your (child) theme's functions.php file. Alternatively, you can use the Custom Hooks add-on, or a code snippets plugin. More info

$facet = [ 'name' => 'my_facet', 'type' => 'checkboxes', 'source' => 'tax/category', // ... ];

Switch the default ASC/DESC order

Many facet types have a “Sort by” setting which determines the order of the facet choices. For example, a Checkboxes facet has these four sort options: Highest count, Display value, Raw value, and Term order.

The ascending (ASC) or descending (DESCorder) of these default options is hard-coded. With this hook you can easily switch this order, by setting the desired order with the $orderby variable.

To do this, you must first know what the current $orderby value is. This depends on the order set in the “Sort by” setting, and on other settings of the facet. The easiest way to determine the current order, is to display it with print( $orderby ), as follows:

How to use custom PHP code?

PHP code can be added to your (child) theme's functions.php file. Alternatively, you can use the Custom Hooks add-on, or a code snippets plugin. More info

add_filter( 'facetwp_facet_orderby', function( $orderby, $facet ) { if ( 'my_facet_name' == $facet['name'] ) { // Change 'my_facet_name' to the name of your facet. Add more facet names to the array if needed. print( $orderby ); // Prints the current order to the bottom of the page. Comment out or remove this line when done. } return $orderby; }, 10, 2 );

This will output the current/default order to the bottom of the page displaying the facet. You can then copy this output, adapt it, and pass the desired order into $orderby variable.

Here is an example: if you have a Checkboxes facet with its “Sort by” setting set to order by “Display value” and its “Hierarchical” setting enabled, the print( $orderby ) in the above snippet will output this SQL to the bottom of the page:

f.depth, f.facet_display_value ASC

This means: order by hierarchical depth level first, then by facet_display_value, in ASC (A-Z) order.

Say you now want to switch this order to DESC (Z-A), you only have to adapt this order and pass it into the $orderby variable as follows:

How to use custom PHP code?

PHP code can be added to your (child) theme's functions.php file. Alternatively, you can use the Custom Hooks add-on, or a code snippets plugin. More info

add_filter( 'facetwp_facet_orderby', function( $orderby, $facet ) { if ( 'my_facet_name' == $facet['name'] ) { // Change 'my_facet_name' to the name of your facet. Add more facet names to the array if needed. // print( $orderby ); // Prints the current order to the bottom of the page. Comment out or remove this line when done. $orderby = 'f.depth, f.facet_display_value DESC'; // Switches the default ASC order to DESC in a hierarchical facet set to order by "Display value". } return $orderby; }, 10, 2 );

These are the default hard-coded facet $orderby values you’ll encounter depending on the facet settings:

/* Sort by Highest count */ counter DESC, f.facet_display_value ASC /* Sort by Highest count - Hierarchical */ f.depth, counter DESC, f.facet_display_value ASC /* Sort by Display value */ f.facet_display_value ASC /* Sort by Display value - Hierarchical */ f.depth, f.facet_display_value ASC /* Sort by Raw value */ f.facet_value ASC /* Sort by Raw value - Hierarchical */ f.depth, f.facet_value ASC /* Sort by Term order (example term ids) */ f.depth, FIELD(f.term_id, 185,186,205,149,65,70,49,58,62,38) /* Sort by Term order - Hierarchical (example term ids) */ f.depth, FIELD(f.term_id, 185,186,205,149,65,70,49,58,62,38)

This is a custom order determined by the drag/drop order in WooCommerce product categories and attributes, or as set with one of the supported ordering plugins.

Sort numerically

If your facet’s data source is a custom field containing numbers, and you want to sort the facet choices numerically, you can sort by facet_value (the raw/technical facet value as seen in the URL when selected) and add a +0 to it, which will (try to) convert the values to number values.

The following example sorts two facets named number_of_bedrooms and number_of_guests numerically. Adapt the facet name(s) to your situation and add the code to your (child) theme’s functions.php:

How to use custom PHP code?

PHP code can be added to your (child) theme's functions.php file. Alternatively, you can use the Custom Hooks add-on, or a code snippets plugin. More info

add_filter( 'facetwp_facet_orderby', function( $orderby, $facet ) { if ( in_array( $facet['name'], [ 'number_of_bedrooms', 'number_of_guests' ] ) ) { // change 'number_of_bedrooms' and 'number_of_guests' to the name(s) of your facet(s). Add or remove facets from the array if needed. $orderby = 'f.facet_value+0 ASC'; // Order numerically by raw value, in ascending order. } return $orderby; }, 10, 2 );

To sort by facet label instead of raw value, replace facet_value with facet_display_value. To use a descending order, replace ASC with DESC.

Sort by arbitrary values

The following example sorts a facet named day_of_week by day order. Adapt the facet name and options to your situation and add the code to your (child) theme’s functions.php:

How to use custom PHP code?

PHP code can be added to your (child) theme's functions.php file. Alternatively, you can use the Custom Hooks add-on, or a code snippets plugin. More info

add_filter( 'facetwp_facet_orderby', function( $orderby, $facet ) { if ( 'day_of_week' == $facet['name'] ) { // Change 'day_of_week' to the name of your facet $orderby = 'FIELD(f.facet_display_value, "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")'; // Adapt to your facet's options } return $orderby; }, 10, 2 );

Sort by term order

Most facets have a setting to order by term_order. This is a custom order determined by the drag/drop order in WooCommerce product categories and attributes, or as set with one of the supported ordering plugins.

The Color facet for example, does not have an option to change the sort order. The following snippet shows how to use the facetwp_facet_orderby hook to set the order to term_order:

How to use custom PHP code?

PHP code can be added to your (child) theme's functions.php file. Alternatively, you can use the Custom Hooks add-on, or a code snippets plugin. More info

add_filter( 'facetwp_facet_orderby', function( $orderby, $facet ) { // Change 'my_color_facet_name' to the name of your facet. if ( 'my_color_facet_name' == $facet['name'] ) { // Change 'pa_color' to the name of the product attribute used in the Color facet's Data source setting. // Note that 'pa_' is automatically added by WooCommerce before the attribute's slug. $term_ids = get_terms( [ 'taxonomy' => 'pa_color', 'term_order' => true, 'fields' => 'ids', ] ); if ( ! empty( $term_ids ) && ! is_wp_error( $term_ids ) ) { $term_ids = implode( ',', $term_ids ); $orderby = "FIELD(f.term_id, $term_ids)"; } } return $orderby; }, 10, 2 );

Sort by date

If you have a facet with dates as data source, you can use the following to customize the order of the date choices.

Date field (like ACF Date Picker or Date Time Picker fields) are stored in the database (and indexed by FacetWP) as YYYY-MM-DD or YYYYMMDD values. This means you can sort date facets by setting the “Sort by” setting to “Raw value”. The default order will then be ASC, as shown in line 14 above overview. This means dates will be ordered from old to new.

If you want the order reversed (from new to old), you can use the following snippet:

How to use custom PHP code?

PHP code can be added to your (child) theme's functions.php file. Alternatively, you can use the Custom Hooks add-on, or a code snippets plugin. More info

// Change date order to DESC. We're using the facet_value which is yyyymmdd for e.g. ACF date fields add_filter( 'facetwp_facet_orderby', function( $orderby, $facet ) { if ( 'my_date_facet' == $facet['name'] ) { // Replace 'my_date_facet' with the name of your facet $orderby = 'f.depth, f.facet_value DESC'; // From new to old } return $orderby; }, 10, 2 );

Note that if you want to format the dates in the facet, for example like January 17, 2024, you can customize the facet_display_value with the facetwp_index_row hook. See these examples.

More examples

See also

Last updated: March 20, 2025