AlkantarClanX12
| Current Path : /www/capitalgmcbuickregina_830/public/wp-content/plugins/leadbox/lib/ |
| Current File : /www/capitalgmcbuickregina_830/public/wp-content/plugins/leadbox/lib/functions.php |
<?php
function paginate($data, $page, $ipp)
{
$since = $ipp * ($page - 1);
return array_slice($data, $since, $ipp);
}
function getFilterParamsFromString($string)
{
// Request-level cache to avoid re-parsing the same URL multiple times
static $cache = array();
$cache_key = md5($string);
if (isset($cache[$cache_key])) {
return $cache[$cache_key];
}
$params = [];
$types;
preg_match("/\btype\/[a-zA-ZÀ-ÿ,-]+/", $string, $types);
if (sizeof($types) > 0) {
$types = $types[0];
$types = explode(',', explode('/', $types)[1]);
$params['types'] = array_map(function ($types) {
return str_replace(' ', '-', $types);
}, $types);
}
$salependings;
preg_match("/salepending\/[0-9]+/", $string, $salependings);
if (sizeof($salependings) > 0) {
$salependings = $salependings[0];
$salependings = explode(',', explode('/', $salependings)[1]);
$params['salependings'] = $salependings;
}
$demos;
preg_match("/demo\/[0-9]+/", $string, $demos);
if (sizeof($demos) > 0) {
$demos = $demos[0];
$demos = explode(',', explode('/', $demos)[1]);
$params['demos'] = $demos;
}
$asiss;
preg_match("/asis\/[0-9]+/", $string, $asiss);
if (sizeof($asiss) > 0) {
$asiss = $asiss[0];
$asiss = explode(',', explode('/', $asiss)[1]);
$params['asiss'] = $asiss;
}
$certifieds;
preg_match("/certified\/[0-9]+/", $string, $certifieds);
if (sizeof($certifieds) > 0) {
$certifieds = $certifieds[0];
$certifieds = explode(',', explode('/', $certifieds)[1]);
$params['certifieds'] = $certifieds;
}
$specials;
preg_match("/special\/[0-9]+/", $string, $specials);
if (sizeof($specials) > 0) {
$specials = $specials[0];
$specials = explode(',', explode('/', $specials)[1]);
$params['specials'] = $specials;
}
$productlines;
preg_match("/productline\/[a-zA-ZÀ-ÿ,-]+/", $string, $productlines);
if (sizeof($productlines) > 0) {
$productlines = $productlines[0];
$productlines = explode(',', explode('/', $productlines)[1]);
$params['productlines'] = array_map(function ($productlines) {
return str_replace(' ', '-', $productlines);
}, $productlines);
}
$bodystyles;
preg_match("/bodystyle\/[0-9a-zA-ZÀ-ÿ,_\[\]-]+/", $string, $bodystyles);
if (sizeof($bodystyles) > 0) {
$bodystyles = $bodystyles[0];
$bodystyles = explode(',', explode('/', $bodystyles)[1]);
$params['bodystyles'] = array_map(function ($bodystyles) {
return str_replace([' ', '_', '[', ']'], ['-', '/', '(', ')'], $bodystyles);
}, $bodystyles);
}
$outsidelengths;
preg_match("/outsidelength\/[0-9a-zA-ZÀ-ÿ,_\[\]-]+/", $string, $outsidelengths);
if (sizeof($outsidelengths) > 0) {
$outsidelengths = $outsidelengths[0];
$outsidelengths = explode(',', explode('/', $outsidelengths)[1]);
$params['outsidelengths'] = array_map(function ($outsidelengths) {
return str_replace([' ', '_', '[', ']'], ['-', '/', '(', ')'], $outsidelengths);
}, $outsidelengths);
}
$floorplans;
preg_match("/floorplan\/[a-zA-ZÀ-ÿ,-]+/", $string, $floorplans);
if (sizeof($floorplans) > 0) {
$floorplans = $floorplans[0];
$floorplans = explode(',', explode('/', $floorplans)[1]);
$params['floorplans'] = array_map(function ($floorplans) {
return str_replace(' ', '-', $floorplans);
}, $floorplans);
}
$color;
preg_match("/exteriorcolor\/[0-9a-zA-ZÀ-ÿ,_\[\]-]+/", $string, $color);
if (sizeof($color) > 0) {
$color = $color[0];
$color = explode(',', explode('/', $color)[1]);
$params['color'] = array_map(function ($color) {
return str_replace([' ', '_', '[', ']'], ['-', '/', '(', ')'], $color);
}, $color);
}
$conditions;
preg_match("/condition\/[a-zA-ZÀ-ÿ,]+/", $string, $conditions);
if (sizeof($conditions) > 0) {
$conditions = $conditions[0];
$conditions = explode(',', explode('/', $conditions)[1]);
$params['conditions'] = $conditions;
}
$transmissions;
preg_match("/transmission\/[a-zA-ZÀ-ÿ,]+/", $string, $transmissions);
if (sizeof($transmissions) > 0) {
$transmissions = $transmissions[0];
$transmissions = explode(',', explode('/', $transmissions)[1]);
$params['transmissions'] = $transmissions;
}
$enginedisplacements;
preg_match("/enginedisplacement\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $enginedisplacements);
if (sizeof($enginedisplacements) > 0) {
$enginedisplacements = $enginedisplacements[0];
$enginedisplacements = explode(',', explode('/', $enginedisplacements)[1]);
$params['enginedisplacements'] = $enginedisplacements;
}
$searchables;
preg_match("/option\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $searchables);
if (sizeof($searchables) > 0) {
$searchables = $searchables[0];
$searchables = explode(',', explode('/', $searchables)[1]);
$params['searchables'] = $searchables;
}
$packages;
preg_match("/package\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $packages);
if (sizeof($packages) > 0) {
$packages = $packages[0];
$packages = explode(',', explode('/', $packages)[1]);
$params['package'] = $packages;
}
$stocknumber;
preg_match("/stocknumber\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $stocknumber);
if (sizeof($stocknumber) > 0) {
$stocknumber = $stocknumber[0];
$stocknumber = explode(',', explode('/', $stocknumber)[1]);
$params['stocknumber'] = $stocknumber[0];
}
$vin;
preg_match("/vin\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $vin);
if (sizeof($vin) > 0) {
$vin = $vin[0];
$vin = explode(',', explode('/', $vin)[1]);
$params['vin'] = $vin[0];
}
if (preg_match("/year\/[0-9]{4}-[0-9]{4}/", $string)) {
$years;
preg_match("/year\/[0-9]{4}-[0-9]{4}/", $string, $years);
if (sizeof($years) > 0) {
$years = $years[0];
$years = explode('-', explode('/', $years)[1]);
$params['year']['since'] = $years[0];
$params['year']['to'] = $years[1];
for ($y = $years[0]; $y <= $years[1]; $y++)
$params['years'][] = $y;
}
} else if (preg_match("/year\/([0-9]{4},)*([0-9]{4}){1}/", $string)) {
$years;
preg_match("/year\/([0-9]{4},)*([0-9]{4}){1}/", $string, $years);
if (sizeof($years) > 0) {
$years = $years[0];
$years = explode(',', explode('/', $years)[1]);
sort($years);
$params['year']['since'] = $years[0];
$params['year']['to'] = $years[sizeof($years) - 1];
$params['years'] = $years;
}
}
$makes;
preg_match("/make\/[a-zA-ZÀ-ÿ,-]+/", $string, $makes);
if (sizeof($makes) > 0) {
$makes = $makes[0];
$makes = explode(',', explode('/', $makes)[1]);
$params['makes'] = array_map(function ($make) {
return str_replace('', '', $make);
}, $makes);
}
$lots;
preg_match("/lot\/[a-zA-ZÀ-ÿ,-]+/", $string, $lots);
if (sizeof($lots) > 0) {
$lots = $lots[0];
$lots = explode(',', explode('/', $lots)[1]);
$params['lots'] = array_map(function ($lot) {
return str_replace('', '', $lot);
}, $lots);
}
$locations;
preg_match("/location\/[0-9a-zA-ZÀ-ÿ,_\[\]-]+/", $string, $locations);
if (sizeof($locations) > 0) {
$locations = $locations[0];
$locations = explode(',', explode('/', $locations)[1]);
$params['locations'] = array_map(function ($location) {
return str_replace([' ', '_', '[', ']'], ['-', '/', '(', ')'], $location);
}, $locations);
}
$stocks;
preg_match("/stock\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $stocks);
if (sizeof($stocks) > 0) {
$stocks = $stocks[0];
$stocks = explode(',', explode('/', $stocks)[1]);
$params['stocks'] = array_map(function ($stock) {
return str_replace('', '', $stock);
}, $stocks);
}
$models;
preg_match("/model\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $models);
if (sizeof($models) > 0) {
$models = $models[0];
$models = explode(',', explode('/', $models)[1]);
$params['models'] = $models;
}
$trims;
preg_match("/trim\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $trims);
if (sizeof($trims) > 0) {
$trims = $trims[0];
$trims = explode(',', explode('/', $trims)[1]);
$params['trims'] = $trims;
}
$engines;
preg_match("/\bengine\/[0-9a-zA-ZÀ-ÿ.:,_\[\]-]+/", $string, $engines);
if (sizeof($engines) > 0) {
$engines = $engines[0];
$engines = explode(',', explode('/', $engines)[1]);
$params['engines'] = array_map(function ($engines) {
return str_replace(['[reg]', '[and]', '[-]', '[x]', '_', '[', ']', 'plus'], ['®', '&', '–',' ', '/', '(', ')', '+'], $engines);
}, $engines);
}
$drivetrains;
preg_match("/drivetrain\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $drivetrains);
if (sizeof($drivetrains) > 0 ) {
$drivetrains = $drivetrains[0];
$drivetrains = explode(',', explode('/', $drivetrains)[1]);
$params['drivetrains'] = $drivetrains;
}
$bodystyles;
preg_match("/bodystyle\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $bodystyles);
if (sizeof($bodystyles) > 0) {
$bodystyles = $bodystyles[0];
$bodystyles = explode(',', explode('/', $bodystyles)[1]);
$params['bodystyles'] = $bodystyles;
}
$fueltypes;
preg_match("/fueltype\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $fueltypes);
if (sizeof($fueltypes) > 0) {
$fueltypes = $fueltypes[0];
$fueltypes = explode(',', explode('/', $fueltypes)[1]);
$params['fueltypes'] = $fueltypes;
}
$status;
preg_match("/status\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $status);
if (sizeof($status) > 0) {
$status = $status[0];
$status = explode(',', explode('/', $status)[1]);
$params['status'] = $status;
}
$prices;
preg_match("/price\/[0-9.,]+-[0-9.,]+/", $string, $prices);
if (sizeof($prices) > 0) {
$prices = $prices[0];
$prices = explode('-', explode('/', $prices)[1]);
$params['price']['since'] = $prices[0];
$params['price']['to'] = $prices[1];
}
$dryweight;
preg_match("/dryweight\/[0-9.,]+-[0-9.,]+/", $string, $dryweight);
if (sizeof($dryweight) > 0) {
$dryweight = $dryweight[0];
$dryweight = explode('-', explode('/', $dryweight)[1]);
$params['dryweight']['since'] = $dryweight[0];
$params['dryweight']['to'] = $dryweight[1];
}
$grossweight;
preg_match("/grossweight\/[0-9.,]+-[0-9.,]+/", $string, $grossweight);
if (sizeof($grossweight) > 0) {
$grossweight = $grossweight[0];
$grossweight = explode('-', explode('/', $grossweight)[1]);
$params['grossweight']['since'] = $grossweight[0];
$params['grossweight']['to'] = $grossweight[1];
}
$sleepcapacity;
preg_match("/sleepcapacity\/[0-9.,]+-[0-9.,]+/", $string, $sleepcapacity);
if (sizeof($sleepcapacity) > 0) {
$sleepcapacity = $sleepcapacity[0];
$sleepcapacity = explode('-', explode('/', $sleepcapacity)[1]);
$params['sleepcapacity']['since'] = $sleepcapacity[0];
$params['sleepcapacity']['to'] = $sleepcapacity[1];
}
$mileages;
preg_match("/mileage\/[0-9.,]+-[0-9.,]+/", $string, $mileages);
if (sizeof($mileages) > 0) {
$mileages = $mileages[0];
$mileages = explode('-', explode('/', $mileages)[1]);
$params['mileage']['since'] = $mileages[0];
$params['mileage']['to'] = $mileages[1];
}
$carprooflinks;
preg_match("/towing\/[0-9.,]+-[0-9.,]+/", $string, $carprooflinks);
if (sizeof($carprooflinks) > 0) {
$carprooflinks = $carprooflinks[0];
$carprooflinks = explode('-', explode('/', $carprooflinks)[1]);
$params['carprooflink']['since'] = $carprooflinks[0];
$params['carprooflink']['to'] = $carprooflinks[1];
}
$payments;
preg_match("/payment\/[0-9.,]+-[0-9.,]+/", $string, $payments);
if (sizeof($payments) > 0) {
$payments = $payments[0];
$payments = explode('-', explode('/', $payments)[1]);
$params['payment']['since'] = $payments[0];
$params['payment']['to'] = $payments[1];
}
$sort_by;
preg_match("/sort_by\/[a-zA-Z_À-ÿ]+/", $string, $sort_by);
if (sizeof($sort_by) > 0) {
$sort_by = $sort_by[0];
$sort_by = explode(',', explode('/', $sort_by)[1]);
$params['sort_by'] = $sort_by[0];
}
$sort_by_model;
preg_match("/sort_order\/[a-zA-Z_À-ÿ]+/", $string, $sort_by_model);
if (sizeof($sort_by) > 0) {
$sort_by_model = $sort_by_model[0];
$sort_by_model = explode(',', explode('/', $sort_by_model)[1]);
$params['sort_by_model'] = $sort_by_model[0];
}
$sort_by_condition;
preg_match("/sort_order\/[a-zA-Z_À-ÿ]+/", $string, $sort_by_condition);
if (sizeof($sort_by_condition) > 0) {
$sort_by_condition = $sort_by_condition[0];
$sort_by_condition = explode(',', explode('/', $sort_by_condition)[1]);
$params['sort_by_condition'] = $sort_by_condition[0];
}
$filter;
preg_match("/filter\/[a-zA-ZÀ-ÿ0-9-_]+/", $string, $filter);
if (sizeof($filter) > 0) {
$filter = $filter[0];
$filter = explode('/', $filter);
$params['filter'] = $filter[1];
}
$boxsizes;
preg_match("/boxsize\/[0-9a-zA-ZÀ-ÿ.,_\[\]-]+/", $string, $boxsizes);
if (sizeof($boxsizes) > 0) {
$boxsizes = $boxsizes[0];
$boxsizes = explode(',', explode('/', $boxsizes)[1]);
$params['boxsizes'] = array_map(function ($boxsizes) {
return str_replace(['[inch]', '_'], ["'", '/'], $boxsizes);
}, $boxsizes);
}
$seats;
preg_match("/seat\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $seats);
if (sizeof($seats) > 0) {
$seats = $seats[0];
$seats = explode(',', explode('/', $seats)[1]);
$params['seats'] = array_map(function ($seat) {
return str_replace('', '', $seat);
}, $seats);
}
$tags;
preg_match("/\btags\/[0-9a-zA-ZÀ-ÿ.,_-]+/", $string, $tags);
if (sizeof($tags) > 0) {
$tags = $tags[0];
$tags = explode(',', explode('/', $tags)[1]);
$params['tags'] = array_map(function ($tag) {
return str_replace('_', ' ', $tag);
}, $tags);
}
preg_match("/\bsubtype\/([0-9a-zA-ZÀ-ÿ.,-]+)/", $string, $subtypeMatch);
if (sizeof($subtypeMatch) > 1) {
$params['subtypes'] = [str_replace('-', ' ', $subtypeMatch[1])];
}
// SRP-only VIN filter via query string. Uses a separate key (filter_vin)
// to avoid colliding with ?VIN= which triggers the VDP redirect.
if (!empty($_GET['filter_vin']) && empty($params['vin'])) {
$params['vin'] = sanitize_text_field(wp_unslash($_GET['filter_vin']));
}
// Store in cache before returning
$cache[$cache_key] = $params;
return $params;
}
function post_filter($data, $params)
{
$conditions = array_map(function ($i) {
return strtolower($i);
}, $params['conditions'] ?? ['all']);
$transmissions = array_map(function ($i) {
return strtolower($i);
}, $params['transmissions'] ?? ['all']);
$enginedisplacements = array_map(function ($i) {
return strtolower($i);
}, $params['enginedisplacements'] ?? ['all']);
$searchables = array_map(function ($i) {
return strtolower($i);
}, $params['searchables'] ?? ['all']);
$packages = array_map(function ($i) {
return strtolower($i);
}, $params['package'] ?? ['all']);
$stocknumber = strtolower($params['stocknumber'] ?? 'all');
$vin = strtolower($params['vin'] ?? 'all');
// Pre-normalize VIN list (supports comma-separated values: ?filter_vin=VIN1,VIN2)
$vinList = ($vin === 'all' || $vin === '')
? []
: array_filter(array_map(
function ($v) { return str_replace(['-', ' '], '', trim($v)); },
explode(',', $vin)
));
$yearSince = intval($params['year']['since'] ?? 0);
$yearTo = intval($params['year']['to'] ?? 9999);
$years = array_map(function ($i) {
return strtolower($i);
}, $params['years'] ?? ['all']);
$makes = array_map(function ($i) {
return strtolower($i);
}, $params['makes'] ?? ['all']);
$lots = array_map(function ($i) {
return strtolower($i);
}, $params['lots'] ?? ['all']);
$stocks = array_map(function ($i) {
return strtolower($i);
}, $params['stocks'] ?? ['all']);
$models = array_map(function ($i) {
return strtolower($i);
}, $params['models'] ?? ['all']);
$trims = array_map(function ($i) {
return strtolower($i);
}, $params['trims'] ?? ['all']);
$bodystyles = array_map(function ($i) {
return strtolower($i);
}, $params['bodystyles'] ?? ['all']);
$salependings = array_map(function ($i) {
return strtolower($i);
}, $params['salependings'] ?? ['all']);
$demos = array_map(function ($i) {
return strtolower($i);
}, $params['demos'] ?? ['all']);
$asiss = array_map(function ($i) {
return strtolower($i);
}, $params['asiss'] ?? ['all']);
$certifieds = array_map(function ($i) {
return strtolower($i);
}, $params['certifieds'] ?? ['all']);
$specials = array_map(function ($i) {
return strtolower($i);
}, $params['specials'] ?? ['all']);
$priceSince = floatval($params['price']['since'] ?? 0);
$priceTo = floatval($params['price']['to'] ?? 999999999999);
$mileageSince = intval($params['mileage']['since'] ?? 0);
$mileageTo = intval($params['mileage']['to'] ?? 999999999999);
$sort_by = $params['sort_by'] ?? 'price';
$sort_by_condition = $params['sort_by_condition'] ?? $params['sort_order'] ?? 'asc';
$color = array_map(function ($i) {
return strtolower($i);
}, $params['color'] ?? ['all']);
$filter = $params['filter'] ?? false;
$locations = array_map(function ($i) {
return strtolower($i);
}, $params['locations'] ?? ['all']);
$seats = array_map(function ($i) {
return strtolower($i);
}, $params['seats'] ?? ['all']);
$unwanted_array = array(
'Š' => 'S', 'š' => 's', 'Ž' => 'Z', 'ž' => 'z', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E',
'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U',
'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'Þ' => 'B', 'ß' => 'Ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'a', 'ç' => 'c',
'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o',
'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ý' => 'y', 'þ' => 'b', 'ÿ' => 'y'
);
$filtered = [];
foreach ($data as $item) {
$super_string = ((!isset($item['condition'])) ? ' ' : $item['condition'] . ' ')
. ((!isset($item['stocknumber'])) ? ' ' : $item['stocknumber'] . ' ')
. ((!isset($item['vin'])) ? ' ' : $item['vin'] . ' ')
. ((!isset($item['year'])) ? ' ' : $item['year'] . ' ')
. ((!isset($item['make'])) ? ' ' : $item['make'] . ' ')
. ((!isset($item['lot'])) ? ' ' : $item['lot'] . ' ')
. ((!isset($item['model'])) ? ' ' : $item['model'] . ' ')
. ((!isset($item['trim'])) ? ' ' : $item['trim'] . ' ')
. ((!isset($item['bodystyle'])) ? ' ' : $item['bodystyle'] . ' ')
. ((!isset($item['price'])) ? ' ' : $item['price'] . ' ')
. ((!isset($item['mileage'])) ? ' ' : $item['mileage'] . ' ')
. ((!isset($item['exteriorcolor'])) ? ' ' : $item['exteriorcolor'] . ' ')
. ((!isset($item['location'])) ? ' ' : $item['location'] . ' ')
. ((!isset($item['enginedisplacement'])) ? ' ' : $item['enginedisplacement'] . ' ');
$flag = true;
if (sizeof($transmissions) > 0 && $transmissions[0] != 'all')
if ($flag && sizeof($transmissions) > 0 && !in_array(strtolower($item['transmission']), $transmissions))
$flag = false;
if (sizeof($salependings) > 0 && $salependings[0] != 'all')
if ($flag && sizeof($salependings) > 0 && !in_array(strtolower($item['salepending']), $salependings))
$flag = false;
if (sizeof($demos) > 0 && $demos[0] != 'all')
if ($flag && sizeof($demos) > 0 && !in_array(strtolower($item['demo']), $demos))
$flag = false;
if (sizeof($asiss) > 0 && $asiss[0] != 'all')
if ($flag && sizeof($asiss) > 0 && !in_array(strtolower($item['asis']), $asiss))
$flag = false;
if (sizeof($certifieds) > 0 && $certifieds[0] != 'all')
if ($flag && sizeof($certifieds) > 0 && !in_array(strtolower($item['certified']), $certifieds))
$flag = false;
if (sizeof($specials) > 0 && $specials[0] != 'all')
if ($flag && sizeof($specials) > 0 && !in_array(strtolower($item['special']), $specials))
$flag = false;
if (sizeof($enginedisplacements) > 0 && $enginedisplacements[0] != 'all')
if ($flag && sizeof($enginedisplacements) > 0 && !in_array(strtolower($item['enginedisplacement']), $enginedisplacements))
$flag = false;
if (sizeof($searchables) > 0 && $searchables[0] != 'all')
if ($flag && sizeof($searchables) > 0) {
$_item = array_map(
function ($row) {
return strtolower(str_replace(' ', '-', $row));
},
$item['searchablesarray']
);
$arrayIntersect = array_intersect($searchables, $_item);
if (sizeof($arrayIntersect) < sizeof($searchables))
$flag = false;
}
if (sizeof($packages) > 0 && $packages[0] != 'all') {
$packagesArray = $packages;
$total_i = 0;
foreach ($packagesArray as $package) {
$total_i += count(array_filter(explode(',', $item['searchables']), function ($var) use ($package) {
return strpos(strtolower($var), strtolower($package)) !== false;
}));
}
if ($flag && $packages && $total_i == 0)
$flag = false;
}
if (sizeof($conditions) > 0 && $conditions[0] != 'all')
if ($flag && sizeof($conditions) > 0 && !in_array(strtolower($item['condition']), $conditions))
$flag = false;
if ($stocknumber != 'all') {
if ($flag && strpos(strtolower(str_replace(' ', '', str_replace('-', '', $item['stocknumber']))), strtolower(str_replace(' ', '', str_replace('-', '', $stocknumber)))) === false)
$flag = false;
}
if ($flag && !empty($vinList)) {
$itemVinNorm = strtolower(str_replace(['-', ' '], '', $item['vin'] ?? ''));
$matched = false;
foreach ($vinList as $needle) {
if ($needle !== '' && strpos($itemVinNorm, $needle) !== false) {
$matched = true;
break;
}
}
if (!$matched) $flag = false;
}
// if($flag && !($item['year'] >= $yearSince && $item['year'] <= $yearTo))
// $flag = false;
if (sizeof($years) > 0 && $years[0] != 'all')
if ($flag && sizeof($years) > 0 && !in_array($item['year'], $years))
$flag = false;
if (sizeof($makes) > 0 && $makes[0] != 'all')
if ($flag && sizeof($makes) > 0 && !in_array(strtolower($item['make']), $makes))
$flag = false;
if (sizeof($lots) > 0 && $lots[0] != 'all')
if ($flag && sizeof($lots) > 0 && !in_array(strtolower($item['lot']), $lots))
$flag = false;
if (sizeof($stocks) > 0 && $stocks[0] != 'all')
if ($flag && sizeof($stocks) > 0 && !in_array(strtolower($item['stocknumber']), $stocks))
$flag = false;
if (sizeof($models) > 0 && $models[0] != 'all')
if ($flag && sizeof($models) > 0 && !in_array(strtolower(str_replace(' ', '-', $item['model'])), $models))
$flag = false;
if (sizeof($trims) > 0 && $trims[0] != 'all')
if ($flag && sizeof($trims) > 0 && !in_array(strtolower(str_replace(' ', '-', $item['trim'])), $trims))
$flag = false;
if (sizeof($bodystyles) > 0 && $bodystyles[0] != 'all')
if ($flag && sizeof($bodystyles) > 0 && !in_array(str_replace('---', '-', str_replace(' ', '-', strtolower($item['bodystyle']))), $bodystyles))
$flag = false;
if ($flag && !($item['price'] >= $priceSince && $item['price'] <= $priceTo))
$flag = false;
if ($flag && isset($item['mileage']) && !($item['mileage'] >= $mileageSince && $item['mileage'] <= $mileageTo))
$flag = false;
if (sizeof($color) > 0 && $color[0] != 'all')
if ($flag && sizeof($color) > 0 && !in_array(strtolower(strtr($item['exteriorcolor'], $unwanted_array)), str_replace('-', ' ', $color) ))
$flag = false;
// if($flag && $filter && !strpos(strtolower($super_string), strtolower($filter)))
// $flag = false;
if ($flag && $filter && !string_contains_value($super_string, $filter))
$flag = false;
if (sizeof($locations) > 0 && $locations[0] != 'all')
if ($flag && sizeof($locations) > 0 && !in_array(strtolower($item['location']), str_replace('-', ' ', $locations) ))
$flag = false;
if (sizeof($seats) > 0 && $seats[0] != 'all')
if ($flag && sizeof($seats) > 0 && !in_array(strtolower($item['seats']), $seats))
$flag = false;
if ($flag)
$filtered[] = $item;
}
// LBT-1453: normalize the sort key (e.g. 'Stocknumber (Custom)' → 'stocknumber_custom')
// and forward the stock list so sort_vehicles can apply the custom order.
$sort_by_normalized = function_exists('normalize_sort_by_key') ? normalize_sort_by_key($sort_by) : $sort_by;
$stock_list_for_sort = 'all';
if ($sort_by_normalized === 'stocknumber_custom') {
if (function_exists('sort_stocks_to_csv') && !empty($params['sort_stocks'])) {
$stock_list_for_sort = sort_stocks_to_csv($params['sort_stocks']);
}
if (($stock_list_for_sort === '' || $stock_list_for_sort === 'all')
&& !empty($params['stock']) && is_string($params['stock']) && $params['stock'] !== 'all') {
$stock_list_for_sort = $params['stock'];
}
if ($stock_list_for_sort === '') {
$stock_list_for_sort = 'all';
}
}
// LBT-1453: forward the dealer-configured secondary sort so the "rest" of the
// inventory (vehicles not in sort_stocks) is ordered consistently with the
// dealer's intent. SRP layouts already populate these in $params from the
// block options. Accept the two naming conventions in use (sort_order_secondary
// from blade layouts, sort_by_condition_secondary from the inventory shortcode).
$sort_by_secondary = function_exists('normalize_sort_by_key')
? normalize_sort_by_key($params['sort_by_secondary'] ?? 'none')
: ($params['sort_by_secondary'] ?? 'none');
$sort_by_condition_secondary = $params['sort_order_secondary']
?? $params['sort_by_condition_secondary']
?? 'desc';
$filtered = sort_vehicles($filtered, $sort_by_normalized, $sort_by_condition, $sort_by_secondary, $sort_by_condition_secondary, $stock_list_for_sort);
return $filtered;
}
function string_contains_value($text, $filter)
{
$array = explode("_", strtolower($filter));
$total_words = count($array);
$vehicle = array_map('strtolower', explode(' ', $text));
$total_coincidences = 0;
//$total_coincidences = count(array_intersect(array_map('strtolower', explode(' ', $text)), $array));
foreach ($array as $item) {
//var_dump($item);
$total_i = count(array_filter($vehicle, function ($var) use ($item) {
return strpos($var, $item) !== false;
}));
$total_p = count(array_filter($vehicle, function ($var) use ($item) {
return strpos(str_replace("-", "", $var), str_replace("-", " ", $item)) !== false;
}));
//var_dump($total_p);
if ($total_i > 0 || $total_p)
$total_coincidences++;
}
if ($total_words == $total_coincidences) {
return true;
} else {
return false;
}
}
function get_search_inventory()
{
$idiom = '';
if (isFrench() == true) {
$idiom = '_fr';
}
$inventory = json_decode(file_get_contents(wp_get_upload_dir()['basedir'] . '/data/inventory' . $idiom . '.json'), true);
return $inventory['vehicles'];
}
function get_vehicle_by_id($id)
{
$lbsettings = get_option('leadbox-settings');
$type = $lbsettings["dealer_information"];
if(strtolower($type) == "mixed"){
$vehicle_json_path_car = wp_get_upload_dir()['basedir'] . '/data/car_' . $id;
$idiom_path_car = makeUrl($vehicle_json_path_car);
$vehicle_json_path_rv = wp_get_upload_dir()['basedir'] . '/data/rv_' . $id;
$idiom_path_rv = makeUrl($vehicle_json_path_rv);
if (file_exists($idiom_path_rv)) {
return json_decode(file_get_contents($idiom_path_rv), true);
}
else if (file_exists($idiom_path_car)) {
return json_decode(file_get_contents($idiom_path_car), true);
}
else{
$vehicle_json_path = wp_get_upload_dir()['basedir'] . '/data/' . $id;
$idiom_path = makeUrl($vehicle_json_path);
if (file_exists($idiom_path)) {
return json_decode(file_get_contents($idiom_path), true);
}
}
}
else{
$vehicle_json_path = wp_get_upload_dir()['basedir'] . '/data/' . $id;
$idiom_path = makeUrl($vehicle_json_path);
if (file_exists($idiom_path)) {
return json_decode(file_get_contents($idiom_path), true);
}
}
return array();
}
function makeUrl($url)
{
$idiom = '';
$vehicle_json_path = $url . $idiom . '.json';
if (isFrench() == true) {
$idiom = '_fr';
$path_french = $url . $idiom . '.json';
if (file_exists($path_french)) {
$vehicle_json_path = $path_french;
}
}
return $vehicle_json_path;
}
function get_conditions_years_makes_models_count($inventory)
{
$result = [
'conditions' => [],
'years' => [],
'makes' => [],
'models' => []
];
$counter = 0;
foreach ($inventory as $element) {
// if(!in_array($element['condition'], $result['conditions']))
// $result['conditions'][] = $element['condition'];
// if(!in_array($element['year'], $result['years']))
// $result['years'] = $element['year'];
// if(!in_array($element['make'], $result['makes']))
// $result['makes'] = $element['make'];
// if(!in_array($element['model'], $result['models']))
// $result['models'] = $element['model'];
$counter++;
}
$result['count'] = $counter;
return $result;
}
function get_vehicles_by_id($array)
{
$vehicles = [];
for ($i = 0; $i < sizeof($array); $i++)
$vehicles[] = get_vehicle_by_id($array[$i]);
return $vehicles;
}
function set_previously_cookie_id($id)
{
$val = false;
if (isset($_COOKIE['previously-viewed'])) {
$data = json_decode($_COOKIE['previously-viewed'], true);
if (isset($data)) {
$exist = in_array($id, $data);
if (sizeof($data) >= 10 && !$exist) {
$reverse = array_reverse($data);
array_pop($reverse);
$data = array_reverse($reverse);
}
if ($exist) {
$data = array_diff($data, array($id));
}
if (isset($data)) {
array_push($data, $id);
$val = true;
}
}
}
if (!$val) {
$data = array();
array_push($data, $id);
}
setcookie("previously-viewed", json_encode(array_values($data)), time() + 3600, "/", $_SERVER['SERVER_NAME']);
}
function get_previously_viewed_vehicles()
{
if (isset($_COOKIE['previously-viewed'])) {
$data_ids = json_decode($_COOKIE['previously-viewed'], true);
$data = get_inventory();
$dataArray = $data;
$dataVehicles = $dataArray['vehicles'];
$previously = [];
if (isset($data_ids)) {
for ($a = 0; $a < sizeof($data_ids); $a++) {
for ($i = 0; $i < sizeof($dataVehicles); $i++) {
if ($data_ids[$a] == $dataVehicles[$i]['id']) {
$previously[] = $dataVehicles[$i];
}
}
if (sizeof($previously) >= 10)
break;
}
}
return array_reverse($previously);
}
}
function get_similar_vehicle($year, $make, $model, $condition = null, $locations = null, $type = null, $vin = null)
{
$data = get_inventory();
//$dataArray = json_decode($data, true);
$dataArray = $data;
$dataVehicles = $dataArray['vehicles'];
$similar = [];
for ($i = 0; $i < sizeof($dataVehicles); $i++) {
$flag = true;
$conditions = [
'year' => $year == $dataVehicles[$i]['year'],
'make' => $make == $dataVehicles[$i]['make'],
];
if ($type) {
$conditions['type'] = $type == $dataVehicles[$i]['type'];
unset($conditions['make']);
unset($conditions['year']);
} else {
$conditions['model'] = $model == $dataVehicles[$i]['model'];
}
// Si 'similar_type' es "type", no necesitamos verificar 'make' cuando $type es true
// if (($GENIUS['vdp-similars']['data']['similar_type'] ?? null) === 'type' && !empty($type)) {
// unset($conditions['make']);
// }
$flag = !in_array(false, $conditions, true);
if ($condition && $condition != $dataVehicles[$i]['condition'])
$flag = false;
if ($locations && !in_array($dataVehicles[$i]['location'], $locations))
$flag = false;
if ($vin === $dataVehicles[$i]['vin'])
$flag = false;
if ($flag)
$similar[] = $dataVehicles[$i];
if (sizeof($similar) >= 6)
break;
}
return $similar;
}
function get_vdp_slug($vehicle, $lang = 'en')
{
$view = 'vue';
if (strpos($lang, 'en') !== false) {
$view = 'view';
}
//$vehicle = get_vehicle_by_id($id);
if (isset($vehicle) && array_key_exists("id", $vehicle) && $vehicle["id"] > 0) {
return "/" . $view . "/" . strtolower($vehicle['condition']) . "-" . strtolower($vehicle['year']) . "-" . strtolower(str_replace(' ', '-', $vehicle['make'])) . "-" . strtolower(str_replace(' ', '-', $vehicle['model'])) . "-" . $vehicle['id']."/";
} else
return null;
}
function currency_format($n)
{
$lang = get_locale();
$value = floor(floatval($n)); // Truncate decimals, don't round
if ($lang == 'fr_CA')
return (number_format($value, 0, ',', ' ')) . ' $';
else
return "$" . (number_format($value, 0));
}
function get_image_path()
{
$lang = get_locale();
$img_slug = ($lang == 'fr_CA') ? '/assets/images/fr/' : '/assets/images/';
return get_fileIn('/assets/images/') . $img_slug;
}
function get_model_trims($model)
{
$arrContextOptions = array(
"ssl" => array(
"verify_peer" => false,
"verify_peer_name" => false,
),
);
$lbsettings = get_option('leadbox-settings');
$url = "https://v5websitescdn.blob.core.windows.net/v5cdn/components/model-trim/".strtolower($lbsettings["manufacturer"])."/";
$imgUrl = "https://v5websitescdn.blob.core.windows.net/v5cdn/components/model-trim/".strtolower($lbsettings["manufacturer"])."/";
$filename = "model-trims.json";
$dealer = get_option('dealer-settings-contact-options');
// Custom Trimselector json
if(isset($lbsettings) && isset($lbsettings["trimselector"]) && !empty($lbsettings["trimselector"]) && strtolower($lbsettings["trimselector"]) == 'custom')
{
if(isset($dealer) && !empty($dealer) && isset($dealer["dealer_name"]) && !empty($dealer["dealer_name"])){
$dealername = preg_replace('/[^A-Za-z0-9\-]/', '', $dealer["dealer_name"]);
if(_isFrench()) {
$filename = "model-trims-".strtolower(str_replace(" ","",$dealername))."-fr.json";
}
else {
$filename = "model-trims-".strtolower(str_replace(" ","",$dealername)).".json";
}
}
}
else{
if(_isFrench()) {
$filename = "model-trims-fr.json";
}
}
$modelTrims = json_decode(file_get_contents($url.$filename, false, stream_context_create($arrContextOptions)), true);
$modifiedModelTrims = [];
foreach ($modelTrims as $key => $value) {
$modifiedModelTrims[str_replace(' ', '-', strtolower($key))] = $value;
}
// dd('more?', $modifiedModelTrims, $model);
return ['imgUrl' => $imgUrl, 'trims' => $modifiedModelTrims[$model] ?? []];
}
function hasChild()
{
$padre = get_template_directory();
$hijo = get_stylesheet_directory();
if ($padre == $hijo) {
return false;
} else {
return true;
}
}
function get_genius_include_path($component_name, $incoming_version = null, $kind = null)
{
$kind_str = '';
if(!is_null($kind) && strtolower($kind) != 'car')
$kind_str = $kind . '-';
$version = $incoming_version ?? GENIUS[$component_name][$kind_str . 'version'] ?? GENIUS[$component_name]['version'] ?? 1;
if (file_exists(get_template_directory() . '/resources/views/cl/' . $component_name . '/' . $version . '.blade.php'))
return 'cl.' . $component_name . '.' . $version;
else
return 'cl.' . $component_name . '.1';
}
function get_genius_include_layout_path($layout_name, $incoming_version = null, $kind = null)
{
$kind_str = '';
if(!is_null($kind) && strtolower($kind) != 'car')
$kind_str = $kind . '-';
$version = $incoming_version ?? GENIUS[$layout_name][$kind_str . 'version'] ?? GENIUS[$component_name]['version'] ?? 1;
if (file_exists(get_template_directory() . '/resources/views/layouts/' . $layout_name . '/' . $version . '.blade.php'))
return 'layouts.' . $layout_name . '.' . $version;
else
return 'layouts.' . $layout_name . '.1';
}
function enqueue_wp_util()
{
// Option 1: Manually enqueue the wp-util library.
wp_enqueue_script('wp-util');
}
add_action('wp_ajax_nopriv_get_leadbox_inventory_from_plugin', 'get_leadbox_inventory_from_plugin');
add_action('wp_ajax_get_leadbox_inventory_from_plugin', 'get_leadbox_inventory_from_plugin');
function get_leadbox_inventory_from_plugin()
{
$inventory = get_inventory();
// filtering middleware
// $filtered = post_filter($inventory['vehicles'], []);
$filtered = $inventory['vehicles'];
wp_send_json_success(json_encode($filtered));
}
add_action('wp_enqueue_scripts', 'enqueue_wp_util');
function write_log_leadbox($log_msg)
{
$log_filename = "logs";
if (!file_exists($log_filename)) {
mkdir($log_filename, 0777, true);
}
$log_file_data = $log_filename . '/debuger.log';
file_put_contents($log_file_data, $log_msg . "\n", FILE_APPEND);
}
add_action("admin_head", function () {
echo "<style>#screen-options-link-wrap {display:none}</style>";
});
function getCurrentUrlLBX(){
return $_SERVER['HTTP_REFERER'];
}
function getLBXUrlQuerys()
{
$val = 0;
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
$actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$parts = parse_url($actual_link);
if (isset($parts['query'])) {
parse_str($parts['query'], $query);
if(isset($query['gclid'])){
$_SESSION["gclid"] = $query['gclid'];
}
if(isset($query['utm_campaign'])){
$_SESSION["utm_campaign"] = $query['utm_campaign'];
}
if(isset($query['utm_medium'])){
$_SESSION["utm_medium"] = $query['utm_medium'];
}
if(isset($query['utm_source'])){
$_SESSION["utm_source"] = $query['utm_source'];
}
}
}
function setDataGoogleSheet(){
leadbox_logger()->info('Google Sheets sync started', array(
'site' => $_SERVER['SERVER_NAME'] ?? 'unknown',
));
try {
require_once __DIR__ . '/../vendor/autoload.php';
$client = new Google_Client();
$client->setApplicationName('Google Sheets API PHP Quickstart');
$client->setScopes(Google_Service_Sheets::SPREADSHEETS);
$client->setAuthConfig(__DIR__ .'/creds.json');
$client->setAccessType('offline');
$sheets = new Google_Service_Sheets($client);
$spreadsheetId = '1fDrm3XQeh21MESuW-_YrSixa-u0Jj3nh3Qclj5xAswc';
// The first row contains the column titles, so lets start pulling data from row 2
$currentRow = 2;// Inicia desde la fila 2
$updated = false;
$range = 'A2:BK';
$rows = $sheets->spreadsheets_values->get($spreadsheetId, $range, ['majorDimension' => 'ROWS']);
$classRow = prepareData();
$addRows = [$classRow]; // you can append several rows at once
if (isset($rows['values'])) {
foreach ($rows['values'] as $row) {
if($_SERVER['SERVER_NAME'] == $row[0]){
//* Si el ID coincide, actualiza la fila
$updateRange = 'Sheet1!A'.$currentRow.'';
$updateBody = new Google_Service_Sheets_ValueRange();
$updateBody->setValues($addRows);
$sheets->spreadsheets_values->update(
$spreadsheetId,
$updateRange,
$updateBody,
['valueInputOption' => 'USER_ENTERED']
);
$updated = true;
break; // Sale del bucle ya que encontró y actualizó la fila
}
$currentRow++;
}
}
if(!$updated){
// Si no se encontró ninguna fila con el ID, agrega una nueva fila
$updateRange = 'Sheet1';
$updateBody = new Google_Service_Sheets_ValueRange();
$updateBody->setValues($addRows);
$sheets->spreadsheets_values->append(
$spreadsheetId,
$updateRange,
$updateBody,
['valueInputOption' => 'USER_ENTERED']);
}
leadbox_logger()->info('Google Sheets sync completed successfully', array(
'site' => $_SERVER['SERVER_NAME'] ?? 'unknown',
'updated' => $updated ? 'existing row' : 'new row',
));
wp_send_json_success(array(
'message' => 'Updated successfully.',
'reload' => false
));
} catch (Exception $e){
leadbox_logger()->error('Google Sheets sync failed', array(
'site' => $_SERVER['SERVER_NAME'] ?? 'unknown',
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
));
wp_send_json_error(array('message' => 'Error: ' . $e->getMessage()));
}
}
function prepareData(){
$value = [];
$lbsettings = get_option('leadbox-settings');
$contact = get_option('dealer-settings-contact-options');
$domain = $_SERVER['SERVER_NAME'];
$dealer_name = $contact['dealer_name'];
$group_name = $lbsettings['additional_info_group_name'];
$primary_make = $lbsettings['manufacturer'];
$oem_program = $lbsettings['oem_program'];
$city = $contact['address_city'];
$state = $contact['address_province'];
$country = "Canada";
$live_date = $lbsettings['additional_info_live_data'];
$purpose = $lbsettings['additional_info_purpose'];
$leadbox_billing = $lbsettings['additional_info_billing'];
if(isKinstaUrl()){
$status = "on develpment";
}else{
$status = "Live";
}
$main_languague = get_locale();
$header = component_version_info('header');
$navigation = component_version_info('navigation');
$omnisearch = component_version_info('omnisearch');
$socialBar = component_version_info('social-bar');
$footer = component_version_info('footer');
$hoursFooter = component_version_info('hours-footer');
$lineup = component_version_info('lineup');
$srpLayout = component_version_info('srp-layout');
$srpTitle = component_version_info('srp-title');
$srpColorizer = component_version_info('srp-colorizer');
$srpSearchables = component_version_info('srp-searchables');
$srp_filter = component_version_info('filter');
$srp_finance = component_version_info('srp-finance');
$srp_lease = component_version_info('srp-lease');
$vehicle_card = component_version_info('vehicle-card');
$vdp_layout = component_version_info('vdp-layout');
$print_vdp_layout = component_version_info('print-vdp-layout');
$vdp_title = component_version_info('vdp-title');
$vdp_gallery =component_version_info('vdp-gallery');
$vdp_pricing =component_version_info('vdp-pricing');
$vdp_financing = component_version_info('vdp-finance');
$vdp_similars = component_version_info('vdp-similars');
$vdp_cta = component_version_info('vdp-cta');
$vdp_disclaimer = component_version_info('vdp-disclaimer');
$vdp_vehicle_features = component_version_info('vdp-vehicle-features');
$vdp_model_banner = component_version_info('vdp-model-banner');
$vdp_key_features = component_version_info('vdp-key-features');
$vdp_installed_options = component_version_info('vdp-installed-options');
$vdp_sticky_header = component_version_info('vdp-sticky-header');
$vdp_vehicle_description = component_version_info('vdp-vehicle-description');
$vdp_fuel_economy = component_version_info('vdp-fuel-economy');
$srp_payment_calculator = component_version_info('srp-payment-calculator');
$vdp_payment_calculator = component_version_info('vdp-payment-calculator');
$vdp_upgrades = component_version_info('vdp-upgrades');
$blog_list = component_version_info('blog-list');
$blog_entry_meta = component_version_info('blog-entry-meta');
$comparison = component_version_info('comparison');
$comparison_card = component_version_info('comparison-card');
$comparison_card_thumb = component_version_info('comparison-card-thumb');
$comparison_card_phantom = component_version_info('comparison-card-phantom');
$comparison_key_features = component_version_info('comparison-key-features');
$comparison_key_features_title = component_version_info('comparison-key-features-title');
$model_trims = component_version_info('model-trims');
// Verificar existencia de claves antes de acceder a ellas
$live_agent = validateServices(isset($lbsettings['live_agent']) ? $lbsettings['live_agent'] : '');
$carfax = validateServices(isset($lbsettings['carfax']) ? $lbsettings['carfax'] : '');
$iboost = validateServices(isset($lbsettings['iboost']) ? $lbsettings['iboost'] : '');
$moto_insights = validateServices(isset($lbsettings['moto_insight']) ? $lbsettings['moto_insight'] : '');
$vinn = validateServices(isset($lbsettings['vinn']) ? $lbsettings['vinn'] : '');
$cartender = validateServices(isset($lbsettings['cartender']) ? $lbsettings['cartender'] : '');
$ga_token = isset($lbsettings['google_analytics_id']) ? $lbsettings['google_analytics_id'] : '';
$gtm_token = isset($lbsettings['google_tag_manager_token']) ? $lbsettings['google_tag_manager_token'] : '';
array_push($value, $domain, $dealer_name, $group_name, $primary_make, $oem_program, $city, $state, $country, $live_date, $purpose, $status, $leadbox_billing, $main_languague, $header, $navigation, $omnisearch, $socialBar, $footer, $hoursFooter, $lineup, $srpLayout, $srpTitle, $srpColorizer, $srpSearchables, $srp_filter, $srp_finance, $srp_lease, $vehicle_card, $vdp_layout, $print_vdp_layout, $vdp_title, $vdp_gallery, $vdp_pricing, $vdp_financing, $vdp_similars, $vdp_cta, $vdp_disclaimer, $vdp_vehicle_features, $vdp_model_banner, $vdp_key_features, $vdp_installed_options, $vdp_sticky_header, $vdp_vehicle_description, $vdp_fuel_economy, $srp_payment_calculator, $vdp_payment_calculator, $vdp_upgrades, $blog_list, $blog_entry_meta, $comparison, $comparison_card, $comparison_card_thumb, $comparison_card_phantom, $comparison_key_features, $comparison_key_features_title, $model_trims, $live_agent, $carfax, $iboost, $moto_insights, $vinn, $cartender, $ga_token, $gtm_token);
return $value;
}
function validateServices($lbsettings){
if($lbsettings == "Enabled")
return 'yes';
else
return 'no';
}
function component_version_info($component)
{
$childPartial = get_stylesheet_directory() . '/views/partials/' . $component . '.blade.php';
$childCl = get_stylesheet_directory() . '/views/cl/' . $component;
$default = 1;
// Verificar si GENIUS[$component] existe y tiene version
$genius_version = null;
if (isset(GENIUS[$component]) && is_array(GENIUS[$component]) && isset(GENIUS[$component]['version'])) {
$genius_version = GENIUS[$component]['version'];
}
if (hasChild()) {
if (file_exists($childPartial)) {
$default = $genius_version ? $genius_version . ' (Custom)' : 'N/A (Custom)';
} else if (file_exists($childCl)) {
$default = $genius_version ? $genius_version . ' (Custom)' : 'N/A (Custom)';
} else {
$default = $genius_version ? $genius_version : 'N/A';
}
} else {
if (file_exists($childPartial)) {
$default = $genius_version ? $genius_version : 'N/A';
} else if (file_exists($childCl)) {
$default = $genius_version ? $genius_version : 'N/A';
} else {
$default = $genius_version ? $genius_version : 'N/A';
}
}
if (is_null($default) || $default === 0)
return 'N/A ' . $component;
return $default;
}
add_action('send_data_to_sheed_event', 'setDataGoogleSheet');
/**
* Register weekly cron to send data to Google Sheets
*
* Executes once per week to sync site data with Google Sheets
*/
function register_google_sheets_sync_cron() {
$event = wp_get_scheduled_event('send_data_to_sheed_event');
// If no event exists, schedule it
if (!$event) {
wp_schedule_event(time() + 3600, 'weekly', 'send_data_to_sheed_event');
leadbox_logger()->info('Google Sheets sync cron scheduled', array(
'next_run' => date('Y-m-d H:i:s', time() + 3600),
'recurrence' => 'weekly',
));
}
// If event exists but has wrong schedule, reschedule it
elseif (($event->schedule ?? '') !== 'weekly') {
wp_unschedule_event($event->timestamp, 'send_data_to_sheed_event', $event->args ?? []);
wp_schedule_event(time() + 3600, 'weekly', 'send_data_to_sheed_event');
leadbox_logger()->info('Google Sheets sync cron rescheduled', array(
'old_schedule' => $event->schedule ?? 'unknown',
'new_schedule' => 'weekly',
'next_run' => date('Y-m-d H:i:s', time() + 3600),
));
}
}
add_action('admin_init', 'register_google_sheets_sync_cron');
add_filter('cron_schedules', function($s){
$s['every_2_hours'] = ['interval'=>2*HOUR_IN_SECONDS,'display'=>'Every 2 Hours'];
return $s;
});
function register_retry_failed_leads_cron() {
$event = wp_get_scheduled_event('retry_failed_leads_cron');
if (!$event) {
wp_schedule_event(time() + 300, 'every_2_hours', 'retry_failed_leads_cron');
} elseif (($event->schedule ?? '') !== 'every_2_hours') {
wp_unschedule_event($event->timestamp, 'retry_failed_leads_cron', $event->args ?? []);
wp_schedule_event(time() + 300, 'every_2_hours', 'retry_failed_leads_cron');
}
}
add_action('admin_init', 'register_retry_failed_leads_cron');
function retry_failed_leads_cron_callback() {
$leadbox = new NF_Actions_PushLead();
$leadbox->retryFailedLeads();
}
add_action('retry_failed_leads_cron', 'retry_failed_leads_cron_callback');
//* Register Custom Post Type Offer
function offer_post_type() {
$labels = array(
'name' => _x( 'Offers', 'Post Type General Name', 'text_domain' ),
'singular_name' => _x( 'Offer', 'Post Type Singular Name', 'text_domain' ),
'menu_name' => __( 'Offers', 'text_domain' ),
'name_admin_bar' => __( 'Offers', 'text_domain' ),
'archives' => __( 'Offer Archives', 'text_domain' ),
'attributes' => __( 'Offer Attributes', 'text_domain' ),
'parent_item_colon' => __( 'Parent Offer:', 'text_domain' ),
'all_items' => __( 'All Offers', 'text_domain' ),
'add_new_item' => __( 'Add New Offer', 'text_domain' ),
'add_new' => __( 'Add New Offer', 'text_domain' ),
'new_item' => __( 'New Offer', 'text_domain' ),
'edit_item' => __( 'Edit Offer', 'text_domain' ),
'update_item' => __( 'Update Offer', 'text_domain' ),
'view_item' => __( 'View Offer', 'text_domain' ),
'view_items' => __( 'View Offers', 'text_domain' ),
'search_items' => __( 'Search Offer', 'text_domain' ),
'not_found' => __( 'Offer Not found', 'text_domain' ),
'not_found_in_trash' => __( 'Offer Not found in Trash', 'text_domain' ),
'featured_image' => __( 'Featured Image', 'text_domain' ),
'set_featured_image' => __( 'Set featured image', 'text_domain' ),
'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
'use_featured_image' => __( 'Use as featured image', 'text_domain' ),
'insert_into_item' => __( 'Insert into Offer', 'text_domain' ),
'uploaded_to_this_item' => __( 'Uploaded to this Offer', 'text_domain' ),
'items_list' => __( 'Offer list', 'text_domain' ),
'items_list_navigation' => __( 'Offer list navigation', 'text_domain' ),
'filter_items_list' => __( 'Filter Offers list', 'text_domain' ),
);
$args = array(
'label' => __( 'Offer', 'text_domain' ),
'description' => __( 'Promotional offers management', 'text_domain' ),
'labels' => $labels,
'supports' => array(
'title',
'editor',
'thumbnail',
'revisions',
'custom-fields',
'page-attributes'
),
'taxonomies' => array(), // Eliminar category y post_tag a menos que realmente los necesites
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'menu_position' => 27,
'menu_icon' => 'dashicons-analytics', // Icono más adecuado para ofertas
'show_in_admin_bar' => true,
'show_in_nav_menus' => false,
'can_export' => true,
'has_archive' => false, // O 'offers' para slug personalizado
'rewrite' => false/* array(
'slug' => 'offers', // Slug amigable para URLs
'with_front' => false
) */,
'exclude_from_search' => false,
'publicly_queryable' => false,
'capability_type' => 'post',
'show_in_rest' => true, // Habilitar para Gutenberg
);
register_post_type( 'offer', $args ); // ¡Corregir el nombre aquí!
register_taxonomy('offer_category', 'offer', [
'label' => 'Offer Categories',
'hierarchical' => true,
'show_ui' => true,
'show_admin_column' => true,
'rewrite' => false,
'show_in_rest' => true,
]);
}
add_action( 'init', 'offer_post_type', 0 );
function register_offer_taxonomy() {
$labels = array(
'name' => __( 'Categories', 'text_domain' ),
'singular_name' => __( 'Category', 'text_domain' ),
'all_items' => __( 'All Categories', 'text_domain' ),
'edit_item' => __( 'Edit Category', 'text_domain' ),
'view_item' => __( 'View Category', 'text_domain' ),
'update_item' => __( 'Update Category', 'text_domain' ),
'add_new_item' => __( 'Add New Category', 'text_domain' ),
'new_item_name' => __( 'New Category Name', 'text_domain' ),
'menu_name' => __( 'Categories', 'text_domain' ),
);
$args = array(
'hierarchical' => true, // Como categorías (no tags)
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => false,
'show_in_rest' => true,
'rewrite' => false, // Desactiva uso del slug en URLs
'public' => false, // No accesible en el front
);
register_taxonomy( 'offer_category', array( 'offer' ), $args );
}
add_action( 'init', 'register_offer_taxonomy', 0 );
function hide_unwanted_category_fields() {
$screen = get_current_screen();
// Aplica solo a la taxonomía personalizada 'offer_category'
if ( $screen->taxonomy === 'offer_category' ) {
echo '
<style>
.term-slug-wrap,
.term-parent-wrap,
.term-description-wrap,
th.column-slug,
td.slug.column-slug,
th.column-description,
td.description.column-description {
display: none !important;
}
</style>';
}
}
add_action( 'admin_head', 'hide_unwanted_category_fields' );
//* Añadir columnas personalizadas al listado de offers
function add_offer_date_columns($columns) {
$new_columns = array(
'start_date' => __('Start Date', 'text_domain'),
'end_date' => __('End Date', 'text_domain'),
);
// Insertar después de la columna de título
return array_slice($columns, 0, 2, true) + $new_columns + array_slice($columns, 2, null, true);
}
add_filter('manage_offer_posts_columns', 'add_offer_date_columns');
//* Mostrar los valores en las nuevas columnas
function show_offer_date_columns($column, $post_id) {
switch ($column) {
case 'start_date':
$start_date = get_post_meta($post_id, '_offer_start_date', true);
echo $start_date ? date('Y/m/d', strtotime($start_date)) : '—';
break;
case 'end_date':
$end_date = get_post_meta($post_id, '_offer_end_date', true);
echo $end_date ? date('Y/m/d', strtotime($end_date)) : '—';
break;
}
}
add_action('manage_offer_posts_custom_column', 'show_offer_date_columns', 10, 2);
//* Hacer que las columnas sean ordenables
function make_offer_date_columns_sortable($columns) {
$columns['start_date'] = 'start_date';
$columns['end_date'] = 'end_date';
return $columns;
}
add_filter('manage_edit-offer_sortable_columns', 'make_offer_date_columns_sortable');
//* Modificar la consulta para ordenar por las fechas
function sort_offers_by_date($query) {
if (!is_admin() || !$query->is_main_query() || $query->get('post_type') !== 'offer') {
return;
}
$orderby = $query->get('orderby');
if ($orderby === 'start_date') {
$query->set('meta_key', '_offer_start_timestamp');
$query->set('orderby', 'meta_value_num');
} elseif ($orderby === 'end_date') {
$query->set('meta_key', '_offer_end_timestamp');
$query->set('orderby', 'meta_value_num');
}
}
add_action('pre_get_posts', 'sort_offers_by_date');
// Agregar columna de categoría en la lista de ofertas
function add_offer_category_column($columns) {
$columns['offer_category'] = __('Category', 'text_domain');
return $columns;
}
add_filter('manage_offer_posts_columns', 'add_offer_category_column');
// Mostrar el valor de la categoría
function show_offer_category_column($column, $post_id) {
if ($column === 'offer_category') {
$terms = get_the_terms($post_id, 'offer_category');
if (!empty($terms) && !is_wp_error($terms)) {
$term_names = wp_list_pluck($terms, 'name');
echo implode(', ', $term_names);
} else {
echo __('No Category', 'text_domain');
}
}
}
add_action('manage_offer_posts_custom_column', 'show_offer_category_column', 10, 2);
function offer_sortable_columns($columns) {
$columns['offer_category'] = 'offer_category';
return $columns;
}
add_filter('manage_edit-offer_sortable_columns', 'offer_sortable_columns');
//* Añadir metaboxes a la pantalla de edición de ofertas
function add_offer_metaboxes() {
add_meta_box(
'offer_details_meta',
__('Offer Details', 'text_domain'),
'render_offer_details_meta',
'offer',
'normal',
'high'
);
add_meta_box(
'offer_cta_meta',
__('Call to Action', 'text_domain'),
'render_offer_cta_meta',
'offer',
'normal',
'high'
);
add_meta_box(
'offer_dates_meta',
__('Offer Dates', 'text_domain'),
'render_offer_dates_meta',
'offer',
'side',
'default'
);
}
add_action('add_meta_boxes', 'add_offer_metaboxes');
//* Renderizar el metabox del disclaimer
function render_offer_details_meta($post) {
wp_nonce_field('save_offer_meta', 'offer_meta_nonce');
$disclaimer = get_post_meta($post->ID, '_offer_disclaimer', true);
echo '<div style="margin-bottom: 20px;">';
echo '<label for="offer_disclaimer" style="display: block; margin-bottom: 5px; font-weight: bold;">';
echo __('Disclaimer', 'text_domain');
echo '</label>';
echo '<textarea id="offer_disclaimer" name="offer_disclaimer" style="width: 100%; min-height: 80px;">';
echo esc_textarea($disclaimer);
echo '</textarea>';
echo '</div>';
}
//* Renderizar el metabox de los CTA
function render_offer_cta_meta($post) {
// Main CTA
$main_cta_label = get_post_meta($post->ID, '_offer_main_cta_label', true);
$main_cta_value = get_post_meta($post->ID, '_offer_main_cta_value', true);
$main_cta_target = get_post_meta($post->ID, '_offer_main_cta_target', true);
$main_cta_color = get_post_meta($post->ID, '_offer_main_cta_color', true);
// Secondary CTA
$secondary_cta_label = get_post_meta($post->ID, '_offer_secondary_cta_label', true);
$secondary_cta_value = get_post_meta($post->ID, '_offer_secondary_cta_value', true);
$secondary_cta_target = get_post_meta($post->ID, '_offer_secondary_cta_target', true);
$secondary_cta_color = get_post_meta($post->ID, '_offer_secondary_cta_color', true);
// Check if colors should use default (null/empty)
$main_cta_use_default = empty($main_cta_color);
$secondary_cta_use_default = empty($secondary_cta_color);
echo '<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;">';
// Main CTA
echo '<div>';
echo '<h3 style="margin-top: 0;">' . __('Main CTA', 'text_domain') . '</h3>';
echo '<div style="margin-bottom: 15px;">';
echo '<label style="display: block; margin-bottom: 5px;">' . __('Label', 'text_domain') . '</label>';
echo '<input maxlength="24" type="text" name="offer_main_cta_label" value="' . esc_attr($main_cta_label) . '" style="width: 100%;">';
echo '</div>';
echo '<div style="margin-bottom: 15px;">';
echo '<label style="display: block; margin-bottom: 5px;">' . __('URL', 'text_domain') . '</label>';
echo '<input type="url" name="offer_main_cta_value" value="' . esc_url($main_cta_value) . '" style="width: 100%;">';
echo '</div>';
echo '<div style="margin-bottom: 15px;">';
echo '<label style="display: block; margin-bottom: 5px;">' . __('Target', 'text_domain') . '</label>';
echo '<select name="offer_main_cta_target" style="width: 100%;">';
echo '<option value="_self" ' . selected($main_cta_target, '_self', false) . '>' . __('Same Page', 'text_domain') . '</option>';
echo '<option value="_blank" ' . selected($main_cta_target, '_blank', false) . '>' . __('New Page', 'text_domain') . '</option>';
echo '</select>';
echo '</div>';
echo '<div>';
echo '<label style="display: block; margin-bottom: 5px;">' . __('Button Color', 'text_domain') . '</label>';
echo '<div style="display: flex; align-items: center; gap: 10px;">';
echo '<input type="color" id="offer_main_cta_color" name="offer_main_cta_color" value="' . esc_attr($main_cta_color ?: '#000000') . '" style="width: 100px; height: 40px; cursor: pointer; border: 1px solid #ddd; border-radius: 4px;' . ($main_cta_use_default ? ' opacity: 0.5;' : '') . '"' . ($main_cta_use_default ? ' disabled' : '') . '>';
echo '<label style="display: flex; align-items: center; gap: 5px; cursor: pointer;">';
echo '<input type="checkbox" name="offer_main_cta_use_default" value="1"' . checked($main_cta_use_default, true, false) . ' onchange="document.getElementById(\'offer_main_cta_color\').disabled = this.checked; document.getElementById(\'offer_main_cta_color\').style.opacity = this.checked ? \'0.5\' : \'1\';">';
echo '<span>' . __('Use default', 'text_domain') . '</span>';
echo '</label>';
echo '</div>';
echo '</div>';
echo '</div>';
// Secondary CTA
echo '<div>';
echo '<h3 style="margin-top: 0;">' . __('Secondary CTA', 'text_domain') . '</h3>';
echo '<div style="margin-bottom: 15px;">';
echo '<label style="display: block; margin-bottom: 5px;">' . __('Label', 'text_domain') . '</label>';
echo '<input maxlength="24" type="text" name="offer_secondary_cta_label" value="' . esc_attr($secondary_cta_label) . '" style="width: 100%;">';
echo '</div>';
echo '<div style="margin-bottom: 15px;">';
echo '<label style="display: block; margin-bottom: 5px;">' . __('URL', 'text_domain') . '</label>';
echo '<input type="url" name="offer_secondary_cta_value" value="' . esc_url($secondary_cta_value) . '" style="width: 100%;">';
echo '</div>';
echo '<div style="margin-bottom: 15px;">';
echo '<label style="display: block; margin-bottom: 5px;">' . __('Target', 'text_domain') . '</label>';
echo '<select name="offer_secondary_cta_target" style="width: 100%;">';
echo '<option value="_self" ' . selected($secondary_cta_target, '_self', false) . '>' . __('Same page', 'text_domain') . '</option>';
echo '<option value="_blank" ' . selected($secondary_cta_target, '_blank', false) . '>' . __('New page', 'text_domain') . '</option>';
echo '</select>';
echo '</div>';
echo '<div>';
echo '<label style="display: block; margin-bottom: 5px;">' . __('Button Color', 'text_domain') . '</label>';
echo '<div style="display: flex; align-items: center; gap: 10px;">';
echo '<input type="color" id="offer_secondary_cta_color" name="offer_secondary_cta_color" value="' . esc_attr($secondary_cta_color ?: '#000000') . '" style="width: 100px; height: 40px; cursor: pointer; border: 1px solid #ddd; border-radius: 4px;' . ($secondary_cta_use_default ? ' opacity: 0.5;' : '') . '"' . ($secondary_cta_use_default ? ' disabled' : '') . '>';
echo '<label style="display: flex; align-items: center; gap: 5px; cursor: pointer;">';
echo '<input type="checkbox" name="offer_secondary_cta_use_default" value="1"' . checked($secondary_cta_use_default, true, false) . ' onchange="document.getElementById(\'offer_secondary_cta_color\').disabled = this.checked; document.getElementById(\'offer_secondary_cta_color\').style.opacity = this.checked ? \'0.5\' : \'1\';">';
echo '<span>' . __('Use default', 'text_domain') . '</span>';
echo '</label>';
echo '</div>';
echo '</div>';
echo '</div>';
echo '</div>'; // Cierre del grid
}
//* Renderizar el metabox de las fechas de la oferta
function render_offer_dates_meta($post) {
$start_date = get_post_meta($post->ID, '_offer_start_date', true);
$end_date = get_post_meta($post->ID, '_offer_end_date', true);
echo '<div style="margin-bottom: 15px;">';
echo '<label style="display: block; margin-bottom: 5px; font-weight: bold;">' . __('Start Date', 'text_domain') . '</label>';
echo '<input type="date" name="offer_start_date" value="' . esc_attr($start_date) . '" style="width: 100%;">';
echo '</div>';
echo '<div>';
echo '<label style="display: block; margin-bottom: 5px; font-weight: bold;">' . __('End Date', 'text_domain') . '</label>';
echo '<input type="date" name="offer_end_date" value="' . esc_attr($end_date) . '" style="width: 100%;">';
echo '</div>';
}
//* Guardar los campos personalizados de las ofertas
function save_offer_meta($post_id) {
// Verificar nonce
if (!isset($_POST['offer_meta_nonce']) || !wp_verify_nonce($_POST['offer_meta_nonce'], 'save_offer_meta')) {
return;
}
// Verificar permisos
if (!current_user_can('edit_post', $post_id)) {
return;
}
// Bandera para mensajes
$message_code = false;
$dates_swapped = false;
$has_invalid_html = false;
// Campos a guardar con sus respectivos sanitizadores
$fields = array(
'offer_disclaimer' => 'sanitize_textarea_field',
'offer_main_cta_value' => 'esc_url_raw',
'offer_secondary_cta_value' => 'esc_url_raw',
'offer_main_cta_label' => 'sanitize_text_field',
'offer_main_cta_target' => 'sanitize_text_field',
'offer_main_cta_color' => 'sanitize_hex_color',
'offer_secondary_cta_label' => 'sanitize_text_field',
'offer_secondary_cta_target' => 'sanitize_text_field',
'offer_secondary_cta_color' => 'sanitize_hex_color',
'offer_start_date' => 'sanitize_text_field',
'offer_end_date' => 'sanitize_text_field'
);
// Handle "Use default" checkboxes for CTA colors - set to empty string if checked
if (isset($_POST['offer_main_cta_use_default'])) {
update_post_meta($post_id, '_offer_main_cta_color', '');
unset($fields['offer_main_cta_color']); // Don't process this field in the loop
}
if (isset($_POST['offer_secondary_cta_use_default'])) {
update_post_meta($post_id, '_offer_secondary_cta_color', '');
unset($fields['offer_secondary_cta_color']); // Don't process this field in the loop
}
// Procesar campos estándar
foreach ($fields as $field => $sanitizer) {
if (isset($_POST[$field])) {
$value = call_user_func($sanitizer, $_POST[$field]);
update_post_meta($post_id, '_' . $field, $value);
}
}
// Manejo especial para la descripción (verificación de HTML)
if (isset($_POST['offer_description'])) {
$allowed_html = array(
'a' => array('href' => array(), 'title' => array(), 'target' => array(), 'style' => array(), 'class' => array()),
'br' => array(),
'em' => array('style' => array(), 'class' => array()),
'strong' => array('style' => array(), 'class' => array()),
'p' => array('style' => array(), 'class' => array()),
'span' => array('style' => array(), 'class' => array()),
'div' => array('style' => array(), 'class' => array()),
'ul' => array('style' => array(), 'class' => array()),
'ol' => array('style' => array(), 'class' => array()),
'li' => array('style' => array(), 'class' => array()),
'h1' => array('style' => array(), 'class' => array()),
'h2' => array('style' => array(), 'class' => array()),
'h3' => array('style' => array(), 'class' => array()),
'h4' => array('style' => array(), 'class' => array()),
'h5' => array('style' => array(), 'class' => array()),
'h6' => array('style' => array(), 'class' => array()),
'img' => array('src' => array(), 'alt' => array(), 'title' => array(), 'width' => array(), 'height' => array(), 'srcset' => array(), 'sizes' => array(), 'loading' => array(), 'style' => array(), 'class' => array()),
'blockquote' => array('cite' => array(), 'style' => array(), 'class' => array()),
'del' => array('datetime' => array(), 'style' => array(), 'class' => array()),
'ins' => array('datetime' => array(), 'style' => array(), 'class' => array()),
'code' => array('style' => array(), 'class' => array()),
);
$original_description = $_POST['offer_description'];
$sanitized_description = wp_kses($original_description, $allowed_html);
// Verificar si se eliminó algún HTML no permitido
if ($original_description !== $sanitized_description) {
$has_invalid_html = true;
}
update_post_meta($post_id, '_offer_description', $sanitized_description);
}
// Manejo especial para fechas
$start_date = isset($_POST['offer_start_date']) ? $_POST['offer_start_date'] : '';
$end_date = isset($_POST['offer_end_date']) ? $_POST['offer_end_date'] : '';
if (!empty($start_date) && !empty($end_date)) {
if (strtotime($end_date) < strtotime($start_date)) {
// Intercambiar fechas si están invertidas
$temp = $start_date;
$start_date = $end_date;
$end_date = $temp;
$dates_swapped = true;
update_post_meta($post_id, '_offer_start_date', sanitize_text_field($start_date));
update_post_meta($post_id, '_offer_end_date', sanitize_text_field($end_date));
}
}
// Guardar timestamps para ordenamiento
$start_timestamp = !empty($start_date) ? strtotime($start_date . ' 00:00:00') : 0;
$end_timestamp = !empty($end_date) ? strtotime($end_date . ' 23:59:59') : PHP_INT_MAX;
update_post_meta($post_id, '_offer_start_timestamp', $start_timestamp);
update_post_meta($post_id, '_offer_end_timestamp', $end_timestamp);
// Crear meta clave especial para ordenamiento
$sorting_key = $end_timestamp;
update_post_meta($post_id, '_offer_sorting_key', $sorting_key);
// Determinar qué mensaje mostrar
if ($dates_swapped && $has_invalid_html) {
$message_code = 13; // Ambos casos
} elseif ($dates_swapped) {
$message_code = 11; // Solo fechas intercambiadas
} elseif ($has_invalid_html) {
$message_code = 12; // Solo HTML no permitido
} else {
$message_code = 10; // Actualización exitosa
}
// Agregar mensaje a la redirección
add_filter('redirect_post_location', function($location) use ($message_code) {
return add_query_arg('message', $message_code, $location);
});
}
add_action('save_post_offer', 'save_offer_meta');
//* Estilos CSS personalizados para la pantalla de edición de ofertas
function offer_admin_styles() {
global $post_type;
if ($post_type == 'offer') {
echo '<style>
.post-type-offer #postdivrich {
margin-top: 20px;
}
.cmb2-metabox {
display: grid;
gap: 20px;
}
.cmb-row {
background: #fff;
padding: 15px;
border: 1px solid #ccd0d4;
box-shadow: 0 1px 1px rgba(0,0,0,0.04);
}
</style>';
}
}
add_action('admin_head', 'offer_admin_styles');
//* Añadir mensajes personalizados para el tipo de post offer
function offer_admin_messages($messages) {
$messages['offer'][10] = __('Offer updated successfully.', 'text_domain');
$messages['offer'][11] = __('Notice: The end date was before the start date, so the dates were swapped automatically.', 'text_domain');
$messages['offer'][12] = __('Notice: Some HTML tags in the description were removed as they are not allowed.', 'text_domain');
$messages['offer'][13] = __('Notice: Dates were swapped automatically and some HTML tags were removed from the description.', 'text_domain');
return $messages;
}
add_filter('post_updated_messages', 'offer_admin_messages');
//* Ocultar el editor por defecto en la pantalla de edición de ofertas
function hide_default_editor_for_offer() {
remove_post_type_support('offer', 'editor');
}
add_action('admin_init', 'hide_default_editor_for_offer');
//* Añadir un metabox para la descripción de la oferta
function add_offer_description_metabox() {
add_meta_box(
'offer_description_meta',
__('Offer Description', 'text_domain'),
'render_offer_description_metabox',
'offer',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'add_offer_description_metabox');
//* Renderizar el metabox de la descripción de la oferta
function render_offer_description_metabox($post) {
wp_nonce_field('save_offer_description', 'offer_description_nonce');
$description = get_post_meta($post->ID, '_offer_description', true);
echo '<div style="margin-bottom: 15px;">';
echo '<label for="offer_description" style="display: block; margin-bottom: 5px; font-weight: bold;">';
echo __('Description', 'text_domain');
echo '</label>';
wp_editor($description, 'offer_description', array(
'textarea_name' => 'offer_description',
'textarea_rows' => 8,
'media_buttons' => true,
));
echo '<p class="description">';
echo __('Enter the offer description (basic HTML allowed)', 'leadbox-plugin');
echo '</p>';
echo '</div>';
}
//* Registrar el metabox para el selector de idioma
function add_language_metabox() {
if (function_exists('pll_languages_list')) {
add_meta_box(
'offer_language_meta',
__('Offer Language', 'text_domain'),
'render_language_metabox',
'offer',
'side',
'default'
);
}
}
add_action('add_meta_boxes', 'add_language_metabox');
//* Renderizar el contenido del metabox
function render_language_metabox($post) {
if (!function_exists('pll_languages_list')) {
return;
}
$current_language = get_post_meta($post->ID, '_offer_language', true);
wp_nonce_field('save_offer_language', 'offer_language_nonce');
echo '<div style="margin-bottom: 10px;">';
echo '<label for="offer_language" style="display: block; margin-bottom: 5px; font-weight: bold;">';
echo __('Select Language', 'text_domain');
echo '</label>';
echo '<select id="offer_language" name="offer_language" style="width: 100%;">';
echo '<option value="eng" ' . selected($current_language, 'eng', false) . '>' . __('English', 'text_domain') . '</option>';
echo '<option value="fr" ' . selected($current_language, 'fr', false) . '>' . __('French', 'text_domain') . '</option>';
echo '</select>';
echo '</div>';
echo '<p class="description">' . __('Select the language for this offer', 'text_domain') . '</p>';
}
//* Guardar el valor del lenguaje
function save_offer_language($post_id) {
if (function_exists('pll_languages_list')) {
if (!isset($_POST['offer_language_nonce']) || !wp_verify_nonce($_POST['offer_language_nonce'], 'save_offer_language')) {
return;
}
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
$language = 'eng'; // Valor por defecto
if (function_exists('pll_languages_list') && isset($_POST['offer_language'])) {
$allowed_values = array('eng', 'fr');
$language = in_array($_POST['offer_language'], $allowed_values) ? $_POST['offer_language'] : 'eng';
}
update_post_meta($post_id, '_offer_language', sanitize_text_field($language));
}
add_action('save_post_offer', 'save_offer_language');
function add_language_column($columns) {
$new_columns = array(
'language' => __('Language', 'text_domain'),
);
return array_slice($columns, 0, 2, true) + $new_columns + array_slice($columns, 2, null, true);
}
add_filter('manage_offer_posts_columns', 'add_language_column');
//* Mostrar el valor del idioma en la columna
function show_language_column($column, $post_id) {
if ($column === 'language') {
$language = get_post_meta($post_id, '_offer_language', true);
switch ($language) {
case 'fr':
echo '<span title="French" style="display: inline-block; width: 20px; height: 20px; color: #012169; text-align: center; line-height: 20px; border-radius: 3px;">FR</span>';
echo '<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Flag_of_Quebec.svg/1200px-Flag_of_Quebec.svg.png" alt="Quebec flag" style=" width: 15px; height: 10px; margin-left: 5px; vertical-align: middle;">';
break;
case 'eng':
default:
echo '<span title="English" style="display: inline-block; width: 20px; height: 20px; color: #ED2939; text-align: center; line-height: 20px; border-radius: 3px;">EN</span>';
echo '<span title="English" style="display: inline-block; width: 20px; height: 20px; text-align: center; line-height: 20px; border-radius: 3px;">🇨🇦</span>';
break;
}
}
}
add_action('manage_offer_posts_custom_column', 'show_language_column', 10, 2);
//* Hacer que la columna de idioma sea ordenable
function make_language_column_sortable($columns) {
$columns['language'] = 'language';
return $columns;
}
add_filter('manage_edit-offer_sortable_columns', 'make_language_column_sortable');
//* Modificar la consulta para ordenar por idioma
function sort_offers_by_language($query) {
if (!is_admin() || !$query->is_main_query() || $query->get('post_type') !== 'offer') {
return;
}
if ($query->get('orderby') === 'language') {
$query->set('meta_key', '_offer_language');
$query->set('orderby', 'meta_value');
}
}
add_action('pre_get_posts', 'sort_offers_by_language');
//* Add Sort Column to Offer List
function add_offer_sort_column($columns) {
$columns['offer_sort'] = '<span class="dashicons dashicons-menu" title="' . __('Drag to reorder', 'text_domain') . '"></span>';
return $columns;
}
add_filter('manage_offer_posts_columns', 'add_offer_sort_column');
//* Render Sort Column Content
function show_offer_sort_column($column, $post_id) {
if ($column === 'offer_sort') {
echo '<span class="dashicons dashicons-menu move-offer" style="cursor: move; color: #999;"></span>';
}
}
add_action('manage_offer_posts_custom_column', 'show_offer_sort_column', 10, 2);
//* Enqueue Admin Scripts for Offer Sorting
function enqueue_offer_admin_scripts($hook) {
global $post_type;
if ($hook == 'edit.php' && $post_type == 'offer') {
wp_enqueue_script('jquery-ui-sortable');
wp_enqueue_script('offer-admin-sort', plugin_dir_url(__FILE__) . '../assets/js/admin-offer-sort.js', array('jquery', 'jquery-ui-sortable'), '1.0', true);
wp_localize_script('offer-admin-sort', 'leadbox_offer_sort', array(
'security' => wp_create_nonce('offer_sort_nonce')
));
}
}
add_action('admin_enqueue_scripts', 'enqueue_offer_admin_scripts');
//* Handle AJAX Offer Sorting
function save_offer_order() {
check_ajax_referer('offer_sort_nonce', 'security');
if (!current_user_can('edit_posts')) {
wp_send_json_error('Insufficient permissions');
}
if (!isset($_POST['order']) || !is_array($_POST['order'])) {
wp_send_json_error('Invalid data');
}
$order = $_POST['order'];
foreach ($order as $index => $post_id) {
wp_update_post(array(
'ID' => intval($post_id),
'menu_order' => $index
));
}
wp_send_json_success('Order saved');
}
add_action('wp_ajax_save_offer_order', 'save_offer_order');
//* Update Default Query to Sort by Menu Order
function sort_offers_by_menu_order($query) {
// Frontend: Main query for offers
if (!is_admin() && $query->is_main_query() && $query->get('post_type') === 'offer') {
$query->set('orderby', 'menu_order');
$query->set('order', 'ASC');
return;
}
// Admin: Offer list
if (is_admin() && $query->is_main_query() && $query->get('post_type') === 'offer') {
if (!isset($_GET['orderby'])) {
$query->set('orderby', 'menu_order');
$query->set('order', 'ASC');
}
}
}
add_action('pre_get_posts', 'sort_offers_by_menu_order');