/home/sylamedg/www/wp-content/plugins/convertpro/includes/Classes/ElementRedirection.php
<?php
namespace ConvertPro\Classes;
use KubAT\PhpSimple\HtmlDomParser;
use simplehtmldom;
use simplehtmldom\HtmlNode;
use simplehtmldom\HtmlWeb;
class ElementRedirection
{
private $html_parser;
function __construct()
{
if (is_admin()) {
return false;
}
// add_action('wp', [$this, 'autoSelectElement'], 1);
// add_action('wp_enqueue_scripts', [$this, 'addElementStyles']);
add_action('init', array($this, 'start_buffer'), PHP_INT_MAX);
add_action('template_redirect', [$this, 'update_conversion']);
// $this->html_parser = new HtmlWeb();
}
public function start_buffer()
{
ob_start(array($this, 'manipulate_html'));
// var_dump(ob_get_clean());
}
public function manipulate_html($buffer)
{
// Load the buffer into the object
global $wpdb;
$dom = HtmlDomParser::str_get_html($buffer);
$styles = '';
$active_class = '';
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$results = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}convertpro WHERE test_type='elements'");
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$allVariations = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}convertpro_variations where class_name != '' ");
$output = '';
foreach ($results as $value) {
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$variations = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}convertpro_variations WHERE splittest_id = %d",
$value->id
)
);
// Check if any variation matches the cookie value
$cookieName = 'convert_pro_elm_test_' . $value->id;
$active_class = isset($_COOKIE[$cookieName]) ? sanitize_text_field(wp_unslash(($_COOKIE[$cookieName]))) : '';
// $this->autoSelectElement();
foreach ($variations as $variation) {
if (empty($active_class)) {
if ($dom->find('.' . $variation->class_name)) {
$this->autoSelectElement($value->id);
}
}
$active_class = isset($_COOKIE[$cookieName]) ? sanitize_text_field(wp_unslash($_COOKIE[$cookieName])) : '';
// $output .= $dom->find('body', 0)->innertext = 'hellow' . $variation->class_name;
if (!empty($active_class) && $variation->class_name != $active_class) {
// var_dump($variation->class_name);
foreach ($dom->find('.' . $variation->class_name) as $element) {
$element->remove();
}
}
}
}
// Manipulate the HTML here
// For example, let's change all <h1> tags to <h2>
return $dom->save();
// return $output;
}
public function update_conversion()
{
global $wpdb;
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$results = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}convertpro WHERE test_type = 'elements'");
foreach ($results as $value) {
$cookieName = 'convert_pro_elm_test_' . $value->id;
$active_class = isset($_COOKIE[$cookieName]) ? sanitize_text_field(wp_unslash($_COOKIE[$cookieName])) : '';
$variations = $this->convertpro_ele_query($value->id); // Fetch all variations for the current test
foreach ($variations as $variation) {
$user_variation_id = isset($_COOKIE['convert_pro_elm_variation_id_' . $value->id]) ? sanitize_text_field(wp_unslash($_COOKIE['convert_pro_elm_variation_id_' . $value->id])) : '';
$client_id = isset($_COOKIE['convert_pro_uid']) ? sanitize_text_field(wp_unslash($_COOKIE['convert_pro_uid'])) : '';
// var_dump(get_the_permalink($value->conversion_page_id));
if ((get_the_permalink($value->conversion_page_id) == get_the_permalink()) && ($user_variation_id == $variation->id && !empty($active_class))) {
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$wpdb->update(
$wpdb->prefix . 'convertpro_interactions',
array('type' => 'conversion'),
array('variation_id' => $variation->id, 'splittest_id' => $value->id, 'client_id' => $client_id),
);
}
}
}
}
public function autoSelectElement($testId)
{
global $wpdb;
/* $results = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}convertpro WHERE test_type = 'elements'");
foreach ($results as $value) {
*/
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$variations = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}convertpro_variations WHERE splittest_id = %d AND class_name != ''",
$testId
)
);
if (empty($variations)) {
return;
}
$cookieName = 'convert_pro_elm_test_' . $testId;
$active_class = isset($_COOKIE[$cookieName]) ? sanitize_text_field(wp_unslash($_COOKIE[$cookieName])) : '';
if (empty($active_class)) {
// checking if all remaining are 0 or not
$allRemainingZero = array_filter($variations, function ($obj) {
return $obj->remaining != 0;
});
if (empty($allRemainingZero)) {
$this->refillRemaining($variations);
}
foreach ($variations as $variation) {
$client_test_id = isset($_COOKIE[$cookieName]) ? sanitize_text_field(wp_unslash($_COOKIE[$cookieName])) : '';
if (!empty($client_test_id)) {
continue;
}
if ($variation->remaining <= 0) {
continue;
} else {
$remaining = $variation->remaining - 1;
}
$cookieName = 'convert_pro_elm_test_' . $testId;
$this->updateVariation($wpdb, $variation, $testId, $cookieName, $remaining);
// continue; // Redirect after setting the cookie
}
}
// }
}
public function convertpro_ele_query($id)
{
global $wpdb;
// Query the database for variations associated with the specified split test ID
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM " . $wpdb->prefix . "convertpro_variations
WHERE splittest_id = %d",
$id
)
);
return $results;
}
public function updateVariation($wpdb, $variation, $testid, $cookieName, $remaining)
{
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery
// $remaining = $variation->remaining - 1;
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$result = $wpdb->update(
$wpdb->prefix . 'convertpro_variations',
array('remaining' => $remaining),
array('id' => $variation->id, 'splittest_id' => $testid),
);
setcookie($cookieName, $variation->class_name, time() + (86400 * 30), "/"); // 86400 = 1 day
$_COOKIE[$cookieName] = $variation->class_name; // Update $_COOKIE superglobal
setcookie('convert_pro_elm_variation_id_' . $testid, $variation->id, time() + (86400 * 30), '/');
$cookie_value = $this->convertpro_ele_generateuid();
$this->convertpro_store_visit_data($cookie_value, $variation->id, $testid);
if (!isset($_COOKIE['convert_pro_uid'])) {
setcookie('convert_pro_uid', $cookie_value, time() + 3600, "/");
setcookie('convert_pro_ele_uid', $testid, time() + 3600, "/");
}
$_COOKIE['convert_pro_uid'] = $cookie_value;
}
public function convertpro_ele_selectVariation($test_id)
{
// Query the variations again after potential updates
$variations = $this->convertpro_ele_query($test_id);
// Filter variations to only include those with remaining count greater than 0
$available_variations = array_filter($variations, function ($variation) {
return $variation->remaining > 0;
});
// Return a random variation from the available ones, or null if none are available
if (!empty($available_variations)) {
return $available_variations[array_rand($available_variations)];
}
return null;
}
public function refillRemaining($variations)
{
global $wpdb;
$results = [];
// var_dump($variations);
foreach ($variations as $variation) {
$percentage = str_split($variation->percentage)[0];
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$results = $wpdb->update(
$wpdb->prefix . 'convertpro_variations',
array('remaining' => (int) $percentage),
array('id' => (int) $variation->id),
);
}
return $results;
}
public function updateeleVariationRemaining($variationid, $remainingCount)
{
global $wpdb;
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$result = $wpdb->update(
$wpdb->prefix . 'convertpro_variations',
array('remaining' => (int) $remainingCount),
array('id' => (int) $variationid),
);
}
public function convertpro_ele_generateuid()
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
wp_rand(0, 0xffff),
wp_rand(0, 0xffff),
wp_rand(0, 0xffff),
wp_rand(0, 0x0fff) | 0x4000,
wp_rand(0, 0x3fff) | 0x8000,
wp_rand(0, 0xffff),
wp_rand(0, 0xffff),
wp_rand(0, 0xffff)
);
}
public function convertpro_store_visit_data($cookie_value, $variation_id, $testid)
{
global $wpdb;
// Check if there's already an interaction record
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching
$query = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}convertpro_interactions
WHERE splittest_id = %d
AND client_id = %s",
$testid,
$cookie_value
),
OBJECT
);
if (empty($query)) {
$table_name = $wpdb->prefix . 'convertpro_interactions';
$wpdb->insert(
$table_name,
[
'client_id' => $cookie_value,
'splittest_id' => $testid,
'variation_id' => $variation_id, // Ensure correct variation ID is stored
]
);
}
}
}