在商店页面上显示所有产品和变体,同时保持分页
Display all products and variations on the shop page, while maintaining pagination
我需要展示每个产品,如果它是可变产品(例如多种颜色),则在商店页面上显示每个变体。
起初,我编写了自己的查询来检索所有变体(如果产品有):
$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 个产品出现多次)。
因此,我需要实现的是将主要产品查询操作为 select 所有产品,其中具有变体的产品必须针对每个具有正确图像 link 和变体值的变体出现一次(我需要主要产品的信息以及 link 到正确的页面)。
这可以通过 Left Join
在相同产品 table 上实现,基于 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
对象,其中包含所有 'simple' 产品和所有 [=31= 的每个变体的产品] 产品,而通过 $args
传递的所有参数继续工作。
我找到了解决方案:"Woocommerce Show Single Variations" 插件:
https://iconicwp.com/products/woocommerce-show-single-variations/
备注:如果您已有类别,则必须删除并重新添加它们。此外,它仍然不适用于短代码,不过作者正在努力。
更新: 将 link 更改为插件
我需要展示每个产品,如果它是可变产品(例如多种颜色),则在商店页面上显示每个变体。
起初,我编写了自己的查询来检索所有变体(如果产品有):
$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 个产品出现多次)。
因此,我需要实现的是将主要产品查询操作为 select 所有产品,其中具有变体的产品必须针对每个具有正确图像 link 和变体值的变体出现一次(我需要主要产品的信息以及 link 到正确的页面)。
这可以通过 Left Join
在相同产品 table 上实现,基于 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
对象,其中包含所有 'simple' 产品和所有 [=31= 的每个变体的产品] 产品,而通过 $args
传递的所有参数继续工作。
我找到了解决方案:"Woocommerce Show Single Variations" 插件: https://iconicwp.com/products/woocommerce-show-single-variations/
备注:如果您已有类别,则必须删除并重新添加它们。此外,它仍然不适用于短代码,不过作者正在努力。
更新: 将 link 更改为插件