SEO & Schema Markup

SEO and Schema Markup

Built-in SEO features and structured data (JSON-LD schema) for better search engine visibility.

Schema Markup Overview

WP Sell Services automatically generates JSON-LD structured data for all marketplace pages. This helps search engines understand your content and display rich results.

What is Schema Markup?

Schema markup is code that tells search engines what your content means, not just what it says. This can result in:

  • Rich snippets in Google search results
  • Star ratings displayed in SERPs
  • Price information visible
  • Better click-through rates
  • Enhanced visibility

Service Schema (Combined Type)

Services use a combined schema with both Service and Product types for maximum compatibility.

Schema Structure

{
  "@context": "https://schema.org",
  "@type": ["Service", "Product"],
  "@id": "https://example.com/services/logo-design/#service",
  "name": "Professional Logo Design",
  "description": "Custom logo design for your business...",
  "url": "https://example.com/services/logo-design/",
  "image": "https://example.com/uploads/logo-design.jpg",
  "category": "Graphic Design",
  "provider": {
    "@type": "Person",
    "@id": "https://example.com/author/jane-designer/#person",
    "name": "Jane Designer"
  },
  "brand": {
    "@type": "Brand",
    "name": "Jane Designer"
  },
  "offers": {
    "@type": "Offer",
    "price": "150.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "priceValidUntil": "2027-02-12",
    "url": "https://example.com/services/logo-design/",
    "seller": {
      "@type": "Person",
      "name": "Jane Designer"
    }
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": 4.8,
    "bestRating": 5,
    "worstRating": 1,
    "ratingCount": 47,
    "reviewCount": 47
  },
  "serviceType": "Graphic Design",
  "termsOfService": "Delivery within 3 days",
  "areaServed": {
    "@type": "Place",
    "name": "Worldwide"
  }
}

Key Properties

PropertySourceDescription
@typeHardcoded["Service", "Product"] array
namePost titleService name
descriptionPost excerpt/contentBrief description (50 words)
imageFeatured imageService thumbnail
categoryFirst categoryService category name
providerAuthorVendor as Person schema
offers.pricewpssstarting_price metaStarting price
aggregateRating.ratingValuewpssrating_average metaAverage rating
aggregateRating.reviewCountwpssreview_count metaNumber of reviews
termsOfServicewpssfastest_delivery metaDelivery time

When It Appears

  • Single service pages (issingular('wpssservice'))
  • Automatically output in via wp_head action
  • Filter: wpssserviceschema to modify

Person Schema (Vendors)

Vendor profiles use the Person schema type.

Schema Structure

{
  "@type": "Person",
  "@id": "https://example.com/author/jane-designer/#person",
  "name": "Jane Designer",
  "url": "https://example.com/author/jane-designer/",
  "image": "https://example.com/avatar/jane.jpg",
  "jobTitle": "Graphic Designer",
  "description": "Professional designer with 10 years experience...",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": 4.7,
    "bestRating": 5,
    "ratingCount": 89
  }
}

Key Properties

PropertySourceDescription
namedisplay_nameVendor display name
urlAuthor URLVendor profile link
imageGravatarVendor avatar (256px)
jobTitlewpssvendortitle metaVendor title/tagline
descriptionUser bioVendor description (50 words)
aggregateRating.ratingValuewpssvendorrating metaAverage vendor rating
aggregateRating.ratingCountwpssvendorreview_count metaTotal reviews

When It Appears

  • Vendor profile pages (when wpss_vendor query var exists)
  • Service pages (as the provider property)
  • Filter: wpsspersonschema to modify

Note: Person schema does NOT include AggregateOffer with price ranges. Only individual service offers include pricing.


Organization Schema

Homepage organization information.

Schema Structure

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://example.com/#organization",
  "name": "Creative Marketplace",
  "url": "https://example.com/",
  "description": "Find professional services for your business",
  "logo": "https://example.com/logo.png"
}

Key Properties

PropertySourceDescription
nameget_bloginfo('name')Site name
urlHome URLSite homepage
descriptionget_bloginfo('description')Site tagline
logoCustom logoTheme logo (if set)

When It Appears

  • Homepage only (isfrontpage())
  • Filter: wpssorganizationschema to modify

BreadcrumbList Schema

Breadcrumb navigation for services and categories.

