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.