diff --git a/hub/services/templatetags/json_ld_tags.py b/hub/services/templatetags/json_ld_tags.py index c9225d5..d215703 100644 --- a/hub/services/templatetags/json_ld_tags.py +++ b/hub/services/templatetags/json_ld_tags.py @@ -109,26 +109,34 @@ def json_ld_structured_data(context): service = context["service"] service_url = request.build_absolute_uri() - data = { - "@context": "https://schema.org", - "@type": "Product", - "name": service.name, - "description": service.description, - "url": service_url, - "category": "Cloud Service", - } + # Check if service has offerings with pricing + has_offerings = hasattr(service, "offerings") and service.offerings.exists() - # Add image if available - if hasattr(service, "get_logo") and service.get_logo: - data["image"] = request.build_absolute_uri(service.get_logo.url) + if has_offerings: + # Use Product type when we have offerings (which provide the required offers data) + data = { + "@context": "https://schema.org", + "@type": "Product", + "name": service.name, + "description": service.description, + "url": service_url, + "category": "Cloud Service", + } - # Add offerings if available - if hasattr(service, "offerings") and service.offerings.exists(): + # Add image if available + if hasattr(service, "get_logo") and service.get_logo: + data["image"] = request.build_absolute_uri(service.get_logo.url) + + # Add offerings data["offers"] = { "@type": "AggregateOffer", "availability": "https://schema.org/InStock", "offerCount": service.offerings.count(), } + else: + # Use Organization data when no offerings are available + # This avoids Google Search Console errors for Product without required fields + data = organization_data elif view_name == "provider_detail" and "provider" in context: provider = context["provider"]