简体   繁体   中英

How to remove the quantity field from cart page for specific product attribute WooCommerce

I need to hide the "quantity" field for specific product in cart.php Here Is my cart.php . WHere the attribute is Color the quantity field should hide. I have try $attributes = $product->get_attributes(); but I failed or I was missing something . I have share the cart Image and my cart.php code. Please someone help me.

在此输入图像描述

<?php
if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

wc_print_notices();
do_action( 'woocommerce_before_cart' ); ?>

<form id="cart-table" action="<?php echo esc_url(  WC()->cart->get_cart_url() ); ?>" method="post">
<?php do_action( 'woocommerce_before_cart_table' ); ?>
<table class="shop_table cart" cellspacing="0">
    <thead>
        <tr>
            <th class="product-remove">&nbsp;</th>
            <th class="product-thumbnail">&nbsp;</th>
            <th class="product-name"><?php _e('Product', 'yit'); ?></th>
            <th class="product-price"><?php _e('Price', 'yit'); ?></th>
            <th class="product-quantity"><?php _e('Quantity', 'yit'); ?></th>
            <th class="product-subtotal"><?php _e('Total', 'yit'); ?></th>
        </tr>
    </thead>
    <tbody>
        <?php do_action( 'woocommerce_before_cart_contents' ); ?>

        <?php
                 foreach (  WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
                $_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
                $product_id   = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );

                if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_cart_item_visible', true, $cart_item, $cart_item_key ) ) {
                    ?>
                    <tr class = "<?php echo esc_attr( apply_filters('woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key ) ); ?>">
                        <td class="product-remove">
                            <?php
                                echo apply_filters( 'woocommerce_cart_item_remove_link', sprintf('<a href="%s" class="remove" title="%s">&times;</a>', esc_url(  WC()->cart->get_remove_url( $cart_item_key ) ), __('Remove this item', 'yit') ), $cart_item_key );
                            ?>
                        </td>

                        <td class="product-thumbnail">
                            <?php
                            $thumbnail = apply_filters( 'woocommerce_cart_item_thumbnail', $_product->get_image(), $cart_item, $cart_item_key );
                            if ( ! $_product->is_visible() )
                                echo $thumbnail;
                            else
                                printf( '<a href="%s">%s</a>', $_product->get_permalink( $cart_item ), $thumbnail );
                            ?>
                        </td>

                        <td class="product-name">
                            <?php
                            if ( ! $_product->is_visible() )
                                echo apply_filters( 'woocommerce_cart_item_name', $_product->get_title(), $cart_item, $cart_item_key );
                            else
                                echo apply_filters( 'woocommerce_cart_item_name', sprintf( '<a href="%s">%s</a>', $_product->get_permalink( $cart_item ), $_product->get_title() ), $cart_item, $cart_item_key );
                                // Meta data  Remove 'lala' from echo here by Rupom
                                echo  ''. WC()->cart->get_item_data( $cart_item );
                                // Backorder notification
                                if ( $_product->backorders_require_notification() && $_product->is_on_backorder( $cart_item['quantity'] ) )
                                    echo '<p class="backorder_notification">' . __('Available on backorder', 'yit') . '</p>';
                            ?>
                        </td>

                        <td class="product-price">
                            <?php
                                echo apply_filters( 'woocommerce_cart_item_price', WC()->cart->get_product_price( $_product ), $cart_item, $cart_item_key );
                            ?>
                        </td>

        <td class="product-quantity">
            <?php
            if ( $_product->is_sold_individually() ) {
                $product_quantity = sprintf( '1 <input type="hidden" name="cart[%s][qty]" value="1" />', $cart_item_key );

            }else { 
              $product_quantity = woocommerce_quantity_input( array(
                    'input_name'  => "cart[{$cart_item_key}][qty]",
                    'input_value' => $cart_item['quantity'],
                    'max_value'   => $_product->backorders_allowed() ? '' : $_product->get_stock_quantity(),
                    'min_value'   => '0'
                ), $_product, false );
            }
            echo apply_filters( 'woocommerce_cart_item_quantity', $product_quantity, $cart_item_key );
            ?>
        </td>
                        <td class="product-subtotal">
                            <?php
                                echo apply_filters( 'woocommerce_cart_item_subtotal', WC()->cart->get_product_subtotal( $_product, $cart_item['quantity'] ), $cart_item, $cart_item_key );
                            ?>
                        </td>
                    </tr>
                    <?php
                }
            }
        do_action( 'woocommerce_cart_contents' );
        ?>
        <tr>
            <td colspan="6" class="actions">
                <?php if ( WC()->cart->coupons_enabled() ) { ?>
                    <div class="coupon">
                        <label for="coupon_code"><?php _e('Coupon', 'yit'); ?>:</label> <input name="coupon_code" class="input-text" id="coupon_code" value="" /> <input type="submit" class="button" name="apply_coupon" value="<?php _e('Apply Coupon', 'yit'); ?>" />
                        <?php do_action('woocommerce_cart_coupon'); ?>
                    </div>
                <?php } ?>
                <input type="submit" class="button" name="update_cart" value="<?php _e('Update Cart', 'yit'); ?>" /> <input type="submit" class="checkout-button button alt" name="proceed" value="<?php _e('Proceed to Checkout &rarr;', 'yit'); ?>" />
                    <?php do_action('woocommerce_cart_actions'); ?>
                <?php wp_nonce_field( 'woocommerce-cart') ?>
            </td>
        </tr>
        <?php do_action( 'woocommerce_after_cart_contents' ); ?>
    </tbody>
