['_yoast_wpseo_title', 'rank_math_title'], 'meta_description' => ['_yoast_wpseo_metadesc', 'rank_math_description'], ]; /** @return array Only supplied, source-owned metadata is written. */ public static function values(array $canonical, array $ownership = [], bool $existing = true): array { $values = []; if (!$existing || ($ownership['meta_data'] ?? 'source') !== 'merchant') { foreach ((array) ($canonical['meta_data'] ?? []) as $key => $value) { $key = sanitize_key((string) $key); if ($key !== '') { $values[$key] = $value; } } } foreach (self::SEO_KEYS as $field => $keys) { $owner = $ownership[$field] ?? $ownership['meta_data'] ?? 'source'; foreach ($keys as $key) { if ($existing && $owner === 'merchant') { unset($values[$key]); } elseif (array_key_exists($field, $canonical)) { $values[$key] = sanitize_text_field($canonical[$field]); } elseif (array_key_exists($key, $values)) { $values[$key] = sanitize_text_field($values[$key]); } } } return $values; } /** Identify the upload field to retain when the publisher filters unchanged fields. */ public static function field(string $key, array $canonical): string { foreach (self::SEO_KEYS as $field => $keys) { if (array_key_exists($field, $canonical) && in_array($key, $keys, true)) { return $field; } } return 'meta_data'; } /** @return list */ public static function errors(array $canonical): array { $errors = []; foreach (self::SEO_KEYS as $field => $keys) { if (array_key_exists($field, $canonical) && !is_string($canonical[$field])) { $errors[] = $field . ' must be a string; use an empty string to clear it'; } foreach ($keys as $key) { if ( is_array($canonical['meta_data'] ?? null) && array_key_exists($key, $canonical['meta_data']) && !is_string($canonical['meta_data'][$key]) ) { $errors[] = 'meta_data.' . $key . ' must be a string'; } } } if (array_key_exists('meta_data', $canonical) && !is_array($canonical['meta_data'])) { $errors[] = 'meta_data must be an object keyed by metadata name'; } return $errors; } }