Use a simple sort along with complex queries
Advanced Post Types Order Simple Sort is an easy way to maintain order for different queries/sections (e.g. archive, taxonomies) within a single interface. As opposite an Advanced Sort can match a single query but which include a mix of posts, taxonomies, meta data and other parameters. This is a powerful tool which allow to match a sort virtually for any WordPress Queries, however it require specific sort settings to match exactly the front site query parameters. For that reason it can get a bit hard to manage for dynamic section which use a large number of complex queries.
Advanced sorts are not necessarily to be used, order can be created just for a specif taxonomy (e.g. attribute or category) and force the sort to apply for complex queries, which can contain other parameters like more taxonomies.
Let’s take a particular scenario, a WooCommerce instance with a custom filter plugin which output the products based on category and a specific attribute. This would require an advanced sort to be created for every combination (category and attribute), however this will get hard to manage at a point due to high number of sort lists. To make things much easier, we can crate a single simple sort and force the attribute order to apply to all queries which include a category and an attribute taxonomy property.
The attribute is called pa_drinks and is being passed through GET data. For food category a filter link would appear as the following:
/store/product-category/food/?pa_drinks=water
Naturally this would require an advanced sort and set the 2 taxonomies, the category and the attribute. However we can force to fallback on the simple sort instead:
add_filter('apto/query_match_sort_id', 'apto_query_match_sort_id', 10, 4);
function apto_query_match_sort_id($sort_view_id, $orderBy, $query, $sorts_match_filter)
{
//No need to apply for admin
if(is_admin())
return $new_orderBy;
global $APTO;
//This is the simple sort id which intend to be used instad
$reference_sort_id = 5529;
//retrieve the query post types arguments
$query_post_types = $APTO->functions->query_get_post_types($query);
//we need products only
if(count($query_post_types) > 1 || !in_array("product", $query_post_types))
return $sort_view_id;
//Only when pa_drinks is in the GET
//Other attributes can be included or removed alltogheter
if(!isset($_GET['pa_drinks']))
return $sort_view_id;
//populate attribute details
$pa_drinks = $_GET['pa_drinks'];
$pa_drinks_term = get_term_by('slug', $pa_drinks, 'pa_drinks');
//this will match only queries with multiple taxonomies
if(APTO_query_utils::tax_queries_count($query->tax_query->queries) < 2)
return $sort_view_id;
//make a filtred list of query taxonomies
$taxonomies = APTO_query_utils::get_tax_queries($query->tax_query->queries);
$found = FALSE;
//Identify if the query actually include a taxonomy of pa_drinks
foreach($taxonomies as $taxonomy)
{
if($taxonomy['taxonomy'] != 'pa_drinks')
continue;
if(!in_array($pa_drinks_term->slug, $taxonomy['terms']))
continue;
$found = TRUE;
}
if( $found === FALSE )
return $sort_view_id;;
//this match.
$attr = array(
'_view_selection' => 'taxonomy',
'_taxonomy' => 'pa_drinks',
'_term_id' => $pa_drinks_term->term_id,
'_view_language' => $APTO->functions->get_blog_language()
);
//Retrieve the sort_view_id whcih correspond to the pa_drinks term
$sort_view_id = $APTO->functions->get_sort_view_id_by_attributes($reference_sort_id, $attr);
return $sort_view_id;
}
Further, adjusting the sort on the simple sort, through the attribute, the order will apply on the front side for any queries which include the attribute.