[WooCommerce] Sort by Custom Attributes

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.

 

So I went to an incubator ..

Kindly check the Flat6Labs reply at the bottom of the pageAlso make sure to read the proposed business plan/model and the one being executed now.

Flat6Labs is a successful and reputable incubator located in Egypt. They’ve already done great work and helped many people with potential and great skills creating and managing their own companies and leading them to success.

I, like many others, had an entrepreneur idea. I was encouraged to apply to Flat6Labs through a friend (who he himself is incubated by Flat6Labs). The application email can be seen below.

Briefly, my application was about a service which allows people to help each other get items from other countries instead of using an expensive shipment service.

However, I did not have a team ready back then. I went in for a quick chat and we settled that whenever I am ready I can apply again, even though they “did not like the idea that much,” and found plenty of flaws in the model of my proposal. To be honest, it was a constructive feedback.  I was told whenever I get any other ideas, I should not hesitate to contact them about it. Generous, nice, and marvelous supporting people and environment that I wish I could have joined.

Around the 10th of May 2013, Flat6Labs announced the list of companies they incubated, one of which is named Zaagel, founded by a person who cooperated with Flat6Labs before. Zaagel has pretty much the same features that I included in my application (shown below).

Continue reading