</table>
<?php do_action( 'woocommerce_after_cart_table' ); ?>
</form>
<div class="cart-collaterals row-fluid">
    <?php do_action('woocommerce_cart_collaterals'); ?>
    <?php //woocommerce_cart_totals(); ?>
    <?php woocommerce_shipping_calculator(); ?>
</div>

<?php do_action( 'woocommerce_after_cart' ); ?>

Here is the Quantity Field Code

<td class="product-quantity">
            <?php
            if ( $_product->is_sold_individually() ) {
                $product_quantity = sprintf( '1 <input type="hidden" name="cart[%s][qty]" value="1" />', $cart_item_key );

            }else { 
              $product_quantity = woocommerce_quantity_input( array(
                    'input_name'  => "cart[{$cart_item_key}][qty]",
                    'input_value' => $cart_item['quantity'],
                    'max_value'   => $_product->backorders_allowed() ? '' : $_product->get_stock_quantity(),
                    'min_value'   => '0'
                ), $_product, false );
            }
            echo apply_filters( 'woocommerce_cart_item_quantity', $product_quantity, $cart_item_key );
            ?>
        </td>

$attributes = $product->get_attributes(); only returns an array of the product's attributes, so you would at least need some kind of conditional logic as returning the attributes alone would not be enough.

If you notice this line:

echo apply_filters( 'woocommerce_cart_item_quantity', $product_quantity, $cart_item_key );

You don't need to override the cart.php template at all. You can simply filter the quantity string from your theme's function.php.

Additionally, an attribute is just a taxonomy with pa_ prepended to the slug so you can use any of WordPress' core functions on it. For example: a 'color' attribute is simply a 'pa_color' taxonomy and you can check for the existence of a term on a post (a product is just a post of a specific type) using has_term()

Untested, but I think this should work:

add_filter( 'woocommerce_cart_item_quantity', 'so_30926084_cart_item_quantity', 10, 2 );
function so_30926084_cart_item_quantity( $product_quantity, $cart_item_key ){
    $cart_item = WC()->cart->cart_contents[ $cart_item_key ];
    if( has_term( 'blue', 'pa_color', $cart_item['data'] ) ){
        $product_quantity = '';
    }
    return $product_quantity;
}

Edit

Assuming your attribute is called Color and assuming that it is a taxonomy (As I am discovering this is no longer always the case) you could use the following (be sure to delete the above first) to remove the quantity from any variation with a color attribute.

add_filter( 'woocommerce_cart_item_quantity', 'so_30926084_cart_item_quantity', 10, 2 );
function so_30926084_cart_item_quantity( $product_quantity, $cart_item_key ){
    $cart_item = WC()->cart->cart_contents[ $cart_item_key ];
    if( $cart_item['data']->is_type( 'variation' ) ){
        $attributes = $cart_item['data']->get_attributes();
        // var_dump( $attributes );
        if( array_key_exists( 'pa_color', $attributes ) ){
            $product_quantity = '';
        }
    }
    return $product_quantity;
}

If this is the incorrect array key, you can uncomment the var_dump() line to examine the $attributes (put a variation in the cart and go to the cart page) and determine the correct array key information.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM