Yoast\WP\SEO\Schema_Aggregator\Application

Properties_Merger::merge_propertiesprivateYoast 1.0

Merge properties from two schema entities with the same @id

Strategy:

  • @type: Special handling - merge types into unified array
  • @id: Skip (always the same)
  • Arrays: Combine unique values
  • Scalars: Prefer non-empty over empty
  • Objects: Deep merge recursively
  • Null vs value: Prefer non-null

Метод класса: Properties_Merger{}

Хуков нет.

Возвращает

Массив<Строку,. string|int|bool> Merged entity.

Использование

// private - только в коде основоного (родительского) класса
$result = $this->merge_properties( $entity1, $entity2 ): array;
$entity1(массив) (обязательный)
.
$entity2(массив) (обязательный)
.

Код Properties_Merger::merge_properties() Yoast 28.3

private function merge_properties( array $entity1, array $entity2 ): array {
	$merged = $entity1;

	foreach ( $entity2 as $key => $value ) {

		if ( $key === '@id' ) {
			continue;
		}

		// Special handling for @type - merge types (JSON-LD allows multiple types).
		if ( $key === '@type' ) {
			$merged['@type'] = $this->merge_types(
				( $merged['@type'] ?? null ),
				$value,
			);
			continue;
		}

		if ( ! isset( $merged[ $key ] ) || $merged[ $key ] === '' ) {

			$merged[ $key ] = $value;
		}
		elseif ( \is_array( $merged[ $key ] ) && \is_array( $value ) ) {
			// Both are arrays - check if associative (object) or indexed (list).
			if ( $this->is_associative_array( $merged[ $key ] ) || $this->is_associative_array( $value ) ) {
				// Deep merge objects.
				$merged[ $key ] = $this->merge_properties( $merged[ $key ], $value );
			}
			else {
				// Combine arrays and get unique values.
				$merged[ $key ] = \array_values( \array_unique( \array_merge( $merged[ $key ], $value ), \SORT_REGULAR ) );
			}
		}
		// Else: entity1's value is non-empty scalar, keep it (prefer first occurrence).
	}

	return $merged;
}