web-dev-qa-db-fra.com

wp groupe e-commerce produit par catégorie

Désolé pour mon mauvais anglais.
J'ai WP 3.3.1 & wp-e-commerce.3.8.7.6.2. Sur la page des produits (qui utilise le modèle wpsc-products_page.php), j'ai la liste des produits. Je veux regrouper ces produits par catégorie. Par exemple:

* * Cat1
Produit 1
Produit 2

* * Cat2
Produit 1
Produit 2

* * Cat3
Produit 1
Produit 2

J'essaie d'utiliser cette méthode, mais ça ne marche pas

add_filter('posts_join', create_function('$a', 'global $wpdb; return $a . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";'));
add_filter('posts_where', create_function('$a', 'global $wpdb; return $a . " AND $wpdb->term_taxonomy.taxonomy = \'wpsc_product_category\'";'));
add_filter('posts_orderby', create_function('$a','global $wpdb; return "$wpdb->term_taxonomy.term_id DESC";'));
query_posts('');

Merci à tous d'avance pour votre réponse!

1
Tsybulsky Serg

Tu es très proche. J'ai eu le même problème il y a quelque temps, et en a blogué . Il manque à votre jointure une table de jointure supplémentaire, wp_terms, qui contient le terme sur lequel vous souhaitez trier.

Voici le code que j'ai utilisé:

class OrderWpscProducts {

    // flag for when a shop products post query is being created
    private $isProductQuery = false;

    public function __construct() {
        // hooks for altering order of product pages
        add_filter('parse_query', array($this, 'filterProductQueryMark'), 20);
        add_filter('posts_join', array($this, 'filterProductQueryJoins'), 20);
        add_filter('posts_orderby', array($this, 'filterProductQueryOrderBy'), 20);
    }

    /**
    * detect a posts query that should return a list of shop products, 
    * and mark it for later filters
    * @param WP_Query $query
    * @return WP_Query
    */
    public function filterProductQueryMark($query) {
        $this->isProductQuery = false;

        if (!is_admin() && (wpsc_is_in_category() || !empty($query->query_vars['wpsc_wine_style']))) {
            $this->isProductQuery = true;
        }
    }

    /**
    * if the posts query is for a list of shop products, 
    * then add some tables to the join so that we can sort by category name
    * @param string $joins
    * @return string
    */
    public function filterProductQueryJoins($joins) {
        global $wpdb;

        if ($this->isProductQuery) {
            $joins .= "
 INNER JOIN $wpdb->term_relationships wpsc_cat_rel ON wp_posts.ID = wpsc_cat_rel.object_id
 INNER JOIN $wpdb->term_taxonomy wpsc_cat_tax ON wpsc_cat_tax.term_taxonomy_id = wpsc_cat_rel.term_taxonomy_id
   and wpsc_cat_tax.taxonomy = 'wpsc_product_category'
 INNER JOIN $wpdb->terms wpsc_cat ON wpsc_cat.term_id = wpsc_cat_tax.term_id
";
        }

        return $joins;
    }

    /**
    * if the posts query is for a list of shop products, then sort by category name and product title
    * @param string $orderby
    * @return string
    */
    public function filterProductQueryOrderBy($orderby) {
        if ($this->isProductQuery) {
            $orderby = 'wpsc_cat.name ASC, wp_posts.post_title ASC';
        }

        return $orderby;
    }
}

// create instance, will be kept alive by hooks
new OrderWpscProducts();
1
webaware