$violations */ public function shouldProceedDespiteViolations(string $contractId, array $violations): bool { $substantive = $this->substantiveViolations($violations); if (empty($substantive)) { return true; } if ($this->isProductionEnvironment()) { $this->logToleratedViolations($contractId, $substantive); return true; } return false; } /** * @param array $violations * @return array */ private function substantiveViolations(array $violations): array { $prefixLength = strlen(self::UNEXPECTED_FIELD_PREFIX); $substantive = array(); foreach ($violations as $violation) { if (strncmp($violation, self::UNEXPECTED_FIELD_PREFIX, $prefixLength) !== 0) { $substantive[] = $violation; } } return $substantive; } private function isProductionEnvironment(): bool { if (!function_exists('wp_get_environment_type')) { return false; } return wp_get_environment_type() === 'production'; } /** * @param array $violations */ private function logToleratedViolations(string $contractId, array $violations): void { $logger = function_exists('abj_service_optional') ? abj_service_optional('logging') : null; if (!is_object($logger) || !method_exists($logger, 'debugMessage')) { return; } $logger->debugMessage('AJAX request contract "' . $contractId . '" had violations but was allowed to proceed (production tolerance): ' . implode('; ', array_values($violations))); } }