Woocommerce Grouped Product Table to Dropdown

How do you put grouped product form/table into a dropdown menu in Woocommerce? Some of my products have more than 10 “child products”. So the list can be very extensive. Maybe have one quantity box and add to cart with just the dropdown of the different options? Currently I don’t see if it is possible to select a child product hand have the product image change.

The following is the Grouped.php file for woo commerce:

Read More
<?php
/**
* Grouped product add to cart
*
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     2.1.7
 */

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

global $product, $post;

$parent_product_post = $post;

do_action( 'woocommerce_before_add_to_cart_form' ); ?>

<form class="cart" method="post" enctype='multipart/form-data'>
<table cellspacing="0" class="group_table">
    <tbody>
        <?php
            foreach ( $grouped_products as $product_id ) :
                $product = wc_get_product( $product_id );
                $post    = $product->post;
                setup_postdata( $post );
                ?>
                <tr>
                    <td>
                        <?php if ( $product->is_sold_individually() || ! $product->is_purchasable() ) : ?>
                            <?php woocommerce_template_loop_add_to_cart(); ?>
                        <?php else : ?>
                            <?php
                                $quantites_required = true;
                                woocommerce_quantity_input( array( 'input_name' => 'quantity[' . $product_id . ']', 'input_value' => '0' ) );
                            ?>
                        <?php endif; ?>
                    </td>

                    <td class="label">
                        <label for="product-<?php echo $product_id; ?>">
                            <?php echo $product->is_visible() ? '<a href="' . get_permalink() . '">' . get_the_title() . '</a>' : get_the_title(); ?>
                        </label>
                    </td>

                    <?php do_action ( 'woocommerce_grouped_product_list_before_price', $product ); ?>

                    <td class="price">
                        <?php
                            echo $product->get_price_html();

                            if ( $availability = $product->get_availability() ) {
                                $availability_html = empty( $availability['availability'] ) ? '' : '<p class="stock ' . esc_attr( $availability['class'] ) . '">' . esc_html( $availability['availability'] ) . '</p>';
                                echo apply_filters( 'woocommerce_stock_html', $availability_html, $availability['availability'], $product );
                            }
                        ?>
                    </td>
                </tr>
                <?php
            endforeach;

            // Reset to parent grouped product
            $post    = $parent_product_post;
            $product = wc_get_product( $parent_product_post->ID );
            setup_postdata( $parent_product_post );
        ?>
    </tbody>
</table>

<input type="hidden" name="add-to-cart" value="<?php echo esc_attr( $product->id ); ?>" />

<?php if ( $quantites_required ) : ?>

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

    <button type="submit" class="single_add_to_cart_button button alt"><?php echo $product->single_add_to_cart_text(); ?></button>

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

<?php endif; ?>

Related posts

Leave a Reply

