wake-up-neo.com

WooCommerce: Filtern nach Taxonomie des übergeordneten Produkts und Metadaten der Produktvariation

In WooCommerce möchte ich meine Produktseite basierend auf der Meta-Angabe der Produktvariation und der Taxonomie der variablen Produkte filtern.

Hinweis: Alle Produkte haben Variationen, es gibt kein Produkt ohne Variationen.

Zum Beispiel möchte ich in der Lage sein, Produkte nach Kategorien verwandter variabler Produkte (Armbänder, Ohrringe, Ringe ...) und deren Farbmeta (Gold, Silber, Bronze ...) zu filtern.

Das Problem besteht darin, die Taxonomie zu kombinieren, und Produktvariationen funktionieren nicht. Zum Filtern nach Taxonomie verwende ich den folgenden Code:

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

Das funktioniert und gibt mir die richtigen Ergebnisse.

Um die Meta der Variation zu filtern, habe ich diesen Code verwendet (er funktioniert auch):

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

Was jetzt nicht funktioniert, ist die Kombination von beidem. Ich denke, das liegt daran, dass Produktvarianten keine Taxonomie haben, sodass ich möglicherweise etwas falsch mit der Logik mache. Hier was ich ausprobiert habe und es funktioniert nicht:

    $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
);

Wenn ich das tue, bekomme ich "kein Produkt gefunden", obwohl ich dachte, dass meine Filter etwas zurückgeben müssen.

Jede Hilfe wird sehr geschätzt. Vielen Dank

1
Gia Bao Nguyen

Sie können versuchen, $ wpdb wie folgt zu verwenden:

// 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