Skip to main content

Schema Aggregator: Filters

The Schema Aggregator provides 18 WordPress filters that allow you to customize its behavior, from cache configuration to content enhancement. This document provides a complete reference with practical examples for each filter.

Quick Reference

FilterCategoryPurpose
wpseo_schema_aggregator_post_typesPost TypesControl which post types to aggregate
wpseo_schema_aggregator_per_pagePaginationSet default items per page (1000)
wpseo_schema_aggregator_per_page_bigPaginationSet items per page for big schema post types (100)
wpseo_schema_aggregator_big_schema_post_typesPaginationDefine which post types have large schema
wpseo_schema_aggregator_cache_enabledCacheEnable/disable caching
wpseo_schema_aggregator_cache_ttlCacheSet cache duration (dynamic by default)
wpseo_schema_aggregator_schemamap_changefreqSchema MapSet XML sitemap update frequency
wpseo_schema_aggregator_schemamap_prioritySchema MapSet XML sitemap priority
wpseo_schema_aggregator_filtering_strategyFilteringImplement custom filtering logic
wpseo_schema_aggregator_elements_context_mapContext MapOverride complete context map
wpseo_schema_aggregator_elements_context_map_{context}Context MapCustomize elements for specific context
wpseo_article_enhance_config_{key}Article EnhancementConfigure article enhancement settings
wpseo_article_enhance_{enhancement}Article EnhancementToggle specific article enhancements
wpseo_article_enhance_body_when_excerpt_existsArticle EnhancementInclude body when excerpt exists
wpseo_article_enhance_article_body_fallbackArticle EnhancementInclude body when no excerpt
wpseo_person_enhance_config_{key}Person EnhancementConfigure person enhancement settings
wpseo_person_enhance_{enhancement}Person EnhancementToggle specific person enhancements
wpseo_disable_robots_schemamapRobots.txtDisable schema map in robots.txt

Post Type Configuration

wpseo_schema_aggregator_post_types

Control which post types are included in the schema aggregation.

Parameters:

ParameterTypeDescription
$post_typesarrayArray of post type names to aggregate

Default Value: All public post types

Example: Include Only Specific Post Types

add_filter( 'wpseo_schema_aggregator_post_types', 'limit_aggregated_post_types' );

/**
* Limit schema aggregation to posts and pages only.
*
* This is useful when you have custom post types that don't need
* structured data or when you want to improve performance.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_post_types
*
* @param array $post_types Array of post type names.
*
* @return array Modified array of post type names.
*/
function limit_aggregated_post_types( $post_types ) {
// Only aggregate posts and pages.
return [ 'post', 'page' ];
}

Example: Exclude Specific Post Types

add_filter( 'wpseo_schema_aggregator_post_types', 'exclude_custom_post_types' );

/**
* Exclude internal post types from schema aggregation.
*
* Remove post types that are used for internal purposes and
* should not appear in structured data output.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_post_types
*
* @param array $post_types Array of post type names.
*
* @return array Modified array of post type names.
*/
function exclude_custom_post_types( $post_types ) {
// Remove internal post types.
$excluded = [ 'acf-field', 'acf-field-group', 'custom_css' ];

return array_diff( $post_types, $excluded );
}

Pagination Configuration

The Schema Aggregator uses different pagination limits based on the size of schema pieces. Some post types (like WooCommerce products) generate large schema objects and need smaller page sizes.

wpseo_schema_aggregator_per_page

Set the default number of items per page for schema aggregation.

Parameters:

ParameterTypeDescription
$per_pageintNumber of items per page

Default Value: 1000

Example:

add_filter( 'wpseo_schema_aggregator_per_page', 'custom_default_per_page' );

/**
* Reduce default items per page for better performance.
*
* Lower pagination can help with memory limits on shared hosting
* or when dealing with post types that have moderate schema sizes.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_per_page
*
* @param int $per_page Number of items per page.
*
* @return int Modified number of items per page.
*/
function custom_default_per_page( $per_page ) {
return 500; // Reduce from 1000 to 500.
}

