Ocultar capa de seleccionar recogida si en el carrito no hay un producto de reserva, y eliminar productos que no sean de reserva

El plugin de Woocommerce orders muestra siempre el selector de recogida o envío, solo nos interesa cuando son productos de reserva. Además permite añadir productos que no son de reserva, por lo que tenemos que eliminarlos.

Añadimos este código al function.php del tema hijo.

//Quitar elegir fecha recogida si no hay productos de reserva

function reserva(){
    //Recuperamos los productos del carrito, si hay uno con categoría Reserva rellenamos variable reservado
    $reservado = null;
    $prodreserva = null;
    $productosnormales = array();
    $reservaCat = 135;
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $terms = get_the_terms ( $cart_item['product_id'], 'product_cat' );
        foreach ( $terms as $term ) { 
            $cat_id = $term->term_id;
            if($cat_id == $reservaCat){
                $reservado = 1;
                $prodreserva = 1;
                break;
            }else{
                $prodreserva = 0;
            }
        }
        //Guardamos en array todos los productos que no sean de categoría reserva
        if($prodreserva != 1){
            $productosnormales[] = $cart_item['product_id'];
        }
    }
    //Eliminamos del carrito los productos que no sean de reserva, cuando si que existe al menos uno con reserva
    if($reservado == 1){
        foreach ($productosnormales as $producto){
            foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
                if ( $cart_item['product_id'] == $producto ) {
                    WC()->cart->remove_cart_item( $cart_item_key );
               }
            }
            echo '<p class="mensaje_borrar_producto">No se pueden combinar productos reservables con no reservables. Se ha eliminado el producto <strong>'.$product->get_name().'</strong> de tu carrito.</p>';
        }
    }
    //Construimos la caja con clase, para poder ocultar con css
    function divAbrir(){
        echo '<style>';
        echo '.producto_reservado #wc-od{ display:none; }';
        echo '</style>';
        echo '<div class="producto_reservado">';
    }

    function divCerrar(){
        echo '</div>';
    }

    function divAbrirNo(){
        echo '<style>';
        echo '.producto_no_reservado{ display:none; }';
        echo '</style>';
        echo '<div class="producto_no_reservado">';
    }

    if($reservado != 1){
        //Si no hay producto de reserva, ocultamos la caja de seleccionar fecha de reserva
        add_action('woocommerce_checkout_before_customer_details', 'divAbrir');
        add_action('woocommerce_checkout_after_customer_details', 'divCerrar');
    }else{
        //Si hay un producto de reserva, ocultamos la caja por defecto de elegir hora para recoger
        add_action('woocommerce_before_order_notes', 'divAbrirNo');
        add_action('woocommerce_after_order_notes', 'divCerrar');
    }
}

add_action('woocommerce_before_checkout_form','reserva');

//Si no hay producto de reserva hacemos el campo no requerido
function norequerido($fields){
    $reservado = null;
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $reservaCat = 135;
        $terms = get_the_terms ( $cart_item['product_id'], 'product_cat' );
        foreach ( $terms as $term ) { 
            $cat_id = $term->term_id;
            if($cat_id == $reservaCat){
                $reservado = 1;
                break;
            }
        }
    }
    if($reservado != 1){
        unset($fields['delivery']['delivery_date']);
        unset($fields['delivery']['delivery_time_frame']);
        unset($fields['delivery_date_field']);
    }
    return $fields;
}
add_action( 'woocommerce_checkout_fields', 'norequerido');