Title: WP_Theme_JSON::sanitize
Published: July 20, 2021
Last modified: February 24, 2026

---

# WP_Theme_JSON::sanitize( array $input, array $valid_block_names, array $valid_element_names, array $valid_variations ): array

## In this article

 * [Parameters](https://developer.wordpress.org/reference/classes/wp_theme_json/sanitize/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/classes/wp_theme_json/sanitize/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/classes/wp_theme_json/sanitize/?output_format=md#source)
 * [Changelog](https://developer.wordpress.org/reference/classes/wp_theme_json/sanitize/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/wp_theme_json/sanitize/?output_format=md#wp--skip-link--target)

Sanitizes the input according to the schemas.

## 󠀁[Parameters](https://developer.wordpress.org/reference/classes/wp_theme_json/sanitize/?output_format=md#parameters)󠁿

 `$input`arrayrequired

Structure to sanitize.

`$valid_block_names`arrayrequired

List of valid block names.

`$valid_element_names`arrayrequired

List of valid element names.

`$valid_variations`arrayrequired

List of valid variations per block.

## 󠀁[Return](https://developer.wordpress.org/reference/classes/wp_theme_json/sanitize/?output_format=md#return)󠁿

 array The sanitized output.

## 󠀁[Source](https://developer.wordpress.org/reference/classes/wp_theme_json/sanitize/?output_format=md#source)󠁿

    ```php
    protected static function sanitize( $input, $valid_block_names, $valid_element_names, $valid_variations ) {
    	$output = array();

    	if ( ! is_array( $input ) ) {
    		return $output;
    	}

    	// Preserve only the top most level keys.
    	$output = array_intersect_key( $input, array_flip( static::VALID_TOP_LEVEL_KEYS ) );

    	/*
    	 * Remove any rules that are annotated as "top" in VALID_STYLES constant.
    	 * Some styles are only meant to be available at the top-level (e.g.: blockGap),
    	 * hence, the schema for blocks & elements should not have them.
    	 */
    	$styles_non_top_level = static::VALID_STYLES;
    	foreach ( array_keys( $styles_non_top_level ) as $section ) {
    		// array_key_exists() needs to be used instead of isset() because the value can be null.
    		if ( array_key_exists( $section, $styles_non_top_level ) && is_array( $styles_non_top_level[ $section ] ) ) {
    			foreach ( array_keys( $styles_non_top_level[ $section ] ) as $prop ) {
    				if ( 'top' === $styles_non_top_level[ $section ][ $prop ] ) {
    					unset( $styles_non_top_level[ $section ][ $prop ] );
    				}
    			}
    		}
    	}

    	// Build the schema based on valid block & element names.
    	$schema                 = array();
    	$schema_styles_elements = array();

    	/*
    	 * Set allowed element pseudo selectors based on per element allow list.
    	 * Target data structure in schema:
    	 * e.g.
    	 * - top level elements: `$schema['styles']['elements']['link'][':hover']`.
    	 * - block level elements: `$schema['styles']['blocks']['core/button']['elements']['link'][':hover']`.
    	 */
    	foreach ( $valid_element_names as $element ) {
    		$schema_styles_elements[ $element ] = $styles_non_top_level;

    		if ( isset( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element ] ) ) {
    			foreach ( static::VALID_ELEMENT_PSEUDO_SELECTORS[ $element ] as $pseudo_selector ) {
    				$schema_styles_elements[ $element ][ $pseudo_selector ] = $styles_non_top_level;
    			}
    		}
    	}

    	$schema_styles_blocks   = array();
    	$schema_settings_blocks = array();

    	/*
    	 * Generate a schema for blocks.
    	 * - Block styles can contain `elements` & `variations` definitions.
    	 * - Variations definitions cannot be nested.
    	 * - Variations can contain styles for inner `blocks`.
    	 * - Variation inner `blocks` styles can contain `elements`.
    	 *
    	 * As each variation needs a `blocks` schema but further nested
    	 * inner `blocks`, the overall schema will be generated in multiple passes.
    	 */
    	foreach ( $valid_block_names as $block ) {
    		$schema_settings_blocks[ $block ]           = static::VALID_SETTINGS;
    		$schema_styles_blocks[ $block ]             = $styles_non_top_level;
    		$schema_styles_blocks[ $block ]['elements'] = $schema_styles_elements;
    	}

    	$block_style_variation_styles             = static::VALID_STYLES;
    	$block_style_variation_styles['blocks']   = $schema_styles_blocks;
    	$block_style_variation_styles['elements'] = $schema_styles_elements;

    	foreach ( $valid_block_names as $block ) {
    		// Build the schema for each block style variation.
    		$style_variation_names = array();
    		if (
    			! empty( $input['styles']['blocks'][ $block ]['variations'] ) &&
    			is_array( $input['styles']['blocks'][ $block ]['variations'] ) &&
    			isset( $valid_variations[ $block ] )
    		) {
    			$style_variation_names = array_intersect(
    				array_keys( $input['styles']['blocks'][ $block ]['variations'] ),
    				$valid_variations[ $block ]
    			);
    		}

    		$schema_styles_variations = array();
    		if ( ! empty( $style_variation_names ) ) {
    			$schema_styles_variations = array_fill_keys( $style_variation_names, $block_style_variation_styles );
    		}

    		$schema_styles_blocks[ $block ]['variations'] = $schema_styles_variations;
    	}

    	$schema['styles']                                 = static::VALID_STYLES;
    	$schema['styles']['blocks']                       = $schema_styles_blocks;
    	$schema['styles']['elements']                     = $schema_styles_elements;
    	$schema['settings']                               = static::VALID_SETTINGS;
    	$schema['settings']['blocks']                     = $schema_settings_blocks;
    	$schema['settings']['typography']['fontFamilies'] = static::schema_in_root_and_per_origin( static::FONT_FAMILY_SCHEMA );

    	// Remove anything that's not present in the schema.
    	foreach ( array( 'styles', 'settings' ) as $subtree ) {
    		if ( ! isset( $input[ $subtree ] ) ) {
    			continue;
    		}

    		if ( ! is_array( $input[ $subtree ] ) ) {
    			unset( $output[ $subtree ] );
    			continue;
    		}

    		$result = static::remove_keys_not_in_schema( $input[ $subtree ], $schema[ $subtree ] );

    		if ( empty( $result ) ) {
    			unset( $output[ $subtree ] );
    		} else {
    			$output[ $subtree ] = static::resolve_custom_css_format( $result );
    		}
    	}

    	return $output;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/class-wp-theme-json.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/class-wp-theme-json.php#L955)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/class-wp-theme-json.php#L955-L1076)

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/wp_theme_json/sanitize/?output_format=md#changelog)󠁿

| Version | Description | 
| [6.6.0](https://developer.wordpress.org/reference/since/6.6.0/) | Updated schema to allow extended block style variations. | 
| [6.3.0](https://developer.wordpress.org/reference/since/6.3.0/) | Added the `$valid_variations` parameter. | 
| [5.9.0](https://developer.wordpress.org/reference/since/5.9.0/) | Added the `$valid_block_names` and `$valid_element_name` parameters. | 
| [5.8.0](https://developer.wordpress.org/reference/since/5.8.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwp_theme_json%2Fsanitize%2F)
before being able to contribute a note or feedback.