wpseo_schema_aggregator_per_page_big

Set the number of items per page for post types with large schema pieces.

Parameters:

ParameterTypeDescription
$per_page_bigintNumber of items per page for big schema post types

Default Value: 100

Example:

add_filter( 'wpseo_schema_aggregator_per_page_big', 'custom_big_per_page' );

/**
* Adjust pagination for post types with large schema.
*
* Increase or decrease based on your server's memory limits
* and the actual size of your schema pieces.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_per_page_big
*
* @param int $per_page_big Number of items per page for big schema.
*
* @return int Modified number of items per page.
*/
function custom_big_per_page( $per_page_big ) {
return 50; // Reduce from 100 to 50 for very large schemas.
}

wpseo_schema_aggregator_big_schema_post_types

Define which post types should use the "big schema" pagination limit.

Parameters:

ParameterTypeDescription
$big_schema_post_typesarrayArray of post type names with large schema pieces

Default Value: [ 'product' ]

Example:

add_filter( 'wpseo_schema_aggregator_big_schema_post_types', 'add_big_schema_post_types' );

/**
* Mark custom post types as having large schema pieces.
*
* Post types with extensive custom fields, galleries, or complex
* relationships should use the lower pagination limit.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_big_schema_post_types
*
* @param array $big_schema_post_types Array of post type names.
*
* @return array Modified array of post type names.
*/
function add_big_schema_post_types( $big_schema_post_types ) {
// Add custom post types with large schemas.
$big_schema_post_types[] = 'property'; // Real estate listings.
$big_schema_post_types[] = 'event'; // Events with extensive details.

return $big_schema_post_types;
}

Cache Configuration

The Schema Aggregator implements intelligent caching to balance performance and freshness. Cache automatically clears when posts are updated.

wpseo_schema_aggregator_cache_enabled

Enable or disable the cache system entirely.

Parameters:

ParameterTypeDescription
$enabledboolWhether caching is enabled

Default Value: true

Example:

add_filter( 'wpseo_schema_aggregator_cache_enabled', 'disable_schema_cache_in_dev' );

/**
* Disable caching in development environment.
*
* This ensures you always see fresh data during development
* without needing to manually clear the cache.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_cache_enabled
*
* @param bool $enabled Whether caching is enabled.
*
* @return bool Modified cache enabled status.
*/
function disable_schema_cache_in_dev( $enabled ) {
// Disable cache in local/staging environments.
if ( defined( 'WP_ENV' ) && in_array( WP_ENV, [ 'development', 'staging' ], true ) ) {
return false;
}

return $enabled;
}

wpseo_schema_aggregator_cache_ttl

Set the cache time-to-live (TTL) in seconds.

Parameters:

ParameterTypeDescription
$ttlintCache duration in seconds
$post_typestringThe post type being cached
$post_countintNumber of posts for this post type

Default Value: Dynamic based on site size:

  • Small sites (< 100 posts): 86400 seconds (24 hours)
  • Medium sites (100-1000 posts): 43200 seconds (12 hours)
  • Large sites (> 1000 posts): 21600 seconds (6 hours)

Example: Fixed TTL

add_filter( 'wpseo_schema_aggregator_cache_ttl', 'custom_cache_ttl' );

/**
* Set a fixed cache duration for all post types.
*
* Use this when you want consistent cache behavior regardless
* of site size or post type.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_cache_ttl
*
* @param int $ttl Cache duration in seconds.
* @param string $post_type Post type being cached.
* @param int $post_count Number of posts.
*
* @return int Modified cache duration.
*/
function custom_cache_ttl( $ttl, $post_type, $post_count ) {
// Cache for 1 hour (3600 seconds) regardless of size.
return 3600;
}

Example: Post Type Specific TTL

add_filter( 'wpseo_schema_aggregator_cache_ttl', 'post_type_specific_ttl', 10, 3 );

