web-dev-qa-db-ja.com

WooCommerce:親商品の分類法と商品のバリエーションのメタデータで絞り込む

WooCommerceでは、 商品のバリエーションのメタ および 関連する可変商品の分類法 に基づいて自分の商品ページをフィルタします。

注: すべての製品にはバリエーションがあります。バリエーションがない製品はありません。

たとえば、関連する変種商品(ブレスレット、イヤリング、指輪など)とそのバリエーションの色メタ(金、銀、青銅...)で商品を絞り込むことができます

問題は、分類と製品のバリエーションを組み合わせることでは機能しません。分類法でフィルタリングするには、次のコードを使用します。

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

これはうまくいっていて、正しい結果が得られます。

バリエーションのメタをフィルタリングするために、私はこのコードを使いました(それは同様に機能しています):

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

今、うまくいっていないのは両方を組み合わせることです。製品のバリエーションには分類法がないので、論理に問題がある可能性があります。ここで私が試したところそれがうまくいかなかった:

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

これを実行すると、私は自分のフィルタが何かを返さなければならないと考えた場合でも「製品が見つかりません」と表示します。

任意の助けは大歓迎です。ありがとう

1
Gia Bao Nguyen

次のように$ wpdbを使ってみることができます。

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