wpseek.com
A WordPress-centric search engine for devs and theme authors



wp_render_position_support › WordPress Function

Since6.2.0
Deprecatedn/a
› wp_render_position_support ( $block_content, $block )
Access:
  • private
Parameters: (2)
  • (string) $block_content Rendered block content.
    Required: Yes
  • (array) $block Block object.
    Required: Yes
Returns:
  • (string) Filtered block content.
Defined at:
Codex:
Change Log:
  • 7.2.0

Renders position styles to the block wrapper.



Source

function wp_render_position_support( $block_content, $block ) {
	$block_type           = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
	$has_position_support = block_has_support( $block_type, 'position', false );
	$style_attribute      = $block['attrs']['style'] ?? null;

	if ( ! $has_position_support || ! is_array( $style_attribute ) ) {
		return $block_content;
	}

	/*
	 * Position styles can exist in either the default state or a viewport state.
	 */
	$has_position_style = ! empty( $style_attribute['position'] );
	if ( ! $has_position_style ) {
		foreach ( $style_attribute as $key => $style ) {
			if (
				is_string( $key ) &&
				str_starts_with( $key, '@' ) &&
				is_array( $style ) &&
				! empty( $style['position'] )
			) {
				$has_position_style = true;
				break;
			}
		}
	}

	if ( ! $has_position_style ) {
		return $block_content;
	}

	$global_settings          = wp_get_global_settings();
	$theme_has_sticky_support = $global_settings['position']['sticky'] ?? false;
	$theme_has_fixed_support  = $global_settings['position']['fixed'] ?? false;

	// Only allow output for position types that the theme supports.
	$allowed_position_types = array();
	if ( true === $theme_has_sticky_support ) {
		$allowed_position_types[] = 'sticky';
	}
	if ( true === $theme_has_fixed_support ) {
		$allowed_position_types[] = 'fixed';
	}

	$viewport_settings        = $global_settings['viewport'] ?? null;
	$responsive_media_queries = WP_Theme_JSON::get_viewport_media_queries( $viewport_settings );
	$class_name               = wp_unique_id( 'wp-container-' );
	$selector                 = ".$class_name";
	$position_styles          = array();
	$wrapper_classes          = array();
	$base_position            = $style_attribute['position'] ?? null;

	// Default viewport (base) position styles.
	$base_styles = wp_get_position_support_styles(
		$selector,
		$base_position,
		$allowed_position_types
	);

	if ( ! empty( $base_styles ) ) {
		$position_styles   = $base_styles;
		$wrapper_classes[] = 'is-position-' . $base_position['type'];
	}

	/*
	 * Responsive viewport state styles. A viewport state inherits any values
	 * it does not set from the default state, so a state that only overrides
	 * e.g. the `top` offset keeps the base position type.
	 */
	foreach ( $responsive_media_queries as $breakpoint => $media_query ) {
		$viewport_position_style = $style_attribute[ $breakpoint ]['position'] ?? null;

		if ( empty( $viewport_position_style ) || ! is_array( $viewport_position_style ) ) {
			continue;
		}

		$viewport_position = is_array( $base_position )
			? array_replace( $base_position, $viewport_position_style )
			: $viewport_position_style;

		$viewport_styles = wp_get_position_support_styles(
			$selector,
			$viewport_position,
			$allowed_position_types
		);

		if ( ! empty( $viewport_styles ) ) {
			$wrapper_classes[] = 'is-position-' . $viewport_position['type'];
		} elseif ( ! empty( $base_styles ) ) {
			/*
			 * The viewport state can explicitly clear the position type inherited from the
			 * default state.
			 */
			$viewport_styles = array(
				array(
					'selector'     => $selector,
					'declarations' => array( 'position' => 'static' ),
				),
			);
		} else {
			continue;
		}

		foreach ( $viewport_styles as $index => $rule ) {
			$viewport_styles[ $index ]['rules_group'] = $media_query;
		}

		$position_styles = array_merge( $position_styles, $viewport_styles );
	}

	if ( ! empty( $position_styles ) ) {
		/*
		 * Add to the style engine store to enqueue and render position styles.
		 */
		wp_style_engine_get_stylesheet_from_css_rules(
			$position_styles,
			array(
				'context'  => 'block-supports',
				'prettify' => false,
			)
		);

		// Inject class name to block container markup.
		$content = new WP_HTML_Tag_Processor( $block_content );
		$content->next_tag();
		$content->add_class( $class_name );
		foreach ( array_unique( $wrapper_classes ) as $class ) {
			$content->add_class( $class );
		}
		return (string) $content;
	}

	return $block_content;
}