Schema Structure

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://example.com/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Services",
      "item": "https://example.com/services/"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Graphic Design",
      "item": "https://example.com/service-category/graphic-design/"
    },
    {
      "@type": "ListItem",
      "position": 4,
      "name": "Logo Design",
      "item": "https://example.com/services/logo-design/"
    }
  ]
}

When It Appears

  • Single service pages (issingular('wpssservice'))
  • Category archive pages (istax('wpssservice_category'))
  • Includes parent categories if hierarchical

CollectionPage Schema (Category Archives)

Category pages use CollectionPage with nested ItemList.

Schema Structure

{
  "@context": "https://schema.org",
  "@type": "CollectionPage",
  "@id": "https://example.com/service-category/logo-design/#webpage",
  "name": "Logo Design",
  "description": "Browse logo design services",
  "url": "https://example.com/service-category/logo-design/",
  "mainEntity": {
    "@type": "ItemList",
    "itemListElement": [
      {
        "@type": "ListItem",
        "position": 1,
        "item": {
          "@type": "Service",
          "name": "Professional Logo Design",
          "url": "https://example.com/services/logo-design/"
        }
      }
    ]
  }
}

Key Properties

PropertySourceDescription
nameTerm nameCategory name
descriptionTerm descriptionCategory description (or generated)
mainEntityFirst 10 servicesItemList of services in category

When It Appears

  • Category archive pages (istax('wpssservice_category'))
  • Filter: wpsscategoryschema to modify

ItemList Schema (Service Archives)

Service archive pages list all services.

Schema Structure

{
  "@context": "https://schema.org",
  "@type": "ItemList",
  "name": "Services",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "item": {
        "@type": "Service",
        "@id": "https://example.com/services/logo-design/#service",
        "name": "Logo Design",
        "url": "https://example.com/services/logo-design/"
      }
    },
    {
      "@type": "ListItem",
      "position": 2,
      "item": {
        "@type": "Service",
        "@id": "https://example.com/services/web-design/#service",
        "name": "Web Design",
        "url": "https://example.com/services/web-design/"
      }
    }
  ]
}

When It Appears

  • Service archive pages (isposttypearchive('wpssservice'))
  • Lists all services in current query
  • Filter: wpssservicelist_schema to modify

Review Schema (Not Currently Output)

The getreviewsschema() method exists in SchemaMarkup.php but is never called or output.

Schema Structure (if it were used)

{
  "@context": "https://schema.org",
  "@type": "Product",
  "review": [
    {
      "@type": "Review",
      "author": {
        "@type": "Person",
        "name": "John Smith"
      },
      "datePublished": "2026-01-15T00:00:00Z",
      "reviewBody": "Excellent work!",
      "reviewRating": {
        "@type": "Rating",
        "ratingValue": 5,
        "bestRating": 5,
        "worstRating": 1
      }
    }
  ]
}

To Enable Review Schema

You would need to hook into service schema and call the method:

add_filter( 'wpss_service_schema', function( $schema, $service_id ) {
    $seo = new \WPSellServices\SEO\SchemaMarkup();
    $review_schema = $seo->get_reviews_schema( $service_id );

    if ( $review_schema && isset( $review_schema['review'] ) ) {
        $schema['review'] = $review_schema['review'];
    }

    return $schema;
}, 10, 2 );

FAQ Schema

FAQ schema can be generated from service FAQs custom field.

Schema Structure

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How long does delivery take?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Standard delivery is 3 business days."
      }
    }
  ]
}

When It Appears

  • Not automatically output (method exists but not hooked)
  • Requires wpssfaqs custom field with array of questions/answers
  • Method: getfaqschema() in SchemaMarkup.php

Open Graph Meta Tags

Social media sharing tags for services.

Meta Tags Output

<meta property="og:type" content="product" />
<meta property="og:title" content="Professional Logo Design" />
<meta property="og:description" content="Custom logo design from $150" />
<meta property="og:url" content="https://example.com/services/logo-design/" />
<meta property="og:image" content="https://example.com/logo-design.jpg" />
<meta property="og:site_name" content="Creative Marketplace" />
<meta property="product:price:amount" content="150.00" />
<meta property="product:price:currency" content="USD" />

Twitter Card Tags

