首页 文章

woocommerce商店产品变化

提问于
浏览
3

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

What is the norm: 产品A和产品B在网站上显示 . 产品A有'ad to cart'按钮 . 产品B有'Select Options'按钮 .

What I'm after :产品A是'simple'产品,在商店页面上显示产品B是'variable'产品,有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_flavour
//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);

因此,我可以获得'flavor'的属性,并且正在寻找为每个变体定义的缩略图......?任何有关这可能的帮助/指示表示赞赏 .

另外[可能是我对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 );
        }
    }
}

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

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; ?>

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

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

2 回答

  • 0
    $thumb_image = get_the_post_thumbnail($variable_id, $size);
    

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

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

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

    你找到了解决这个问题的合适解决方案吗?

    我在这里发布了一个类似的问题,这可能会给你更多的见解:Display all products and variations on the shop page, while maintaining pagination

    编辑:有一个插件'Woocommerce Show Single Variations'有效 . 过去它是免费的,但不再是:https://iconicwp.com/products/woocommerce-show-single-variations/

  • 0

    将此代码粘贴到主题functions.php中

    /**
     * Replace add to cart button in the loop.
     */
    function iconic_change_loop_add_to_cart() {
        remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
        add_action( 'woocommerce_after_shop_loop_item', 'iconic_template_loop_add_to_cart', 10 );
    }
    
    add_action( 'init', 'iconic_change_loop_add_to_cart', 10 );
    
    /**
     * Use single add to cart button for variable products.
     */
    function iconic_template_loop_add_to_cart() {
        global $product;
    
        if ( ! $product->is_type( 'variable' ) ) {
            woocommerce_template_loop_add_to_cart();
            return;
        }
    
        remove_action( 'woocommerce_single_variation', 'woocommerce_single_variation_add_to_cart_button', 20 );
        add_action( 'woocommerce_single_variation', 'iconic_loop_variation_add_to_cart_button', 20 );
    
        woocommerce_template_single_add_to_cart();
    }
    
    /**
     * Customise variable add to cart button for loop.
     *
     * Remove qty selector and simplify.
     */
    function iconic_loop_variation_add_to_cart_button() {
        global $product;
    
        ?>
        <div class="woocommerce-variation-add-to-cart variations_button">
            <button type="submit" class="single_add_to_cart_button button"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button>
            <input type="hidden" name="add-to-cart" value="<?php echo absint( $product->get_id() ); ?>" />
            <input type="hidden" name="product_id" value="<?php echo absint( $product->get_id() ); ?>" />
            <input type="hidden" name="variation_id" class="variation_id" value="0" />
        </div>
        <?php
    }
    

相关问题