2 comments

  1. I came across this question while searching for an answer to the same issue. I have multiple subscription products that the user will need a way to upgrade them. When presented with the woocommerce grouped product page it was ugly as crap. I removed the switch from the inner loop on the page. Replaced it with an if statement for the quantity value of $column_id. I then got creative in solving the issue of having the correct form elements needed to actually add the items to the cart. I placed another hidden input, using jQuery I then filled out the hidden input with the correct name of the product that is selected in the dropdown. Bam all worked out, apply custom styles and fill with whatever products you want.

    <?php
        /**
         * Grouped product add to cart
         *
         * This template can be overridden by copying it to yourtheme/woocommerce/single-product/add-to-cart/grouped.php.
         *
         * HOWEVER, on occasion WooCommerce will need to update template files and you
         * (the theme developer) will need to copy the new files to your theme to
         * maintain compatibility. We try to do this as little as possible, but it does
         * happen. When this occurs the version of the template file will be bumped and
         * the readme will list any important changes.
         *
         * @see         https://docs.woocommerce.com/document/template-structure/
         * @package     WooCommerce/Templates
         * @version     3.4.0
         */
    
        defined( 'ABSPATH' ) || exit;
    
        global $product, $post;
    
        do_action( 'woocommerce_before_add_to_cart_form' ); ?>
    
        <form class="cart grouped_form" action="<?php echo esc_url( apply_filters( 'woocommerce_add_to_cart_form_action', $product->get_permalink() ) ); ?>" method="post" enctype='multipart/form-data'>
    
    
            <?php
              $quantites_required      = false;
              $previous_post           = $post;
              $grouped_product_columns = apply_filters( 'woocommerce_grouped_product_columns', array(
                'quantity',
                'label',
                'price',
              ), $product );
              $options = '';
              foreach ( $grouped_products as $grouped_product_child ) {
                $post_object        = get_post( $grouped_product_child->get_id() );
                $quantites_required = $quantites_required || ( $grouped_product_child->is_purchasable() && ! $grouped_product_child->has_options() );
                $post               = $post_object; // WPCS: override ok.
                setup_postdata( $post );
    
                //echo '<div id="product-' . esc_attr( $grouped_product_child->get_id() ) . '" class="card woocommerce-grouped-product-list-item ' . esc_attr( implode( ' ', wc_get_product_class( '', $grouped_product_child->get_id() ) ) ) . '">';
    
                // Output columns for each product.
                foreach ( $grouped_product_columns as $column_id ) {
                  do_action( 'woocommerce_grouped_product_list_before_' . $column_id, $grouped_product_child );
                  if ($column_id === 'quantity'){
                    do_action( 'woocommerce_before_add_to_cart_quantity' );
                    $options .= '<option value="quantity[' . $grouped_product_child->get_id() . ']">' . $grouped_product_child->get_name() .$grouped_product_child->get_price_html(). '</option>';
                    do_action( 'woocommerce_after_add_to_cart_quantity' );
                  }
                  // switch ( $column_id ) {
    
                  //   case 'label':
                  //     $value  = '<div class="card-title" for="product-' . esc_attr( $grouped_product_child->get_id() ) . '">';
                  //     $value .= $grouped_product_child->is_visible() ? '<span>' . $grouped_product_child->get_name() . '</span>' : $grouped_product_child->get_name();
                  //     $value .= '</div>';
                  //     break;
                  //   case 'price':
                  //     $value = $grouped_product_child->get_price_html() . wc_get_stock_html( $grouped_product_child );
                  //     break;
                  //   case 'quantity':
                  //     ob_start();
    
                  //     if ( ! $grouped_product_child->is_purchasable() || $grouped_product_child->has_options() || ! $grouped_product_child->is_in_stock() ) {
                  //       woocommerce_template_loop_add_to_cart();
                  //     } elseif ( $grouped_product_child->is_sold_individually() ) {
                  //       echo '<input type="checkbox" name="' . esc_attr( 'quantity[' . $grouped_product_child->get_id() . ']' ) . '" value="1" class="wc-grouped-product-add-to-cart-checkbox" />';
                  //     } else {
                  //       do_action( 'woocommerce_before_add_to_cart_quantity' );
    
                  //       woocommerce_quantity_input( array(
                  //         'input_name'  => 'quantity[' . $grouped_product_child->get_id() . ']',
                  //         'input_value' => isset( $_POST['quantity'][ $grouped_product_child->get_id() ] ) ? wc_stock_amount( wc_clean( wp_unslash( $_POST['quantity'][ $grouped_product_child->get_id() ] ) ) ) : 0,
                  //         'min_value'   => apply_filters( 'woocommerce_quantity_input_min', 0, $grouped_product_child ),
                  //         'max_value'   => apply_filters( 'woocommerce_quantity_input_max', $grouped_product_child->get_max_purchase_quantity(), $grouped_product_child ),
                  //       ) );
    
                  //       do_action( 'woocommerce_after_add_to_cart_quantity' );
                  //     }
    
                  //     $value = ob_get_clean();
                  //     break;
                  //   default:
                  //     $value = '';
                  //     break;
                  // }
    
                  //echo '<div class="card-body woocommerce-grouped-product-list-item__' . esc_attr( $column_id ) . '">' . apply_filters( 'woocommerce_grouped_product_list_column_' . $column_id, $value, $grouped_product_child ) . '</div>'; // WPCS: XSS ok.
    
                  do_action( 'woocommerce_grouped_product_list_after_' . $column_id, $grouped_product_child );
                }
               // echo '</div>';
    
              }
              ?>
              <div class="row">
                <div class="col-6 mb-3">
                  <?php
                  echo '<select class="multi-prod form-control">'.$options.'</select>';
                  echo '<input type="hidden" class="input-text qty text" name="" value="">';
                  $post = $previous_post; // WPCS: override ok.
                  setup_postdata( $post );
                  ?>
                </div>
              </div>
    
          <input type="hidden" name="add-to-cart" value="<?php echo esc_attr( $product->get_id() ); ?>" />
    
          <?php if ( $quantites_required ) : ?>
    
            <?php do_action( 'woocommerce_before_add_to_cart_button' ); ?>
    
            <button type="submit" class="single_add_to_cart_button btn btn-success">Upgrade</button>
    
            <?php do_action( 'woocommerce_after_add_to_cart_button' ); ?>
    
          <?php endif; ?>
        </form>
    
        <?php do_action( 'woocommerce_after_add_to_cart_form' ); ?>
    

    Here is the jQuery in case you want to see how that works…..

    $('.multi-prod').change(function(e){
      $this = $(this)
      $('.qty').attr('name', $this.val())
    })
    
  2. Tesed this and looks like this is working. Thanks!

    $('.multi-prod').change(function(e){
          var  $this = $(this);
          $('.qty').attr('name', $this.val());
    });