2016-08-26 1 views
1

J'ai le problème suivant. J'ai mis en place un site Wordpress avec WooCommerce pour servir une boutique en ligne avec seulement des livres.Woocommerce: ordre par taxinomie personnalisée

J'ai créé quelques attributs de produits qui sont basés sur des taxonomies comme « éditeur » et « auteur » (comme plusieurs produits peuvent partager un auteur ou un éditeur)

Je voudrais pouvoir Trier mes produits non seulement sur les champs par défaut de Woocommerce comme 'title' et 'price' mais aussi sur ces champs de taxonomie. Dites par exemple: commande par Auteur ASC ou ordre par l'éditeur DESC

Pour autant que je l'ai découvert il n'y a aucun moyen de le faire avec les fonctions de base Wordpress. Certains disent que c'est parce que cela n'a aucun sens de trier par des champs de taxonomie, mais avec l'exemple ci-dessus, je ne comprends pas pourquoi vous ne voulez pas trier par exemple auteur.

J'ai joué avec sortby meta_value, mais cela ne fait qu'interroger le postmeta direct, pas les taxonomies. J'ai une connaissance de php, donc toute solution impliquant du code supplémentaire dans mon fichier functions.php fera l'affaire.

Répondre

1

J'ai trouvé un moyen comment résoudre ceci: https://gist.github.com/jayarnielsen/12f3a586900aa6759639

I légèrement modifié le code de sorte qu'il est égal à la façon dont WooCommerce utilise pour trier par les champs du système « title » et « prix » qui est l'ajout d'une url query-param nommé "sortby" une valeur structurée comme ceci: "field" - "direction" Donc pour trier par une propriété de produit appelée "pa_tax1" ascendant vous devrez ajouter à l'URL: sortby = pa_tax1-asc

add_filter('posts_clauses', 'posts_clauses_with_tax', 10, 2); 
function posts_clauses_with_tax($clauses, $wp_query) { 
    global $wpdb; 

    // Array of taxonomies you want to sort on 
    // in case of Woocommerce Properties, be sure to add the pa_ prefix 
    $taxonomies = array('pa_tax1', 'pa_tax2', 'pa_tax3'); 

    // If no orderby query param is found, do nothing 
    if(!isset($wp_query->query['orderby'])) { 
     return $clauses; 
    } 

    // Explode the orderby query-param 
    $orderQuery = explode('-', $wp_query->query['orderby']); 
    $orderBy = []; 
    $orderBy['field'] = $orderQuery[0]; 
    $orderBy['direction'] = (isset($orderQuery[1])) ? strtoupper($orderQuery[1]) : 'ASC'; 

    // Only add clauses, if the sortby field is in our array 
    if(in_array($orderBy['field'], $taxonomies)) { 
     $clauses['join'] .= " 
      LEFT OUTER JOIN {$wpdb->term_relationships} AS rel2 ON {$wpdb->posts}.ID = rel2.object_id 
      LEFT OUTER JOIN {$wpdb->term_taxonomy} AS tax2 ON rel2.term_taxonomy_id = tax2.term_taxonomy_id 
      LEFT OUTER JOIN {$wpdb->terms} USING (term_id) 
     "; 

     $clauses['where'] .= " AND (taxonomy = '".$orderBy['field']."' OR taxonomy IS NULL)"; 
     $clauses['groupby'] = "rel2.object_id"; 
     $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) "; 
     $clauses['orderby'] .= ('ASC' == strtoupper($orderBy['direction'])) ? 'ASC' : 'DESC'; 

     return $clauses; 
    } 
    else { 
     return $clauses; 
    } 
}