It seems that the grouped.php template also prints products with status on concept. I don't know if this is normal behaviour, but that seems very strange. It only should print the products that are set to Published.
I've duplicated the original Woocommerce file and copied it in my template:
yourtheme/woocommerce/single-product/add-to-cart/grouped.php
This is the source code of the grouped.php template:
<?php
/**
* Grouped product add to cart
*/
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'>
<div class="tickets-wrapper__tickets">
<?php
$quantites_required = false;
$previous_post = $post;
$grouped_product_columns = apply_filters(
'woocommerce_grouped_product_columns',
array(
'quantity',
'label',
'price',
),
$product
);
do_action( 'woocommerce_grouped_product_list_before', $grouped_product_columns, $quantites_required, $product );
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; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
setup_postdata( $post );
echo '<div id="product-' . esc_attr( $grouped_product_child->get_id() ) . '" class="tickets-wrapper__tickets__block woocommerce-grouped-product-list-item ' . esc_attr( implode( ' ', wc_get_product_class( '', $grouped_product_child ) ) ) . '">';
// Output columns for each product.
foreach ( $grouped_product_columns as $column_id ) {
do_action( 'woocommerce_grouped_product_list_before_' . $column_id, $grouped_product_child );
switch ( $column_id ) {
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() ] ) ) ) : '', // phpcs:ignore WordPress.Security.NonceVerification.Missing
'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 ),
'placeholder' => '0',
)
);
do_action( 'woocommerce_after_add_to_cart_quantity' );
}
$value = ob_get_clean();
echo "<div class='selectNumber'>";
echo "<span class='selectNumber__increase selectNumber__change' data-target='". esc_attr( $grouped_product_child->get_id() ) ."'>+</span>";
echo "<input disabled value='0' type='text' id='selectNumber-". esc_attr( $grouped_product_child->get_id() ) ."' />";
echo "<span class='selectNumber__decrease selectNumber__change' data-target='". esc_attr( $grouped_product_child->get_id() ) ."'>-</span>";
echo "</div>";
break;
case 'label':
$value = '<label 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 .= '</label>';
break;
case 'price':
$value = $grouped_product_child->get_price_html() . wc_get_stock_html( $grouped_product_child );
break;
default:
$value = '';
break;
}
echo '<div class="woocommerce-grouped-product-list-item__' . esc_attr( $column_id ) . '">' . apply_filters( 'woocommerce_grouped_product_list_column_' . $column_id, $value, $grouped_product_child ) . '</div>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
do_action( 'woocommerce_grouped_product_list_after_' . $column_id, $grouped_product_child );
}
echo '</div>'; // woocommerce-grouped-product-list-item
}
$post = $previous_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
setup_postdata( $post );
do_action( 'woocommerce_grouped_product_list_after', $grouped_product_columns, $quantites_required, $product );
?>
</div> <!-- tickets-wrapper__tickets -->
<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' ); ?>
<div class="text--right margin-top-1 top-block top-block--small">
<button type="submit" class="single_add_to_cart_button button button--primary"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button>
</div>
<?php do_action( 'woocommerce_after_add_to_cart_button' ); ?>
<?php endif; ?>
</form>
<?php do_action( 'woocommerce_after_add_to_cart_form' ); ?>
When I check the output of on child product, I see that the product status is also printed as a class:
<div id="product-63105" class="tickets-wrapper__tickets__block woocommerce-grouped-product-list-item product type-product post-63105 status-draft instock product_cat-geen-onderdeel-van-een-categorie virtual taxable purchasable product-type-enviso_ticket">
</div>
I can add some CSS to hide everything with class status-draft
, but I just don't want that HTML on my page. So status = draft or concept should be excluded from that query.