web-dev-qa-db-fra.com

WooCommerce: filtrez la taxonomie du produit parent et les métadonnées de la variation du produit

Dans WooCommerce, je souhaite filtrer la page de mes produits en fonction de méta de la variation du produit et taxonomie des produits associés.

Note: Tous les produits ont des variantes, il n'y a pas de produit sans variantes.

Par exemple, j'aimerais pouvoir filtrer les produits par catégories de produits variables apparentés (Bracelets, Boucles d'oreille, Bagues ...) et les méta de couleur de leurs variations (Or, Argent, Bronze ...)

Le problème est de combiner la taxonomie et les variations de produits ne fonctionne pas. Pour filtrer par taxonomie, j'utilise le code suivant:

    $args = array (
    'post_type' => array ('product'),
    'post_status' => 'publish',
    'order_by' => 'date',
    'order' => 'DSC',
    'posts_per_page' => 18,
    'tax_query' => $tax_query
);

Cela fonctionne et donnez-moi les bons résultats.

Pour filtrer la méta de la variation, j'ai utilisé ce code (il fonctionne également):

    $args2 = array (
    'post_type' => array ('product_variation'),
    'post_status' => 'publish',
    'order_by' => 'date',
    'order' => 'DSC',
    'posts_per_page' => 18,
    'meta_query' => $meta_query
);

Maintenant, ce qui ne fonctionne pas, c'est de combiner les deux. Je le pense parce que les variantes de produit n’ont pas de taxonomie et que je risque donc de faire quelque chose de mal avec la logique. Voici ce que j'ai essayé et ça ne marche pas:

    $args = array (
    'post_type' => array ('product', 'product_variation'),
    'post_status' => 'publish',
    'order_by' => 'date',
    'order' => 'DSC',
    'posts_per_page' => 18,
    'tax_query' => $tax_query,
    'meta_query' => $meta_query
);

Quand je le fais, je reçois le message "Aucun produit trouvé", même si mes filtres doivent renvoyer quelque chose.

Toute aide est très appréciée. Merci

1
Gia Bao Nguyen

Vous pouvez essayer d’utiliser $ wpdb, comme ceci:

// Use the global variable $wpdb;
global $wpdb;

// :: Define SQL command ::

// You can request for the IDs only,
// and then get the properties later on via get_post_meta or WC_Product()
$q  = 'SELECT wp_posts.ID ';
$q .= 'FROM wp_posts ';

// Attach wp_postmeta table
$q .= 'JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) ';

// Attach taxonomy and term tables
$q .= 'JOIN wp_term_relationships ON ( wp_posts.ID = wp_term_relationships.object_id ) ';
$q .= 'JOIN wp_term_taxonomy ON ( wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id ) ';
$q .= 'JOIN wp_terms ON ( wp_term_taxonomy.term_id = wp_terms.term_id ) ';

// WHERE statements
$q .= 'WHERE ';

    // Post should be published
    $q .= 'wp_posts.post_status =  "publish" ';

    $q .= 'AND ';

    // Post should have either product or product_variation as post_type
    $q .= '(';
        $q .= 'wp_posts.post_type =  "product" ';
        $q .= 'OR ';
        $q .= 'wp_posts.post_type =  "product_variation" ';
    $q .= ')';

    $q .= 'AND ';

    // Post should have ##color_meta_key## = ##color_meta_value##
    $q .= '(';
        $q .= 'wp_postmeta.meta_key =  "##color_meta_key##" ';
        $q .= 'AND ';
        $q .= 'wp_postmeta.meta_value =  "##color_meta_value##" ';
    $q .= ')';

    $q .= 'AND ';

    // Post should belong to taxonomy_term with ##taxonomy_term_id## as ID
    $q .= 'wp_term_taxonomy.term_id IN ( ##taxonomy_term_id## ) ';

// Ordered according to date, descending
$q .= 'ORDER BY wp_posts.post_date DESC ';

// Limit the result to 18
$q .= 'LIMIT 18 '

// Will return an object
$wpdb->get_results($q);
1
tanhernandez