| Server IP : 188.114.96.2 / Your IP : 104.23.197.230 Web Server : Apache/2.4.59 (Debian) System : Linux EDL-STRETCH 4.19.0-27-amd64 #1 SMP Debian 4.19.316-1 (2024-06-25) x86_64 User : edlftp ( 1002) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /home/nicolasj/www/ecoledelangues.be/wp-content/plugins/ |
Upload File : |
<?php
/*
Plugin Name: CodeIgniter Hybrid
Plugin URI: https://codes.solutions/
Description: CI shop integration
Author: Aernout Guillaume [codes.solutions]
Version: 1.2
Author URI: https://codes.solutions/
*/
session_start();
//session_destroy();
ob_start();
function add_cors_http_header()
{
header("Access-Control-Allow-Origin: https://sms.ecoledelangues.be");
header('Access-Control-Allow-Headers: x-requested-with');
}
function ci_get_ip()
{
$keys = ['HTTP_CF_CONNECTING_IP'];
foreach ($keys as $k) {
if (!empty($_SERVER[$k]) && filter_var($_SERVER[$k], FILTER_VALIDATE_IP)) {
return $_SERVER[$k];
}
}
return $_SERVER['REMOTE_ADDR'];
}
function rewrite_param()
{
add_rewrite_rule('^shop/filter/([^/]+)/?$', 'index.php?pagename=shop&filter=$matches[1]', 'top');
}
function display_ci_content_legacy()
{
$match = array();
$url = $_SERVER["REQUEST_URI"];
$url_clean = $url;
if (strpos($url, '=&') > -1) {
$url_clean = substr($url, 0, strpos($url, '=&'));
} elseif (strpos($url, '&') > -1) {
$url_clean = substr($url, 0, strpos($url, '&'));
} elseif (strpos($url, '?gclid') > -1) {
$url_clean = substr($url, 0, strpos($url, '?gclid'));
} else {
$url_clean = $url;
}
if ($url_clean == "/shop/") {
echo ajax_Call('hybrid', 'filters', 'all');
} elseif (preg_match('/\/shop\/\?[0-9,+\-a-zA-Z=]+$/', $url_clean, $match) && ($url_clean != "/shop/?filter") && ($url_clean != "/shop/?add") && ($url_clean != "/shop/?cart")) {
$param = (int) substr($match[0], (strpos($match[0], "?") + 1));
echo ajax_Call('hybrid', 'filters', $param);
} elseif ($url_clean == "/shop/?filter") {
ob_end_clean();
$param = implode(',', $_POST['param']);
$data = ajax_Call('loadData', 'filters', $param);
echo $data;
ob_start();
add_action("wp_footer", "clean_footer");
//ob_start();
} elseif ($url_clean == "/shop/?add") {
ob_end_clean();
$product_id = (int) $_POST['param']['product'];
$product_qty = (int) $_POST['param']['quantity'];
add_to_cart($product_id, $product_qty);
ob_start();
add_action("wp_footer", "clean_footer");
} elseif ($url_clean == "/shop/?cart") {
ob_end_clean();
echo get_cart();
ob_start();
add_action("wp_footer", "clean_footer");
} elseif (preg_match('/\/shop\/\?filter=+([0-9,])/', $url_clean, $matches)) {
ob_end_clean();
$filter = $matches[1];
if (strpos($filter, ",") > -1) {
$param = implode(',', $filter);
} else {
$param = $filter;
}
$data = ajax_Call('loadData', 'filters', $param);
echo $data;
ob_start();
add_action("wp_footer", "clean_footer");
}
}
function display_ci_content_v2(string $content): string
{
//
if ( !is_singular() || !in_the_loop() || !is_main_query() ) {
return $content;
}
$request_uri = $_SERVER['REQUEST_URI'] ?? '';
if ($request_uri === '') {
return $content;
}
// Parse URL
$parts = wp_parse_url($request_uri);
$path = $parts['path'] ?? '';
// Normaliser /shop et /shop/ en /shop/
$path = trailingslashit($path);
if ($path !== '/shop/') {
return $content;
}
$query_raw = $parts['query'] ?? '';
// /shop/
if ($query_raw === '') {
return (string) ajax_Call('hybrid', 'filters', 'all');
}
///shop/?123(=?)
$first_piece = explode('&', $query_raw, 2)[0];
if (preg_match('/^(\d+)=?$/', $first_piece, $m)) {
$param = absint($query_raw);
// Exclusions legacy: filter/add/cart (comme ton code)
if (in_array($query_raw, ['filter', 'add', 'cart'], true)) {
return $content;
}
if ($param > 0) {
return (string) ajax_Call('hybrid', 'filters', $param);
}
return $content;
}
// Others queries
$query = [];
parse_str($query_raw, $query);
// Endpoints : /shop/?filter /shop/?add /shop/?cart
if ($query_raw === 'filter') {
return ci_shop_handle_filter_post();
}
if ($query_raw === 'add') {
ci_shop_handle_add_post();
return $content;
}
if ($query_raw === 'cart') {
return ci_shop_handle_cart();
}
// Endpoint: /shop/?filter=1,2,3
if (isset($query['filter'])) {
$filter = (string) $query['filter'];
$filter = preg_replace('/[^0-9,]/', '', $filter);
$filter = trim($filter, ',');
if ($filter === '') {
return '';
}
ci_shop_prepare_clean_footer();
return (string) ajax_Call('loadData', 'filters', $filter);
}
return $content;
}
function ci_shop_handle_filter_post(): string
{
ci_shop_prepare_clean_footer();
$param = $_POST['param'] ?? [];
$param = is_array($param) ? wp_unslash($param) : [];
$ids = array_filter(array_map('absint', (array) $param));
$param_str = implode(',', $ids);
return (string) ajax_Call('loadData', 'filters', $param_str);
}
function ci_shop_handle_add_post(): void
{
ci_shop_prepare_clean_footer();
$param = $_POST['param'] ?? [];
$param = is_array($param) ? wp_unslash($param) : [];
$product_id = isset($param['product']) ? absint($param['product']) : 0;
$product_qty = isset($param['quantity']) ? max(1, absint($param['quantity'])) : 1;
if ($product_id > 0) {
add_to_cart($product_id, $product_qty);
}
}
function ci_shop_handle_cart(): string
{
ci_shop_prepare_clean_footer();
return (string) get_cart();
}
function ci_shop_prepare_clean_footer(): void
{
if (ob_get_level() > 0) {
ob_end_clean();
}
ob_start();
static $footer_hooked = false;
if (!$footer_hooked) {
add_action('wp_footer', 'clean_footer', 1);
$footer_hooked = true;
}
}
function display_ci_header()
{
$url = $_SERVER["REQUEST_URI"];
$url_clean = $url;
if (strpos($url, '=&') > -1) {
$url_clean = substr($url, 0, strpos($url, '=&'));
} elseif (strpos($url, '&') > -1) {
$url_clean = substr($url, 0, strpos($url, '&'));
} elseif (strpos($url, '?gclid') > -1) {
$url_clean = substr($url, 0, strpos($url, '?gclid'));
} else {
$url_clean = $url;
}
if ($url_clean == "/shop/" or preg_match('/\/shop\/\?[0-9+\-,a-zA-Z=]+$/', $url_clean, $match)) {
echo'<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>';
echo'<script src="https://sms.ecoledelangues.be/assets/js/shop/home_wp.js"></script>';
echo'<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">';
echo'<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>';
echo'<link rel="stylesheet" href="https://sms.ecoledelangues.be/assets/css/shop/home-wp.css">';
echo'<link rel="stylesheet" href="/wp-content/plugins/ci-hybrid/entypo.css">';
}
}
function display_ci_cart()
{
$url = $_SERVER["REQUEST_URI"];
$url_clean = $url;
if (strpos($url, '=&') > -1) {
$url_clean = substr($url, 0, strpos($url, '=&'));
} elseif (strpos($url, '&') > -1) {
$url_clean = substr($url, 0, strpos($url, '&'));
} elseif (strpos($url, '?gclid') > -1) {
$url_clean = substr($url, 0, strpos($url, '?gclid'));
} else {
$url_clean = $url;
}
$cart = <<<EOD
<div id="ci-banner" class="fixed-banner col-sm-12" style="position:absolute;top:102px;"><span class="float-left">Ecole De Langues Shop</span>
<span class="text-right left-content-banner float-left">
<ul class="top-list">
<li onclick="window.location.replace('http://sms.ecoledelangues.be/login');">Login <i class="entypo-user"></i></li>
<li onclick="checkoutBtn();">Cart<i class="entypo-basket"></i><span id="cart-qty"></span><form id="cart_form" method="post" action="https://sms.ecoledelangues.be/shop/setCart/"><input type="hidden" name="cart" id="cart" value="{}"></form></li>
</ul>
</span>
</div>
EOD;
if ($url_clean == "/shop/" or preg_match('/\/shop\/\?[0-9,+\-a-zA-Z=]+$/', $url_clean, $match)) {
echo $cart;
}
}
function clean_footer()
{
ob_end_clean();
}
function ajax_Call($function, $param_name, $param)
{
$url = "https://sms.ecoledelangues.be/shop/".$function."/";
if ($param != '') {
$postdata = http_build_query(
array($param_name => $param)
);
} else {
$postdata = '';
}
$opts = array(
'http' =>
array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => $postdata
),
'ssl' =>
array(
'verify_peer' => false,
'verify_peer_name' => false,
),
);
return file_get_contents($url, false, stream_context_create($opts));
}
//DB functions
function connect_sms()
{
global $seconddb;
$seconddb = new wpdb('sms', '736dks!3', 'sms', 'localhost');
}
function get_product($id)
{
global $seconddb;
$product_array = $seconddb->get_results('SELECT * FROM `course_product` WHERE `ID` = '.$id.';', ARRAY_A);
$course = $product_array[0];
if (!is_vat_course($course['Course_ID'])) {
//Propulse
if ($course['Course_Promo'] == 0) {
$course['Price_HTVA'] = 0;
$course['Price_TVA'] = round($course['Course_Price'], 2);
$course['Price_HTVA_Promo'] = 0;
$course['Price_TVA_Promo'] = 0;
} else {
$promo = (($course['Course_Price'] * $course['Course_Promo']) / 100);
$course['Price_HTVA'] = 0;
$course['Price_TVA'] = round($course['Course_Price'], 2);
$course['Price_HTVA_Promo'] = 0;
$course['Price_TVA_Promo'] = round($course['Course_Price'] - $promo, 2);
}
} else {
if ($course['Course_Promo'] == 0) {
$course['Price_HTVA'] = round($course['Course_Price'], 2);
$course['Price_TVA'] = round($course['Course_Price'] * 1.21, 2);
$course['Price_HTVA_Promo'] = 0;
$course['Price_TVA_Promo'] = 0;
} else {
$promo = (($course['Course_Price'] * $course['Course_Promo']) / 100);
$course['Price_HTVA'] = round($course['Course_Price'], 2);
$course['Price_TVA'] = round($course['Course_Price'] * 1.21, 2);
$course['Price_HTVA_Promo'] = round(($course['Course_Price'] - $promo), 2);
$course['Price_TVA_Promo'] = round(($course['Course_Price'] - $promo) * 1.21, 2);
}
}
$course['Course_Disponibility'] = ($course['Course_Availability'] - get_students_count($course['Course_ID']));
return $course;
}
function is_vat_course($id)
{
global $seconddb;
$data = $seconddb->get_results('SELECT * FROM `course_new` WHERE `ID` = '.$id.';', ARRAY_A);
if ($data[0]['CourseVat'] == "yes") {
return true;
}
return false;
}
function get_students_count($id)
{
global $seconddb;
$students_array = $seconddb->get_results('SELECT * FROM `course_student_new` WHERE `course_id` = '.$id.';', ARRAY_A);
$history = array();
$count = 0;
foreach ($students_array as $value) {
if (!in_array($value['student_id'], $history)) {
$count++;
}
array_push($history, $value['student_id']);
}
if ($count != '' or $count != 0) {
return $count;
} else {
return "0";
}
}
function get_cart()
{
$signature = get_signature();
$cart = [];
global $seconddb;
$cart_array = $seconddb->get_results('SELECT `Cart_Total`,`Cart_Qty`,`Cart_Vat`,`Pro_Total`,`Pro_Total_VAT`,`OB_Total`,`OB_Total_VAT`,`Cart`
FROM `shop_session`
WHERE `Signature` = \''.$signature.'\' AND (`State` = \'done\' OR `State` IS NULL)
ORDER BY Creation DESC;', ARRAY_A);
if (!empty($cart_array[0])) {
$cart = $cart_array[0];
}
return json_encode($cart);
}
function add_to_cart($id, $qty)
{
$signature = get_signature();
global $seconddb;
//`Cart_Total`,`Cart_Qty`,`Cart_Vat`,`Pro_Total`,`Pro_Total_VAT`,`OB_Total`,`OB_Total_VAT`,`Cart`,`Cart_Total`
$cart_array = $seconddb->get_results('SELECT *
FROM `shop_session`
WHERE `Signature` = \''.$signature.'\' AND (`State` IS NULL)
ORDER BY Creation DESC;', ARRAY_A);
if (!empty($cart_array)) {
// Update an existing cart
$cart = [];
if ($cart_array[0]['Cart'] != null) {
$cart = is_array($cart_array[0]['Cart']) ? $cart_array[0]['Cart'] : json_decode($cart_array[0]['Cart'], true);
}
if (array_key_exists($id, $cart)) {
$prevQty = $cart[$id]['qty'];
$cart[$id]['qty'] = $prevQty + $qty;
$cart[$id]['data'] = get_product($id);
} else {
$product_item = array(
'data' => get_product($id),
'qty' => $qty,
'option' => null,
);
$cart[$id] = $product_item;
}
$cart_qty = 0;
$cart_total = 0;
$cart_vat = 0;
$pro = 0;
$pro_vat = 0;
$ob = 0;
$ob_vat = 0;
foreach ($cart as $key => $product) {
$data = is_array($product['data']) ? $product['data'] : json_decode($product['data'], true);
$price_original = $data['Course_Price'];
$price = $price_original;
$target_vat = 0;
$target_qty = $product['qty'];
$price = !empty($data['Price_TVA_Promo']) ? $data['Price_TVA_Promo'] : $data['Price_TVA'];
if (is_vat_course($data['Course_ID'])) {
$ob = $ob + ($price * $target_qty);
} else {
$pro = $pro + ($price * $target_qty);
}
// update cart data
$cart_qty = $cart_qty + $target_qty;
$cart_vat = $cart_vat + ($target_vat * $target_qty);
$cart_total = $cart_total + ($price * $target_qty);
}
$data = array(
"Cart_Qty" => $cart_qty,
"Cart_Total" => $cart_total,
"Cart_Vat" => $cart_vat,
"Pro_Total" => $pro,
"Pro_Total_Vat" => $pro_vat,
"OB_Total" => $ob,
"OB_Total_Vat" => $ob_vat,
"Cart" => json_encode($cart)
);
//UPDATE
$seconddb->update('shop_session', $data, ['ID' => $cart_array[0]['ID']]);
} else {
// Create a new cart
$cart = array();
$product_item = array(
'data' => get_product($id),
'qty' => (int) $qty,
'option' => null,
);
$cart[$id] = $product_item;
//resume cart data
$cart_qty = 0;
$cart_total = 0;
$cart_vat = 0;
$pro = 0;
$pro_vat = 0;
$ob = 0;
$ob_vat = 0;
foreach ($cart as $key => $product) {
$data = is_array($product['data']) ? $product['data'] : json_decode($product['data'], true);
$price_original = $data['Course_Price'];
$price = $price_original;
$target_vat = 0;
$target_qty = $product['qty'];
$selector = $data;
$price = !empty($selector['Price_TVA_Promo']) ? $selector['Price_TVA_Promo'] : $selector['Price_TVA'];
if (is_vat_course($data['Course_ID'])) {
$ob = $ob + ($price * $target_qty);
} else {
$pro = $pro + ($price * $target_qty);
}
// update cart data
$cart_qty = $cart_qty + $target_qty;
$cart_vat = $cart_vat + ($target_vat * $target_qty);
$cart_total = $cart_total + ($price * $target_qty);
}
$seconddb->insert('shop_session', [
"Cart_Qty" => $cart_qty,
"Cart_Total" => $cart_total,
"Cart_Vat" => $cart_vat,
"Pro_Total" => $pro,
"Pro_Total_Vat" => $pro_vat,
"OB_Total" => $ob,
"OB_Total_Vat" => $ob_vat,
"Cart" => json_encode($cart),
"IP" => ci_get_ip(),
"Signature" => get_signature()
]);
}
}
function get_signature()
{
$userAgent = $_SERVER['HTTP_USER_AGENT'];
$signature = "";
$browsers = array(
array("IE", "Microsoft Internet Explorer"),
array("Chrome", "Google Chrome"),
array("Firefox", "Mozzila Firefox"),
array("Opera", "Opera"),
array("Safari", "Apple Safari")
);
foreach ($browsers as $browser) {
if (strpos($userAgent, $browser[0]) !== false) {
$signature = $signature.",".$browser[1];
}
}
return md5(ci_get_ip() . "+" . $signature);
}
add_action('init', 'connect_sms');
add_action('init', 'add_cors_http_header');
add_action("wp_head", "display_ci_header");
add_action("avada_after_header_wrapper", "display_ci_cart");
add_action("the_content", "display_ci_content_v2", 99);
//ob_end_clean();
add_action('admin_menu', 'ci_menu_page');
function ci_menu_page()
{
add_menu_page(
'CI Hybrid Shop', // page <title>Title</title>
'CI Hybrid', // menu link text
'manage_options', // capability to access the page
'ci-hybrid-shop', // page URL slug
'ci_page_content', // callback function /w content
'dashicons-star-half', // menu icon
5 // priority
);
}
function ci_page_content()
{
echo "<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>";
echo '<div class="col-sm-12 p-4"><h2>CI Hybrid Shop</h2><div class="col-sm-12"><button class="btn btn-info button action" onclick="$.post(\'https://ecoledelangues.be/wp-content/plugins/ci-hybrid/hook_shop.php\',function(r){console.log(r)});">Re-hook the shop</button></div></div>';
}