facetwp_facet_orderby
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 (DESC
order) 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 );