$formID, 'form_preview' => true]; $frontendFormHandler = new FrontendFormHandler(); $formViewObject = $frontendFormHandler->handleFrontendRenderRequest($attr); if ('string' === gettype($formViewObject)) { Render::view('views/form-not-found'); exit; } $formHTML = $formViewObject->html; $font = $formViewObject->font; $bfGlobals = $formViewObject->bfGlobals; $configTag = isset($formViewObject->configTag) ? $formViewObject->configTag : ''; $formContent = isset($formViewObject->formContent) ? $formViewObject->formContent : null; set_transient('bitform_form_preview', true); $frontendFormHandler->generateJs($formID); $title = 'BitForm Preview page'; Render::view('views/preview-page', compact('formID', 'title', 'formHTML', 'font', 'bfGlobals', 'configTag', 'formContent')); } } private static function getCustomUrlFormId() { $urlMap = get_transient('bitform_standalone_url_map'); if (false === $urlMap) { $urlMap = self::buildStandaloneUrlMap(); set_transient('bitform_standalone_url_map', $urlMap, DAY_IN_SECONDS); } if (empty($urlMap)) { return null; } $currentUrl = get_site_url() . (isset($_SERVER['REQUEST_URI']) ? esc_url_raw(wp_unslash($_SERVER['REQUEST_URI'])) : ''); $parsedCurrentUrl = wp_parse_url($currentUrl); foreach ($urlMap as $formID => $customUrlSlug) { $customUrl = get_site_url() . '/' . $customUrlSlug; $parsedCustomUrl = wp_parse_url($customUrl); $pathMatched = isset($parsedCustomUrl['path']) && $parsedCustomUrl['path'] === ($parsedCurrentUrl['path'] ?? ''); if (!$pathMatched) { continue; } if (!isset($parsedCustomUrl['query'])) { return $formID; } parse_str($parsedCustomUrl['query'], $parsedCustomQueries); parse_str($parsedCurrentUrl['query'] ?? '', $parsedCurrentQueries); if (empty(array_diff_assoc($parsedCustomQueries, $parsedCurrentQueries))) { return $formID; } } return null; } private static function buildStandaloneUrlMap() { $formModel = new FormModel(); $forms = $formModel->get(['id', 'form_content']); $urlMap = []; if (is_wp_error($forms) || !is_array($forms)) { return $urlMap; } foreach ($forms as $form) { $formContent = json_decode($form->form_content); if (empty($formContent->formInfo->standaloneSettings->active)) { continue; } $standaloneSettings = $formContent->formInfo->standaloneSettings; if (empty($standaloneSettings->customUrl)) { continue; } $urlMap[$form->id] = $standaloneSettings->customUrl; } return $urlMap; } public static function standaloneFormView() { if (is_admin()) { return; } // Read-only: form ID from query string for standalone view dispatch. No state mutation. $hasBitFormParam = isset($_GET['bit-form']); $formID = isset($_GET['bit-form']) ? sanitize_text_field(wp_unslash($_GET['bit-form'])) : ''; if (empty($formID)) { $formID = self::getCustomUrlFormId(); } if (empty($formID)) { return ''; } $formID = intval($formID); $attr = ['form_id' => $formID, 'form_preview' => true]; $FormManager = FormManager::getInstance($formID); $formContent = $FormManager->getFormContent(); if (empty($formContent->formInfo->standaloneSettings->active)) { return; } $standaloneSettings = $formContent->formInfo->standaloneSettings; $frontendFormHandler = new FrontendFormHandler(); $formViewObject = $frontendFormHandler->handleFrontendRenderRequest($attr); if ('string' === gettype($formViewObject)) { Render::view('views/form-not-found'); exit; } $formHTML = $formViewObject->html; $font = $formViewObject->font; $bfGlobals = $formViewObject->bfGlobals; $configTag = isset($formViewObject->configTag) ? $formViewObject->configTag : ''; $formContent = isset($formViewObject->formContent) ? $formViewObject->formContent : null; set_transient('bitform_form_preview', true); $frontendFormHandler->generateJs($formID); $title = !empty($standaloneSettings->pageTitle) ? $standaloneSettings->pageTitle : 'Bit Form'; Render::view('views/standalone-form', compact('formID', 'title', 'formHTML', 'font', 'bfGlobals', 'configTag', 'formContent')); exit(200); } }