/**
* Set different cache durations for different post types.
*
* Frequently updated content gets shorter cache times,
* while static content can be cached longer.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_cache_ttl
*
* @param int $ttl Cache duration in seconds.
* @param string $post_type Post type being cached.
* @param int $post_count Number of posts.
*
* @return int Modified cache duration.
*/
function post_type_specific_ttl( $ttl, $post_type, $post_count ) {
$custom_ttls = [
'post' => 1800, // 30 minutes for frequently updated posts.
'page' => 86400, // 24 hours for static pages.
'product' => 3600, // 1 hour for product catalog.
];

return $custom_ttls[ $post_type ] ?? $ttl;
}

Schema Map Configuration

The schema map is an XML sitemap that lists all available schema endpoints. It's automatically referenced in your site's robots.txt.

wpseo_schema_aggregator_schemamap_changefreq

Set the change frequency for schema map entries.

Parameters:

ParameterTypeDescription
$changefreqstringChange frequency (always, hourly, daily, weekly, monthly, yearly, never)

Default Value: 'daily'

Example:

add_filter( 'wpseo_schema_aggregator_schemamap_changefreq', 'custom_schemamap_changefreq' );

/**
* Set schema map change frequency to weekly.
*
* Use this to indicate how often search engines should check
* for updated schema data.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_schemamap_changefreq
*
* @param string $changefreq Change frequency value.
*
* @return string Modified change frequency.
*/
function custom_schemamap_changefreq( $changefreq ) {
return 'weekly'; // Change from daily to weekly.
}

wpseo_schema_aggregator_schemamap_priority

Set the priority value for schema map entries.

Parameters:

ParameterTypeDescription
$priorityfloatPriority value between 0.0 and 1.0

Default Value: 0.8

Example:

add_filter( 'wpseo_schema_aggregator_schemamap_priority', 'custom_schemamap_priority' );

/**
* Increase schema map priority to indicate importance.
*
* Higher priority suggests to search engines that this content
* is important relative to other URLs on your site.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_schemamap_priority
*
* @param float $priority Priority value (0.0 to 1.0).
*
* @return float Modified priority value.
*/
function custom_schemamap_priority( $priority ) {
return 1.0; // Maximum priority.
}

Filtering Strategy

The filtering strategy determines which schema pieces are included or excluded from aggregation. By default, the aggregator filters out Actions, Enumerations, Meta types, and Website elements.

wpseo_schema_aggregator_filtering_strategy

Implement a custom filtering strategy by providing your own strategy class.

Parameters:

ParameterTypeDescription
$strategyobject|nullCustom filtering strategy instance

Default Value: null (uses default strategy)

Example:

add_filter( 'wpseo_schema_aggregator_filtering_strategy', 'custom_filtering_strategy' );

/**
* Implement custom schema filtering logic.
*
* Use this to create advanced filtering rules beyond the default
* context-based filtering. Your strategy class should implement
* the filtering logic in its filter() method.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_filtering_strategy
*
* @param object|null $strategy Custom filtering strategy instance.
*
* @return object Custom filtering strategy.
*/
function custom_filtering_strategy( $strategy ) {
// Return custom strategy that only includes Article types.
return new class {
/**
* Filter schema pieces to only include Articles.
*
* @param array $schema_piece Schema piece to filter.
*
* @return bool Whether to include this schema piece.
*/
public function filter( $schema_piece ) {
// Only include Article types and their subtypes.
$article_types = [ 'Article', 'BlogPosting', 'NewsArticle', 'ScholarlyArticle' ];

if ( isset( $schema_piece['@type'] ) ) {
$type = $schema_piece['@type'];

// Handle array of types.
if ( is_array( $type ) ) {
return ! empty( array_intersect( $type, $article_types ) );
}

return in_array( $type, $article_types, true );
}

return false;
}
};
}

Elements Context Map

The context map categorizes schema.org types into contexts like Content, Commerce, Entity, etc. This is used by the default filtering strategy.

wpseo_schema_aggregator_elements_context_map

Override the complete elements context map.

