self::sanitize_text( $decoded['title'] ?? null ), 'description' => self::sanitize_text( $decoded['description'] ?? null ), 'focusKeyphrase' => self::sanitize_text( $decoded['focusKeyphrase'] ?? null ), 'focusLongTail' => self::sanitize_text( $decoded['focusLongTail'] ?? null ), 'agentPrompt' => self::sanitize_textarea( $decoded['agentPrompt'] ?? null ), 'canonical' => self::sanitize_canonical( $decoded['canonical'] ?? null ), 'robots' => self::sanitize_text( $decoded['robots'] ?? null ), 'schemaArticleType' => self::sanitize_text( $decoded['schemaArticleType'] ?? null ), ); } /** * Decode a JSON string or array payload. * * @param mixed $value Raw payload. * * @return array */ private static function decode( $value ): array { if ( is_array( $value ) ) { return $value; } if ( is_string( $value ) && '' !== trim( $value ) ) { $decoded = json_decode( $value, true ); if ( is_array( $decoded ) ) { return $decoded; } } return array(); } /** * Sanitize a scalar into a plain string. * * @param mixed $value Raw value. * * @return string */ private static function sanitize_text( $value ): string { if ( ! is_scalar( $value ) ) { return ''; } return sanitize_text_field( (string) $value ); } /** * Sanitize a scalar into textarea-safe string. * * @param mixed $value Raw value. * * @return string */ private static function sanitize_textarea( $value ): string { if ( ! is_scalar( $value ) ) { return ''; } return sanitize_textarea_field( (string) $value ); } /** * Sanitize canonical URL while allowing the no-output token. * * @param mixed $value Raw value. * * @return string */ private static function sanitize_canonical( $value ): string { if ( ! is_scalar( $value ) ) { return ''; } $canonical = (string) $value; if ( Constants::CANONICAL_NONE_TOKEN === $canonical ) { return $canonical; } return esc_url_raw( $canonical ); } }