0
votes

Grouped.php in woocommerce creates a table and then a foreach loop runs through each product to fill out the table with the products. (code included below)

I would like to add a filter to the grouped.php file (below) to only show products with a custom attribute of [contract-type="PAYM"] so only products with this attribute are displayed in the table when the page loads - I do not want the user to have control over this so there is no need to add filtering options on the client side.

Any information would be greatly appreciated on how I can make this loop execute only for certain products containing this attribute.

I was thinking a simple if statement would do it but I do not know the handles woocommerce uses to identify attributes.

Here is the code in the grouped.php file..

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

                if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) && ! $product->is_in_stock() ) {
                    continue;
                }

                $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', 'min_value' => apply_filters( 'woocommerce_quantity_input_min', 0, $product ), 'max_value' => apply_filters( 'woocommerce_quantity_input_max', $product->backorders_allowed() ? '' : $product->get_stock_quantity(), $product ) ) );
                            ?>
                        <?php endif; ?>
                    </td>

                    <td class="label">
                        <label for="product-<?php echo $product_id; ?>">
                            <?php echo $product->is_visible() ? '<a href="' . esc_url( apply_filters( 'woocommerce_grouped_product_list_link', get_permalink(), $product_id ) ) . '">' . esc_html( get_the_title() ) . '</a>' : esc_html( 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; ?>
</form>

<?php do_action( 'woocommerce_after_add_to_cart_form' ); ?>
1

1 Answers

0
votes

Once $product is defined, you can grab a single custom product attribute with

$product->get_attribute('attribute').

In your example, adding a simple if statement should work:

foreach ( $grouped_products as $product_id ) :
    $product = wc_get_product( $product_id );

    if ($product->get_attribute( 'contract-type' ) !== 'PAYM') {
        continue;
    }