私はすべての製品を表示する必要があり、それが可変製品 (複数の色など) の場合は、ショップ ページの各バリエーションを表示する必要があります。
最初に、製品にバリエーションがある場合にすべてのバリエーションを取得するために、独自のクエリを作成しました。
$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
続けます。