Parameters:

ParameterTypeDescription
$context_maparrayComplete mapping of schema types to contexts

Default Value: Comprehensive map of 1000+ schema.org types

Example:

add_filter( 'wpseo_schema_aggregator_elements_context_map', 'custom_context_map' );

/**
* Provide a completely custom context map.
*
* This replaces the entire default mapping. Use this when you need
* complete control over which types belong to which contexts.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_elements_context_map
*
* @param array $context_map Complete context map.
*
* @return array Custom context map.
*/
function custom_context_map( $context_map ) {
// Define a simplified context map.
return [
'content' => [
'Article',
'BlogPosting',
'NewsArticle',
],
'commerce' => [
'Product',
'Offer',
],
'entity' => [
'Person',
'Organization',
],
];
}

wpseo_schema_aggregator_elements_context_map_{context}

Modify elements for a specific context. Available contexts: content, commerce, entity, event, data, medical, action, enumeration, meta, website.

Parameters:

ParameterTypeDescription
$elementsarrayArray of schema types in this context

Example: Add Custom Types to Content Context

add_filter( 'wpseo_schema_aggregator_elements_context_map_content', 'add_custom_content_types' );

/**
* Add custom schema types to the content context.
*
* This is useful when you have custom schema types that should
* be treated as content entities.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_elements_context_map_context
*
* @param array $elements Schema types in the content context.
*
* @return array Modified array of schema types.
*/
function add_custom_content_types( $elements ) {
// Add custom types to content context.
$elements[] = 'Recipe';
$elements[] = 'HowTo';
$elements[] = 'FAQPage';

return $elements;
}

Example: Remove Types from Action Context

add_filter( 'wpseo_schema_aggregator_elements_context_map_action', 'remove_action_types' );

/**
* Remove specific action types from the action context.
*
* This can help further refine which actions are filtered out.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#wpseo_schema_aggregator_elements_context_map_context
*
* @param array $elements Schema types in the action context.
*
* @return array Modified array of schema types.
*/
function remove_action_types( $elements ) {
// Remove SearchAction from action context.
// This means it won't be filtered out anymore.
return array_diff( $elements, [ 'SearchAction' ] );
}

Article Enhancement

Articles and their subtypes (BlogPosting, NewsArticle, etc.) can be enhanced with additional properties like articleBody, description, and keywords.

Article Enhancement Configuration

Use the wpseo_article_enhance_config_{key} filter pattern to configure enhancement behavior. Available keys:

  • max_article_body_length - Maximum length for articleBody (default: 5000)
  • max_description_length - Maximum length for description (default: 320)
  • add_article_body - Whether to add articleBody (default: true)
  • add_description - Whether to add description (default: true)
  • add_keywords - Whether to add keywords (default: true)

Example: Adjust Maximum Lengths

add_filter( 'wpseo_article_enhance_config_max_article_body_length', 'custom_article_body_length' );

/**
* Increase maximum article body length.
*
* Useful for long-form content where you want to include
* more of the article text in the schema.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#article-enhancement-configuration
*
* @param int $max_length Maximum length in characters.
*
* @return int Modified maximum length.
*/
function custom_article_body_length( $max_length ) {
return 10000; // Increase from 5000 to 10000 characters.
}
add_filter( 'wpseo_article_enhance_config_max_description_length', 'custom_description_length' );

/**
* Adjust maximum description length.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#article-enhancement-configuration
*
* @param int $max_length Maximum length in characters.
*
* @return int Modified maximum length.
*/
function custom_description_length( $max_length ) {
return 500; // Increase from 320 to 500 characters.
}

Example: Disable Specific Enhancements

add_filter( 'wpseo_article_enhance_config_add_article_body', '__return_false' );

Article Enhancement Toggles

Use the wpseo_article_enhance_{enhancement} filter pattern to enable or disable enhancements dynamically. Available enhancements match the configuration keys: article_body, description, keywords.

Example: Conditional Article Body

