WP_REST_Global_Styles_Controller::prepare_item_for_database( WP_REST_Request $request ): stdClass|WP_Error

In this article

Prepares a single global styles config for update.

Parameters

$requestWP_REST_Requestrequired
Request object.

Return

stdClass|WP_Error Prepared item on success. WP_Error on when the custom CSS is not valid.

Source

protected function prepare_item_for_database( $request ) {
	$changes     = new stdClass();
	$changes->ID = $request['id'];

	$post            = get_post( $request['id'] );
	$existing_config = array();
	if ( $post ) {
		$existing_config     = json_decode( $post->post_content, true );
		$json_decoding_error = json_last_error();
		if ( JSON_ERROR_NONE !== $json_decoding_error || ! isset( $existing_config['isGlobalStylesUserThemeJSON'] ) ||
			! $existing_config['isGlobalStylesUserThemeJSON'] ) {
			$existing_config = array();
		}
	}

	if ( isset( $request['styles'] ) || isset( $request['settings'] ) ) {
		$config = array();
		if ( isset( $request['styles'] ) ) {
			if ( isset( $request['styles']['css'] ) ) {
				$css_validation_result = $this->validate_custom_css( $request['styles']['css'] );
				if ( is_wp_error( $css_validation_result ) ) {
					return $css_validation_result;
				}
			}
			$config['styles'] = $request['styles'];
		} elseif ( isset( $existing_config['styles'] ) ) {
			$config['styles'] = $existing_config['styles'];
		}

		// Register theme-defined variations e.g. from block style variation partials under `/styles`.
		$variations = WP_Theme_JSON_Resolver::get_style_variations( 'block' );
		wp_register_block_style_variations_from_theme_json_partials( $variations );

		if ( isset( $request['settings'] ) ) {
			$config['settings'] = $request['settings'];
		} elseif ( isset( $existing_config['settings'] ) ) {
			$config['settings'] = $existing_config['settings'];
		}
		$config['isGlobalStylesUserThemeJSON'] = true;
		$config['version']                     = WP_Theme_JSON::LATEST_SCHEMA;
		/**
		 * JSON encode the data stored in post content.
		 * Escape characters that are likely to be mangled by HTML filters: "<>&".
		 *
		 * This data is later re-encoded by wp_filter_global_styles_post().
		 * The escaping is also applied here as a precaution.
		 */
		$changes->post_content = wp_json_encode( $config, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP );
	}

	// Post title.
	if ( isset( $request['title'] ) ) {
		if ( is_string( $request['title'] ) ) {
			$changes->post_title = $request['title'];
		} elseif ( ! empty( $request['title']['raw'] ) ) {
			$changes->post_title = $request['title']['raw'];
		}
	}

	return $changes;
}

Changelog

VersionDescription
6.6.0Added registration of block style variations from theme.json sources (theme.json, user theme.json, partials).
6.2.0Added validation of styles.css property.
5.9.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.