Update
I created a plugin for this plus many other features. Click here to view it.
To add extra sorting options to your WooCommerce pages using products’ meta data you can use the following
http://docs.woothemes.com/document/custom-sorting-options-ascdesc/
However, I wanted to add some sorting options that use the WooCommerce’s custom attributes. According to this thread, the product attributes are saved in a serialized format in the database and therefore it’s not feasible to do it directly.
To use the provided WooCommerce filters the attributes should be saved as meta data.
When a post that has some custom attributes set is updated, the submitted data ($_REQUEST) contains the following:
'attribute_names' => array ( 0 => 'pa_pub-year', 1 => 'pa_pub-author', ... ), 'attribute_position' => array ( 0 => '1', 1 => '1', ...... 'attribute_is_taxonomy' => array ( 0 => '1', ...... ), 'attribute_values' => array ( 0 => '1990', 1 => '', 2 => '', ...... ),
The approach I followed is to get the submitted attributes and save them as post meta data. Afterwards, the code provided by WooCommerce to sort using attributes, with a tiny modification, worked successfully.
The code is as follows
/************* Add sorting by attributes **************/ /** * Defines the criteria for sorting with options defined in the method below */ add_filter('woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args'); function custom_woocommerce_get_catalog_ordering_args( $args ) { global $wp_query; // Changed the $_SESSION to $_GET if (isset($_GET['orderby'])) { switch ($_GET['orderby']) : case 'pa_pub-year' : $args['order'] = 'ASC'; $args['meta_key'] = 'pa_pub-year'; $args['orderby'] = 'meta_value_num'; break; endswitch; } return $args; } /** * Adds the sorting options to dropdown list .. The logic/criteria is in the method above */ add_filter('woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby'); function custom_woocommerce_catalog_orderby( $sortby ) { $sortby['pa_pub-year'] = 'Sort by Year: Older to Newer'; return $sortby; } /** * Save custom attributes as post's meta data as well so that we can use in sorting and searching */ add_action( 'save_post', 'save_woocommerce_attr_to_meta' ); function save_woocommerce_attr_to_meta( $post_id ) { // Get the attribute_names .. For each element get the index and the name of the attribute // Then use the index to get the corresponding submitted value from the attribute_values array. foreach( $_REQUEST['attribute_names'] as $index => $value ) { update_post_meta( $post_id, $value, $_REQUEST['attribute_values'][$index] ); } } /************ End of Sorting ***************************/
This should be placed in the functions.php file of your theme.
34 thoughts on “[WooCommerce] Sort by Custom Attributes”