<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Professional Logo Design" />
<meta name="twitter:description" content="Custom logo design from $150" />
<meta name="twitter:image" content="https://example.com/logo-design.jpg" />

When They Appear

  • Single service pages only (issingular('wpssservice'))
  • Only if no SEO plugin active (Yoast, Rank Math, AIOSEO)
  • Filter: wpssopengraph_data to modify

SEO Plugin Integration

WP Sell Services detects and respects popular SEO plugins.

Yoast SEO Integration

Features:

  • Service pages in Yoast metabox
  • Focus keyphrase analysis
  • Schema output handled by Yoast (if Yoast schema is enabled)
  • Sitemap integration

Configuration:

  1. Go to SEO → Search Appearance → Content Types
  2. Find Services section
  3. Enable “Show Services in search results”
  4. Configure title/description templates

Custom Variables: Service-specific variables can be added via wpseo_replacements filter.

Rank Math Integration

Features:

  • Service SEO score analysis
  • Schema builder integration
  • Keyword tracking
  • Sitemap integration

Configuration:

  1. Go to Rank Math → Titles & Meta → Services
  2. Configure title/description templates
  3. Enable schema markup
  4. Select schema type (Service or Product)

Disabling Built-In SEO

If you have an SEO plugin active, WP Sell Services automatically disables:

  • Meta description tags
  • Open Graph tags
  • Twitter Card tags
  • Title modifications (except archive pages)

Schema markup remains enabled unless disabled by filters.


Meta Tags and Robots

Meta Description

Generated from service excerpt or content (25 words).

Output:

<meta name="description" content="Custom logo design for your business..." />

Only output if:

  • No SEO plugin active
  • Single service page
  • Service is published

Robots Meta

Controls search engine indexing.

Published Active Services:

<meta name="robots" content="index,follow" />

Draft/Pending Services:

<meta name="robots" content="noindex,nofollow" />

Paused Services:

<meta name="robots" content="noindex,follow" />

Canonical URLs

Clean canonical URLs for services.

Implementation

Query parameters are removed from canonical URLs:

// Clean canonical (no query strings)
https://example.com/services/logo-design/

Filter: getcanonicalurl is used to clean service URLs.


XML Sitemap

Services automatically included in WordPress core sitemap.

Sitemap Configuration

URL:

https://example.com/wp-sitemap-wpss_service-1.xml

Query Modifications:

  • Only includes published services
  • Only includes active services (not paused)
  • Excludes services without wpssservice_status meta (defaults to active)

Filter: wpsssitemappost_types to control inclusion.


Customizing Schema

Filter Service Schema

add_filter( 'wpss_service_schema', function( $schema, $service_id ) {
    // Add custom property
    $schema['customProperty'] = 'Custom Value';

    // Modify existing property
    $schema['offers']['price'] = '200.00';

    return $schema;
}, 10, 2 );

Filter Person Schema

add_filter( 'wpss_person_schema', function( $schema, $user_id ) {
    // Add social profiles
    $schema['sameAs'] = [
        'https://twitter.com/username',
        'https://linkedin.com/in/username'
    ];

    return $schema;
}, 10, 2 );

Filter Organization Schema

add_filter( 'wpss_organization_schema', function( $schema ) {
    // Add contact information
    $schema['contactPoint'] = [
        '@type' => 'ContactPoint',
        'telephone' => '+1-555-123-4567',
        'contactType' => 'customer service'
    ];

    return $schema;
} );

Disable Schema Output

// Disable all schema
remove_action( 'wp_head', [ $schema_instance, 'output_schema' ], 10 );

// Or use filter
add_filter( 'wpss_service_schema', '__return_false' );

Testing Schema Markup

Google Rich Results Test

  1. Go to https://search.google.com/test/rich-results
  2. Enter service URL
  3. Verify schema is detected
  4. Fix any errors reported

Schema.org Validator

  1. Go to https://validator.schema.org/
  2. Paste service URL
  3. Check for warnings/errors
  4. Verify all properties display correctly

Browser Extension

Install Schema Markup Validator extension to see schema on any page.


Related Documentation


Next Steps

  1. Verify schema output on service pages
  2. Test with Google Rich Results Test
  3. Configure SEO plugin templates (if using)
  4. Monitor search performance in Google Search Console
  5. Add FAQs to services for FAQ schema
Last updated: February 14, 2026