loadHTML('' . $content . ''); $xpath = new \DOMXPath($doc); $nodes = $xpath->query('//div[contains(@class, "' . $id . '")]'); if (sizeof($nodes) === 0) { return ''; } return $doc->saveXML($nodes[0]); } private function pickVariant($variants, $testId) { if (isset($_COOKIE['ab-testing-for-wp'])) { $cookieData = json_decode(stripslashes($_COOKIE['ab-testing-for-wp']), true); if (isset($cookieData[$testId])) { // make sure variant is still in varients foreach ($variants as $variant) { if ($variant['id'] === $cookieData[$testId]) { return $variant; } } } } $pickedVariant = $this->pickVariantAt($variants, $this->randomTestDistributionPosition($variants)); $abTestTracking = new ABTestTracking(); $abTestTracking->addParticipation($pickedVariant['id']); $cookieData = []; if (isset($_COOKIE['ab-testing-for-wp'])) { $cookieData = json_decode(stripslashes($_COOKIE['ab-testing-for-wp']), true); } $cookieData[$testId] = $pickedVariant['id']; setcookie('ab-testing-for-wp', json_encode($cookieData), time() + (60*60*24*30), '/'); return $pickedVariant; } private function getControlVariant($variants, $testId, $control) { // get control variant version foreach ($variants as $variant) { if ($variant['id'] === $control) { return $variant; } } // when all else fails... return the first variant return $variants[0]; } private function wrapData($testId, $postId, $controlContent) { return '
' . $controlContent . '
'; } public function resolveVariant($request) { if (!$request->get_param('test') || !$request->get_param('post')) { return new \WP_Error('rest_invalid_request', 'Missing test or post parameter.', ['status' => 400]); } $testId = $request->get_param('test'); $postId = $request->get_param('post'); // get contents of the post to extract gutenberg block $content_post = get_post($postId); $content = $content_post->post_content; // find the json data of the test in the post $testData = ABTestContentParser::findTestInContent($content, $testId); if (!$testData) { return new \WP_Error('rest_invalid_request', 'Could not find test data on post.', ['status' => 400]); } // extract data $isEnabled = isset($testData['isEnabled']) && $testData['isEnabled']; $variants = $testData['variants']; $control = $testData['control']; // get control variant of the test $controlVariant = $this->getControlVariant($variants, $testId, $control); // pick a variant of the test $pickedVariant = $isEnabled ? $this->pickVariant($variants, $testId) : $controlVariant; $variantId = $pickedVariant['id']; // skip parsing HTML if control if ($variantId === $control) { return rest_ensure_response([ 'id' => $variantId ]); } // parse HTML of the test and send $variantContent = apply_filters('the_content', $this->getVariantContent($content, $variantId)); return rest_ensure_response([ 'id' => $variantId, 'html' => $variantContent, ]); } public function renderTest($attributes, $content) { $variants = $attributes['variants']; $testId = $attributes['id']; $control = $attributes['control']; $isEnabled = isset($attributes['isEnabled']) ? $attributes['isEnabled'] : false; $controlVariant = $this->getControlVariant($variants, $testId, $control); if (!isset($controlVariant)) { return ''; } return $this->wrapData( $testId, get_the_ID(), $this->getVariantContent($content, $controlVariant['id']) ); } }