woocommerce 商店产品变体

JI-*_*Web 5 php wordpress product woocommerce

我想在 Wp/Woocommerce /shop/ 页面上显示所有产品及其变体。(/woocommerce/archive-product.php)。我在下面描述的过程是我尝试让它发挥作用的过程。欢迎使用替代方案。

标准是什么:产品 A 和产品 B 在网站上显示。产品 A 有“广告到购物车”按钮。产品 B 有“选择选项”按钮。

我想要的:产品 A 是“简单”产品,在商店页面上显示 产品 B 是“可变”产品,有 2 种组合(黑色/蓝色)。添加到购物车按钮将此变体添加到购物车

我想在商店页面上显示 3 个产品,相当于 1* 产品 A 和 2* 产品 B。

到目前为止,我已经提取了产品是否可变的一些有关该产品变体的基本细节,但我似乎找不到缩略图?

$postId = get_the_ID();
$args = array(
    'post_type'     => 'product_variation',
    'post_status'   => array( 'private', 'publish' ),
    'numberposts'   => -1,
    'orderby'       => 'menu_order',
    'order'         => 'asc',
    'post_parent'   => $postId
);
$variations = get_posts( $args );
//var_dump($variations);

//$p = get_post_meta($postId, '_product_attributes', true);  // return pa_flavor
//var_dump($p);

if(!empty($variations)) {
    foreach ($variations as $variation) {

        $vari = new WC_Product_Variation($variation->ID);
        $availableAttr = $vari->get_attribute('Flavour');
        $flavour = get_post_meta($variation->ID, 'attribute_pa_flavour', true);
Run Code Online (Sandbox Code Playgroud)

因此,我可以获得“风味”的属性,并寻找为每个变体定义的缩略图......?任何有关此问题的帮助/指示都将受到赞赏。

另外[可能是我对Wordpress缺乏了解]我似乎无法在wc_get_template()中传递/访问变量。这可能是一个次要问题,但仍然与在一个页面上显示单一产品和变体产品的基本问题有关。

remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 );
add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price_variation', 10 );

if ( ! function_exists( 'woocommerce_template_loop_price_variation' ) ) {
    function woocommerce_template_loop_price_variation($prodVar=array()) {

        if(empty($prodVar) || $prodVar['product_type'] == 'simple') {
            wc_get_template( 'loop/price.php' );
        }  else {
            wc_get_template( 'loop/price-variation.php' , $prodVar );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在 /price-variation.php (price.php woocommerce 基础的副本)

global $product;
var_dump($prodVar);  // PRODUCED NOTICE to undefined variable??? 
<?php if ( $price_html = $product->get_price_html() ) : ?>
    <span class="price"><?php echo $price_html; ?></span>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)

我不希望它是全球性的...?或者这是唯一的方法?

任何帮助或建议表示赞赏。

Tho*_*bbe 0

$thumb_image = get_the_post_thumbnail($variable_id, $size);
Run Code Online (Sandbox Code Playgroud)

您可以覆盖循环的产品缩略图(在functions.php 中)。如果在变体的情况下全局设置variation_id,在简单产品的情况下全局设置variation_id,您可以执行以下操作:

remove_action('woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10);
function own_woocommerce_thumbnail() {
    global $product, $woocommerce, $variable_id;

    $items_in_cart = array();

    if ($woocommerce->cart->get_cart() && is_array($woocommerce->cart->get_cart())) {
        foreach ($woocommerce->cart->get_cart() as $cart) {
            $items_in_cart[] = $cart['product_id'];
        }
    }

    $id = get_the_ID();
    $in_cart = in_array($id, $items_in_cart);
    $size = 'medium';
    if ($variable_id) {
        $thumb_image = get_the_post_thumbnail($variable_id, $size);
    } else {
        $thumb_image = get_the_post_thumbnail($id, $size);
    }

    echo '<span class="featured-image">';
    echo $thumb_image;
    echo '<span class="cart-loading" style="display: none">';
    if ($in_cart) {
        echo '<i class="fa fa-check-square-o"></i>';
    } else {
        echo '<i class="fa fa-spinner"></i>';
    }
    echo '</span></span>';
}
add_action('woocommerce_before_shop_loop_item_title', 'own_woocommerce_thumbnail', 10);
Run Code Online (Sandbox Code Playgroud)

注意:这将阻止分页,因为一件产品将在产品页面上显示多次。注意 2:您需要为悬停操作编写一些 jquery 来修复“添加到购物车”

您找到解决这个问题的合适方法了吗?

我在这里发布了一个类似的问题,这可能会给您更多见解:在商店页面上显示所有产品和变体,同时保持分页

编辑:有一个插件“Woocommerce Show Single Variations”可以使用。它曾经是免费的,但现在不再是: https ://iconicwp.com/products/woocommerce-show-single-variations/