3

私はすべての製品を表示する必要があり、それが可変製品 (複数の色など) の場合は、ショップ ページの各バリエーションを表示する必要があります。

最初に、製品にバリエーションがある場合にすべてのバリエーションを取得するために、独自のクエリを作成しました。

$product = get_product();
global $variable_id;
global $color;
if ($product->product_type == "variable") {
    $variations = $product->get_available_variations();
    foreach ($variations as $variation) {
        $color = $variation["attributes"]["attribute_pa_colour"];
        $variable_id = $variation['variation_id'];
        wc_get_template_part('content', 'product');
    }
} else {
    $variable_id = null;
    $color = null;
    wc_get_template_part('content', 'product');
}

バリエーションのグローバル パラメータを設定し、その後、別のテンプレート ファイルで適切な画像を取得しました。

このソリューションの問題は、ページネーションが壊れていることです (1 つの製品が複数回表示されます)。

したがって、私が達成する必要があるのは、メインの製品クエリを操作してすべての製品を選択することです。ここで、バリエーションを持つ製品は、正しい画像リンクとバリエーション値を使用して、バリエーションごとに 1 回表示する必要があります (リンクするには、メイン製品の情報も必要です)。正しいページ)。Left Joinこれは、 に基づいて、同じ製品テーブルでによって実現できますpost_parent

ここで重要なのは、デフォルトの woocommerce の動作を維持することです。これは、製品を取得するための woocommerce 関数です。

private function query_products( $args ) {
    // Set base query arguments
    $query_args = array(
        'fields'      => 'ids',
        'post_type'   => 'product',
        'post_status' => 'publish',
        'meta_query'  => array(),
    );
    if ( ! empty( $args['type'] ) ) {
        $types = explode( ',', $args['type'] );
        $query_args['tax_query'] = array(
            array(
                'taxonomy' => 'product_type',
                'field'    => 'slug',
                'terms'    => $types,
            ),
        );
        unset( $args['type'] );
    }

    // Filter products by category
    if ( ! empty( $args['category'] ) ) {
        $query_args['product_cat'] = $args['category'];
    }

    // Filter by specific sku
    if ( ! empty( $args['sku'] ) ) {
        if ( ! is_array( $query_args['meta_query'] ) ) {
            $query_args['meta_query'] = array();
        }
        $query_args['meta_query'][] = array(
            'key'     => '_sku',
            'value'   => $args['sku'],
            'compare' => '='
        );
        $query_args['post_type'] = array( 'product', 'product_variation' );
    }
    $query_args = $this->merge_query_args( $query_args, $args );
    return new WP_Query( $query_args );
}

したがって、基本的に、この関数をオーバーライドする方法を見つける必要があります。これにより、WP_Queryすべての「単純な」製品とすべての「可変」製品の各バリエーションの製品を含むオブジェクトが返され、渡されたすべてのパラメーターが機能し$args続けます。

4

1 に答える 1

1

私は解決策を見つけました:「Woocommerce Show Single Variations」プラグイン: https ://iconicwp.com/products/woocommerce-show-single-variations/

注意: 既にカテゴリがある場合は、それらを削除して再度追加する必要があります。また、ショートコードではまだ機能しませんが、作者はそれに取り組んでいます.

更新:プラグインへのリンクを変更しました

于 2015-12-11T10:38:14.720 に答える