[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.

 

MagCloud Widget WordPress plugin

HP MagCloud is a web service that empowers users to self-publish and distribute content—for business or personal use—as a professional-quality print publication or digitally for mobile and online viewing on today’s most popular devices. http://www.magcloud.com/learn

After uploading your PDF, one way of advertising your published magazine is to copy and paste some HTML code to your website. However, the HTML is not always matching the design of the blog. This widget will allow people to paste MagCloud HTML code, write their own template, and with the help of some short codes they get the output that match their themes.

I did it for a client but found it might be useful for somebody out there and here you go.

http://wordpress.org/extend/plugins/magcloud-widget/

[WordPress] Plugin’s Menu

To create a menu for a custom plugin, you can use the function add_menu_page. Here is a sample:


add_menu_page('Title of the page', 'The text to appear in menu', 'create_users', 'a-unique-slug-to-avoid-conflicts', 'function-that-renders-the-page-to-appear');

This will create a main menu item. To create a sub menu item under the one mentioned above, we can use the add_submenu_page. Here is a sample code:


add_submenu_page('the-slug-you-used-above-in-the-main-menu-item', 'Page title to appear', 'The text to appear in menu', 'create_users', 'another-different-unique-slug', 'function-that-renders-the-page-to-appear' );

The ‘create_users’ is the permission required for this menu item/page to be visible/accessible.