add_filter( 'wpseo_article_enhance_article_body', 'conditional_article_body', 10, 2 );

/**
* Only include article body for certain post types.
*
* This allows fine-grained control over which content types
* receive full body enhancement.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#article-enhancement-toggles
*
* @param bool $enabled Whether enhancement is enabled.
* @param array $schema_piece The schema piece being enhanced.
*
* @return bool Modified enabled status.
*/
function conditional_article_body( $enabled, $schema_piece ) {
// Only add article body for blog posts, not news articles.
if ( isset( $schema_piece['@type'] ) && $schema_piece['@type'] === 'NewsArticle' ) {
return false;
}

return $enabled;
}

Article Body with Excerpt

Control whether to include article body when an excerpt already exists.

Filter: wpseo_article_enhance_body_when_excerpt_exists

Parameters:

ParameterTypeDescription
$include_bodyboolWhether to include body when excerpt exists
$schema_piecearrayThe schema piece being enhanced

Default Value: false

Example:

add_filter( 'wpseo_article_enhance_body_when_excerpt_exists', '__return_true');

Article Body Fallback

Control whether to include article body when no excerpt exists.

Filter: wpseo_article_enhance_article_body_fallback

Parameters:

ParameterTypeDescription
$use_fallbackboolWhether to use body as fallback
$schema_piecearrayThe schema piece being enhanced

Default Value: true

Example:

add_filter( 'wpseo_article_enhance_article_body_fallback', '__return_false' );

Person Enhancement

Person schema pieces can be enhanced with additional properties based on WordPress user data.

Person Enhancement Configuration

Use the wpseo_person_enhance_config_{key} filter pattern to configure person enhancement. The exact available keys depend on your implementation.

Example:

add_filter( 'wpseo_person_enhance_config_include_social_profiles', '__return_true' );

Person Enhancement Toggles

Use the wpseo_person_enhance_\{enhancement\} filter pattern to enable or disable specific person enhancements dynamically.

Example:

add_filter( 'wpseo_person_enhance_bio', 'conditional_person_bio', 10, 2 );

/**
* Only include person bio for authors with posts.
*
* @link https://developer.yoast.com/features/schema/schema-aggregator/filters/#person-enhancement-toggles
*
* @param bool $enabled Whether enhancement is enabled.
* @param array $schema_piece The schema piece being enhanced.
*
* @return bool Modified enabled status.
*/
function conditional_person_bio( $enabled, $schema_piece ) {
// Extract user ID from schema piece if available.
if ( isset( $schema_piece['@id'] ) ) {
// Parse user ID from the @id.
preg_match( '/person\/(\d+)/', $schema_piece['@id'], $matches );

if ( ! empty( $matches[1] ) ) {
$user_id = (int) $matches[1];
$post_count = count_user_posts( $user_id );

// Only include bio if user has published posts.
return $post_count > 0;
}
}

return $enabled;
}

Robots.txt Integration

By default, the schema map is automatically referenced in your site's robots.txt file. You can disable this integration if needed.

wpseo_disable_robots_schemamap

Disable the schema map reference in robots.txt.

Parameters:

ParameterTypeDescription
$disableboolWhether to disable robots.txt integration

Default Value: false

Example:

add_filter( 'wpseo_disable_robots_schemamap', '__return_true' );

Development Environment Configuration

Disable caching and adjust settings for easier development:

/**
* Schema Aggregator configuration for development.
*/

// Disable caching in development.
add_filter( 'wpseo_schema_aggregator_cache_enabled', function( $enabled ) {
return defined( 'WP_DEBUG' ) && WP_DEBUG ? false : $enabled;
} );

// Smaller pagination for faster testing.
add_filter( 'wpseo_schema_aggregator_per_page', function() {
return defined( 'WP_DEBUG' ) && WP_DEBUG ? 10 : 1000;
} );

// Don't add schema map to robots.txt in development.
add_filter( 'wpseo_disable_robots_schemamap', function() {
return defined( 'WP_DEBUG' ) && WP_DEBUG;
} );