【问题标题】:woocommerce shop product variationswoocommerce 商店产品变化
【发布时间】:2021-05-30 19:49:45
【问题描述】:

我想在 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);

因此,我可以获得“风味”的属性,并正在寻找为每个变体定义的缩略图...?任何帮助/指向可以这样做的地方都将不胜感激。

另外 [可能是我对 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 基地的副本)

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

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

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

【问题讨论】:

  • $variation-&gt;get_image() 应该得到一个变体对象的缩略图。另外,我认为您可以将new WC_Product_Variation 更改为wc_get_product()
  • 我实际上一直在考虑构建一个插件来执行此操作,但我对多个属性会发生什么有些困惑。例如:如果 Black Large 和 Black Small 具有相同的缩略图,则不希望显示它们。好奇您是否对如何选择要添加到循环中的变体有任何想法?它如何对您最有效?
  • 感谢 Helgatheviking。在这个阶段我没有考虑更多,因为我们已经走了另一条路。最终我想重新审视这个,一个插件会很棒。感谢您的回复。
  • 我可能会在有时间的时候继续修改它,但目前看来必须进行一些复杂的自定义查询。

标签: php wordpress woocommerce product


【解决方案1】:

将此代码粘贴到您的主题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
}

【讨论】:

  • 请简要说明您在代码中所做的特别之处?
  • 嗨@farhana 这是用于在存档产品循环中获取属性值的钩子。这段代码工作正常。钩子是预定义的docs.woocommerce.com/wc-apidocs/hook-docs.html
  • 为我工作,谢谢@RohitKaushik
【解决方案2】:
$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/

【讨论】:

  • 未找到解决方案。由于客户对当前的实施感到满意,因此我没有理会它。感谢您的 cmets 和建议。
  • 嘿,刚刚发现你的修改。如果您还在 - 请您更改链接到此处:iconicwp.com/products/woocommerce-show-single-variations CodeCanyon 上不再提供 :)
【解决方案3】:

add_action('woocommerce_before_shop_loop', 'handsome_bearded_guy_select_variations');

功能 nice_bearded_guy_select_variations() { remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10); add_action('woocommerce_after_shop_loop_item','woocommerce_template_single_add_to_cart',30); }

将此添加到您的functions.php文件中,您就完成了

【讨论】:

    猜你喜欢
    • 2019-08-26
    • 2020-11-26
    • 2014-05-27
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多