<?php
/*
Plugin Name: Vigilanti Styles
Description: Styles personnalises pour le site Vigilanti - Design moderne 2025
Version: 2.8
Author: Vigilanti
*/
if (!defined('ABSPATH')) exit;
add_action('wp_head', 'vigilanti_inject_css', 999);
function vigilanti_inject_css() {
$css_url = plugins_url('vigilanti.css', __FILE__);
echo '<link rel="stylesheet" id="vigilanti-custom-css" href="' . esc_url($css_url) . '?v=3.0" type="text/css" media="all" />' . "\n";
}
// Injecter aussi le CSS des produits directement pour éviter les problèmes de cache
add_action('wp_head', 'vigilanti_inject_product_css', 1000);
function vigilanti_inject_product_css() {
?>
<style id="vigilanti-product-css">
/* ====================================================
VIGILANTI — CSS PRODUITS 2 COLONNES v2.2
Mise à jour : images agrandies + fond sombre
==================================================== */
/* Hero des pages */
.vigi-page-hero {
background-size: cover !important;
background-position: center !important;
background-repeat: no-repeat !important;
min-height: 320px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
position: relative !important;
margin-bottom: 0 !important;
}
.vigi-page-hero::before {
content: "" !important;
position: absolute !important;
inset: 0 !important;
background: rgba(10,10,30,0.72) !important;
}
.vigi-page-hero-inner {
position: relative !important;
z-index: 2 !important;
text-align: center !important;
color: #fff !important;
padding: 40px 20px !important;
max-width: 800px !important;
}
.vigi-page-hero-inner h1 {
font-size: 2.8rem !important;
font-weight: 800 !important;
color: #fff !important;
margin-bottom: 16px !important;
text-shadow: 0 2px 8px rgba(0,0,0,0.5) !important;
}
.vigi-page-hero-inner p {
font-size: 1.15rem !important;
color: rgba(255,255,255,0.88) !important;
}
/* Section wrapper */
.vigi-section { padding: 60px 0 !important; }
.vigi-section-inner { max-width: 1200px !important; margin: 0 auto !important; padding: 0 30px !important; }
.vigi-section-title {
font-size: 2rem !important;
font-weight: 700 !important;
color: #1a1a2e !important;
text-align: center !important;
margin-bottom: 40px !important;
padding-bottom: 16px !important;
border-bottom: 3px solid #dc143c !important;
}
.vigi-intro {
font-size: 1.1rem !important;
color: #444 !important;
text-align: center !important;
max-width: 800px !important;
margin: 0 auto 40px !important;
line-height: 1.7 !important;
}
/* ====================================================
TEMPLATE PRODUIT 2 COLONNES
==================================================== */
.vigi-product {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 0 !important;
align-items: stretch !important;
margin-bottom: 50px !important;
background: #0d0f1a !important;
border-radius: 12px !important;
overflow: hidden !important;
box-shadow: 0 4px 32px rgba(0,0,0,0.35) !important;
border: 1px solid rgba(220,20,60,0.18) !important;
transition: box-shadow 0.3s ease, border-color 0.3s ease !important;
padding: 0 !important;
border-bottom: 1px solid rgba(220,20,60,0.18) !important;
}
.vigi-product:hover {
box-shadow: 0 8px 48px rgba(220,20,60,0.30) !important;
border-color: rgba(220,20,60,0.40) !important;
}
.vigi-product-img {
background: #060810 !important;
overflow: hidden !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
min-height: 600px !important;
border-radius: 0 !important;
box-shadow: none !important;
padding: 30px !important;
}
.vigi-product-img img {
width: 100% !important;
height: auto !important;
object-fit: contain !important;
display: block !important;
max-height: 540px !important;
transition: transform 0.4s ease !important;
}
.vigi-product-img:hover img {
transform: scale(1.03) !important;
}
.vigi-product-info {
padding: 36px 40px !important;
display: flex !important;
flex-direction: column !important;
justify-content: center !important;
background: #12141f !important;
border-left: 1px solid rgba(220,20,60,0.12) !important;
}
.vigi-product-info h3 {
font-size: 1.5rem !important;
font-weight: 700 !important;
color: #ffffff !important;
margin-bottom: 14px !important;
line-height: 1.3 !important;
text-shadow: 0 1px 4px rgba(0,0,0,0.4) !important;
}
.vigi-product-info p {
color: rgba(255,255,255,0.78) !important;
line-height: 1.7 !important;
margin-bottom: 18px !important;
font-size: 1rem !important;
}
/* Specs list */
.vigi-specs {
list-style: none !important;
padding: 0 !important;
margin: 0 0 22px 0 !important;
}
.vigi-specs li {
padding: 5px 0 5px 22px !important;
position: relative !important;
color: rgba(255,255,255,0.72) !important;
font-size: 0.95rem !important;
border-bottom: 1px solid rgba(255,255,255,0.08) !important;
}
.vigi-specs li::before {
content: "✓" !important;
position: absolute !important;
left: 0 !important;
color: #dc143c !important;
font-weight: 700 !important;
}
/* Prix */
.vigi-price {
background: linear-gradient(135deg, #1a1a2e, #2d2d4e) !important;
color: #fff !important;
padding: 14px 20px !important;
border-radius: 8px !important;
margin-bottom: 20px !important;
font-size: 1rem !important;
border-left: none !important;
}
.vigi-price strong {
color: #ff6b6b !important;
font-size: 1.3rem !important;
font-weight: 800 !important;
}
.vigi-price-note {
color: rgba(255,255,255,0.65) !important;
font-size: 0.85rem !important;
}
/* Bouton */
.vigi-btn-primary {
display: inline-block !important;
background: #dc143c !important;
color: #fff !important;
padding: 12px 28px !important;
border-radius: 6px !important;
font-weight: 700 !important;
font-size: 0.95rem !important;
text-decoration: none !important;
transition: background 0.2s ease, transform 0.2s ease !important;
align-self: flex-start !important;
}
.vigi-btn-primary:hover {
background: #b01030 !important;
color: #fff !important;
}
/* Produit inversé (image à droite) */
.vigi-product-reverse {
direction: ltr !important;
}
.vigi-product-reverse .vigi-product-img {
order: 2 !important;
}
.vigi-product-reverse .vigi-product-info {
order: 1 !important;
}
/* CTA section */
.vigi-cta {
background: linear-gradient(135deg, #1a1a2e 0%, #2d1a2e 100%) !important;
color: #fff !important;
text-align: center !important;
padding: 70px 30px !important;
}
.vigi-cta h2 {
font-size: 2rem !important;
font-weight: 700 !important;
color: #fff !important;
margin-bottom: 16px !important;
}
.vigi-cta p {
color: rgba(255,255,255,0.8) !important;
font-size: 1.1rem !important;
margin-bottom: 30px !important;
}
/* ====================================================
GAMING SERIES HERO
==================================================== */
.vigi-gaming-hero {
background: linear-gradient(135deg, #0d0d1a 0%, #1a0a0a 50%, #0d0d1a 100%) !important;
text-align: center !important;
padding: 60px 30px !important;
border-bottom: 3px solid #dc143c !important;
}
.vigi-gaming-logo {
max-width: 320px !important;
width: 100% !important;
height: auto !important;
margin-bottom: 24px !important;
filter: drop-shadow(0 0 20px rgba(220,20,60,0.4)) !important;
}
.vigi-gaming-tagline {
color: rgba(255,255,255,0.85) !important;
font-size: 1.1rem !important;
max-width: 700px !important;
margin: 0 auto !important;
line-height: 1.7 !important;
}
/* ====================================================
PAGE CONTACT
==================================================== */
.vigi-contact-grid {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
gap: 50px !important;
margin-bottom: 60px !important;
}
.vigi-contact-info {
background: linear-gradient(135deg, #1a1a2e, #2d2d4e) !important;
border-radius: 12px !important;
padding: 40px !important;
color: #fff !important;
}
.vigi-contact-info h2 {
font-size: 1.6rem !important;
font-weight: 700 !important;
color: #fff !important;
margin-bottom: 30px !important;
padding-bottom: 16px !important;
border-bottom: 2px solid rgba(220,20,60,0.5) !important;
}
.vigi-contact-item {
display: flex !important;
align-items: flex-start !important;
gap: 16px !important;
margin-bottom: 22px !important;
padding-bottom: 22px !important;
border-bottom: 1px solid rgba(255,255,255,0.1) !important;
}
.vigi-contact-icon {
font-size: 1.4rem !important;
flex-shrink: 0 !important;
width: 36px !important;
text-align: center !important;
}
.vigi-contact-item a {
color: #ff6b6b !important;
text-decoration: none !important;
}
.vigi-contact-item a:hover { color: #ff9999 !important; }
.vigi-contact-alt {
margin-top: 30px !important;
text-align: center !important;
}
.vigi-contact-alt p {
color: rgba(255,255,255,0.7) !important;
margin-bottom: 16px !important;
}
.vigi-contact-form {
background: #fff !important;
border-radius: 12px !important;
padding: 40px !important;
box-shadow: 0 4px 24px rgba(0,0,0,0.1) !important;
}
.vigi-contact-form h2 {
font-size: 1.6rem !important;
font-weight: 700 !important;
color: #1a1a2e !important;
margin-bottom: 24px !important;
padding-bottom: 16px !important;
border-bottom: 2px solid #dc143c !important;
}
.vigi-map-section { margin-top: 20px !important; }
.vigi-map-section h3 {
font-size: 1.3rem !important;
color: #1a1a2e !important;
margin-bottom: 20px !important;
}
.vigi-map-wrap {
border-radius: 12px !important;
overflow: hidden !important;
box-shadow: 0 4px 24px rgba(0,0,0,0.1) !important;
}
/* ====================================================
RESPONSIVE
==================================================== */
@media (max-width: 768px) {
.vigi-product {
grid-template-columns: 1fr !important;
}
.vigi-product-reverse .vigi-product-img {
order: 0 !important;
}
.vigi-product-reverse .vigi-product-info {
order: 0 !important;
}
.vigi-product-img img {
min-height: 260px !important;
max-height: 320px !important;
}
.vigi-product-info {
padding: 24px 20px !important;
}
.vigi-page-hero-inner h1 { font-size: 2rem !important; }
.vigi-contact-grid { grid-template-columns: 1fr !important; }
.vigi-gaming-logo { max-width: 220px !important; }
}
</style>
<?php
}
// ============================================================
// FOOTER : Remplacer "Propulsé par WordPress" par "VIGILANTI"
// ============================================================
add_filter('astra_footer_copyright_text', 'vigilanti_footer_copyright');
function vigilanti_footer_copyright($text) {
return 'VIGILANTI © ' . date('Y') . ' — Tous droits réservés';
}
// Masquer le lien WordPress dans le footer Astra
add_filter('astra_footer_sml_layout', 'vigilanti_remove_wp_credit', 99);
function vigilanti_remove_wp_credit($layout) {
$layout = preg_replace('/<span[^>]*class="[^"]*ast-footer-copyright[^"]*"[^>]*>.*?Propuls.*?<\/span>/si', '', $layout);
return $layout;
}
// Filtrer le texte du footer WordPress natif
add_filter('the_generator', '__return_empty_string');
// Remplacer dans le footer HTML final
add_action('wp_footer', 'vigilanti_replace_footer_text', 999);
function vigilanti_replace_footer_text() {
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
var footerLinks = document.querySelectorAll('.site-info a[href*="wordpress.org"], .ast-footer-copyright a[href*="wordpress.org"]');
footerLinks.forEach(function(el) {
var parent = el.parentElement;
if (parent) {
parent.innerHTML = parent.innerHTML
.replace(/Propuls[^<]*par[^<]*WordPress/gi, 'VIGILANTI')
.replace(/Powered by WordPress/gi, 'VIGILANTI')
.replace(/<a[^>]*wordpress\.org[^>]*>[^<]*<\/a>/gi, 'VIGILANTI');
}
});
// Chercher aussi dans tout le footer
var footer = document.querySelector('.site-footer, #colophon, .ast-small-footer');
if (footer) {
footer.innerHTML = footer.innerHTML
.replace(/Propuls[\u00e9e] par <a[^>]*>[^<]*<\/a>/gi, '')
.replace(/Powered by <a[^>]*>[^<]*<\/a>/gi, '');
}
});
</script>
<?php
}
// ============================================================
// SHORTCODE : Formulaire de contact Vigilanti — Accès restreint aux clients validés
// ============================================================
add_shortcode('vigi_contact_form', 'vigilanti_contact_form_shortcode');
function vigilanti_contact_form_shortcode() {
ob_start();
// === ÉTAT 1 : Utilisateur non connecté ===
if (!is_user_logged_in()) {
$login_url = home_url('/connexion-client/');
$register_url = home_url('/inscription-client/');
?>
<div class="vigi-contact-form-wrap" style="text-align:center;padding:40px 20px;">
<div style="background:linear-gradient(135deg,#1a1a2e,#2d2d4e);border-radius:12px;padding:40px;color:#fff;max-width:560px;margin:0 auto;">
<div style="font-size:3rem;margin-bottom:16px;">🔒</div>
<h3 style="color:#fff;font-size:1.5rem;margin-bottom:12px;">Accès réservé aux clients enregistrés</h3>
<p style="color:rgba(255,255,255,0.8);margin-bottom:28px;line-height:1.7;">
Pour soumettre une demande de devis, vous devez disposer d'un compte client validé.<br>
Vous pouvez également nous joindre directement par téléphone ou par email.
</p>
<div style="display:flex;gap:16px;justify-content:center;flex-wrap:wrap;margin-bottom:28px;">
<a href="<?php echo esc_url($register_url); ?>" style="background:#dc143c;color:#fff;padding:14px 28px;border-radius:6px;font-weight:700;text-decoration:none;font-size:1rem;">
Créer un compte
</a>
<a href="<?php echo esc_url($login_url); ?>" style="background:rgba(255,255,255,0.15);color:#fff;padding:14px 28px;border-radius:6px;font-weight:700;text-decoration:none;font-size:1rem;border:1px solid rgba(255,255,255,0.3);">
Se connecter
</a>
</div>
<p style="color:rgba(255,255,255,0.55);font-size:0.85rem;">
Ou contactez-nous directement :<br>
<a href="tel:+687800099" style="color:#ff6b6b;">+687 800 099</a> |
<a href="mailto:contact@vigilanti-alarmes.com" style="color:#ff6b6b;">contact@vigilanti-alarmes.com</a>
</p>
</div>
</div>
<?php
return ob_get_clean();
}
// === ÉTAT 2 : Utilisateur connecté mais en attente de validation (rôle pending) ===
$current_user = wp_get_current_user();
$user_roles = (array) $current_user->roles;
if (in_array('pending', $user_roles)) {
?>
<div class="vigi-contact-form-wrap" style="text-align:center;padding:40px 20px;">
<div style="background:linear-gradient(135deg,#1a1a2e,#2d2d4e);border-radius:12px;padding:40px;color:#fff;max-width:560px;margin:0 auto;">
<div style="font-size:3rem;margin-bottom:16px;">⏳</div>
<h3 style="color:#fff;font-size:1.5rem;margin-bottom:12px;">Compte en attente de validation</h3>
<p style="color:rgba(255,255,255,0.8);margin-bottom:20px;line-height:1.7;">
Bonjour <strong style="color:#ff6b6b;"><?php echo esc_html($current_user->display_name); ?></strong>,<br>
votre compte a bien été créé et est en attente de validation par notre équipe.<br>
Vous recevrez un email dès que votre accès sera activé.
</p>
<p style="color:rgba(255,255,255,0.55);font-size:0.85rem;">
En attendant, contactez-nous directement :<br>
<a href="tel:+687800099" style="color:#ff6b6b;">+687 800 099</a> |
<a href="mailto:contact@vigilanti-alarmes.com" style="color:#ff6b6b;">contact@vigilanti-alarmes.com</a>
</p>
</div>
</div>
<?php
return ob_get_clean();
}
// === ÉTAT 3 : Client validé — afficher le formulaire avec données pré-remplies ===
$user_nom = $current_user->display_name;
$user_email = $current_user->user_email;
?>
<div class="vigi-contact-form-wrap">
<p style="color:#2ecc71;font-size:0.9rem;margin-bottom:16px;">
✓ Connecté en tant que <strong><?php echo esc_html($user_nom); ?></strong>
— <a href="<?php echo esc_url(wp_logout_url(get_permalink())); ?>" style="color:#aaa;font-size:0.85rem;">Se déconnecter</a>
</p>
<form id="vigi-contact-form" method="post" action="">
<div class="vigi-form-group">
<label for="vigi-nom">Nom complet *</label>
<input type="text" id="vigi-nom" name="nom" placeholder="Votre nom et prénom" value="<?php echo esc_attr($user_nom); ?>" required>
</div>
<div class="vigi-form-group">
<label for="vigi-email">Email *</label>
<input type="email" id="vigi-email" name="email" placeholder="votre@email.com" value="<?php echo esc_attr($user_email); ?>" required>
</div>
<div class="vigi-form-group">
<label for="vigi-tel">Téléphone</label>
<input type="tel" id="vigi-tel" name="telephone" placeholder="+687 XX XX XX">
</div>
<div class="vigi-form-group">
<label for="vigi-service">Service concerné</label>
<select id="vigi-service" name="service">
<option value="">— Choisir un service —</option>
<option value="videosurveillance">Vidéosurveillance</option>
<option value="securite">Systèmes de sécurité</option>
<option value="informatique">Informatique</option>
<option value="progiciels">Progiciels & Logiciels</option>
<option value="affichage">Affichage dynamique</option>
<option value="internet">Accès Internet</option>
<option value="autre">Autre</option>
</select>
</div>
<div class="vigi-form-group">
<label for="vigi-message">Votre message *</label>
<textarea id="vigi-message" name="message" rows="5" placeholder="Décrivez votre projet ou votre demande..." required></textarea>
</div>
<?php wp_nonce_field('vigi_contact_nonce', 'vigi_nonce'); ?>
<button type="submit" class="vigi-btn-submit" name="vigi_submit">ENVOYER MA DEMANDE</button>
<div class="vigi-hp-field"><input type="text" name="vigi_hp_website" value="" autocomplete="off" tabindex="-1"></div>
</form>
<div id="vigi-form-message" style="display:none;margin-top:15px;padding:15px;border-radius:6px;"></div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
var form = document.getElementById('vigi-contact-form');
if (!form) return;
form.addEventListener('submit', function(e) {
e.preventDefault();
var btn = form.querySelector('.vigi-btn-submit');
btn.textContent = 'Envoi en cours...';
btn.disabled = true;
var data = new FormData(form);
data.append('action', 'vigi_send_contact');
fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
method: 'POST',
body: data
})
.then(function(r) { return r.json(); })
.then(function(res) {
var msg = document.getElementById('vigi-form-message');
msg.style.display = 'block';
if (res.success) {
msg.style.background = 'rgba(40,167,69,0.2)';
msg.style.border = '1px solid #28a745';
msg.style.color = '#fff';
msg.textContent = 'Votre message a été envoyé avec succès ! Nous vous répondrons dans les plus brefs délais.';
form.reset();
} else {
msg.style.background = 'rgba(220,53,69,0.2)';
msg.style.border = '1px solid #dc3545';
msg.style.color = '#fff';
msg.textContent = 'Une erreur est survenue. Veuillez nous contacter directement par email.';
}
btn.textContent = 'ENVOYER MA DEMANDE';
btn.disabled = false;
})
.catch(function() {
var msg = document.getElementById('vigi-form-message');
msg.style.display = 'block';
msg.style.background = 'rgba(220,53,69,0.2)';
msg.style.color = '#fff';
msg.textContent = 'Erreur réseau. Contactez-nous directement : contact@vigilanti-alarmes.com';
btn.textContent = 'ENVOYER MA DEMANDE';
btn.disabled = false;
});
});
});
</script>
<?php
return ob_get_clean();
}
// Traitement AJAX du formulaire de contact — réservé aux utilisateurs connectés et validés
add_action('wp_ajax_vigi_send_contact', 'vigilanti_send_contact_ajax');
// Suppression de wp_ajax_nopriv : les non-connectés ne peuvent plus soumettre
// === ANTI-SPAM HONEYPOT ===
add_action('wp_head', 'vigi_honeypot_css');
function vigi_honeypot_css() {
echo '<style>.vigi-hp-field{display:none!important;position:absolute;left:-9999px;opacity:0;}</style>';
}
function vigilanti_send_contact_ajax() {
// Vérification : utilisateur doit être connecté
if (!is_user_logged_in()) {
wp_send_json_error('Accès refusé. Vous devez être connecté pour envoyer une demande.');
return;
}
// Vérification : rôle non "pending" (compte validé)
$current_user = wp_get_current_user();
if (in_array('pending', (array) $current_user->roles)) {
wp_send_json_error('Votre compte est en attente de validation. Veuillez patienter.');
return;
}
// Anti-spam honeypot check
if (!empty($_POST['vigi_hp_website'])) { wp_send_json_success(); return; }
if (!isset($_POST['vigi_nonce']) || !wp_verify_nonce($_POST['vigi_nonce'], 'vigi_contact_nonce')) {
wp_send_json_error('Nonce invalide');
}
$nom = sanitize_text_field($_POST['nom'] ?? '');
$email = sanitize_email($_POST['email'] ?? '');
$tel = sanitize_text_field($_POST['telephone'] ?? '');
$service = sanitize_text_field($_POST['service'] ?? '');
$message = sanitize_textarea_field($_POST['message'] ?? '');
if (empty($nom) || empty($email) || empty($message)) {
wp_send_json_error('Champs requis manquants');
}
// Récupérer les infos du compte connecté pour traçabilité
$logged_user = wp_get_current_user();
$user_login = $logged_user->user_login;
$user_id = $logged_user->ID;
$to = 'contact@vigilanti-alarmes.com';
$subject = '[Vigilanti] Demande de devis - ' . ucfirst($service ?: 'Général') . ' - ' . $nom;
$body = "Nouvelle demande de devis reçue via le site web.\n\n";
$body .= "Nom : $nom\n";
$body .= "Email : $email\n";
$body .= "Téléphone : $tel\n";
$body .= "Service : $service\n\n";
$body .= "Message :\n$message\n";
$body .= "\n---\nCompte client : $user_login (ID #$user_id)\n";
$headers = array(
'Content-Type: text/plain; charset=UTF-8',
'From: Site Vigilanti <noreply@vigilanti-alarmes.com>',
'Reply-To: ' . $nom . ' <' . $email . '>',
);
$sent = wp_mail($to, $subject, $body, $headers);
if ($sent) {
wp_send_json_success('Message envoyé');
} else {
wp_send_json_error('Erreur envoi email');
}
}
// ============================================================
// PWA — Progressive Web App
// ============================================================
add_action('wp_head', 'vigilanti_pwa_head', 1);
function vigilanti_pwa_head() {
$site_url = get_site_url();
echo '<link rel="manifest" href="' . esc_url($site_url) . '/manifest.json">' . "\n";
echo '<meta name="theme-color" content="#e63946">' . "\n";
echo '<meta name="mobile-web-app-capable" content="yes">' . "\n";
echo '<meta name="apple-mobile-web-app-capable" content="yes">' . "\n";
echo '<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">' . "\n";
echo '<meta name="apple-mobile-web-app-title" content="VIGILANTI">' . "\n";
echo '<link rel="apple-touch-icon" href="' . esc_url($site_url) . '/wp-content/uploads/vigilanti/pwa-icon-180.png">' . "\n";
}
add_action('wp_footer', 'vigilanti_pwa_register_sw', 998);
function vigilanti_pwa_register_sw() {
$site_url = get_site_url();
echo '<script>if("serviceWorker"in navigator){window.addEventListener("load",function(){navigator.serviceWorker.register("' . esc_url($site_url) . '/sw.js",{scope:"/"}).then(function(r){console.log("VIGILANTI SW:",r.scope)}).catch(function(e){console.log("SW err:",e)})})}</script>' . "\n";
}
// ============================================================
// INJECTION AUTOMATIQUE : Packs Sécurité Solaire sur la page d'accueil
// Insère le bloc avant la section "Pourquoi choisir" via wp_footer JS
// ============================================================
add_action('wp_footer', 'vigilanti_inject_packs_homepage_js', 5);
function vigilanti_inject_packs_homepage_js() {
// Uniquement sur la page d'accueil (ID 52)
if (!is_page(52) && !is_front_page()) return;
$packs_html = do_shortcode('[vigi_packs_solaires]');
// Utiliser une balise <template> pour éviter les problèmes d'échappement JS
?>
<template id="vigi-packs-template"><?php echo $packs_html; ?></template>
<script id="vigi-packs-inject">
(function() {
var tmpl = document.getElementById('vigi-packs-template');
var whySection = document.querySelector('.vigi-why');
if (tmpl && whySection && !document.querySelector('.vigi-packs-section')) {
var clone = document.importNode(tmpl.content, true);
whySection.parentNode.insertBefore(clone, whySection);
}
})();
</script>
<?php
}
// ============================================================
// SHORTCODE : Packs Sécurité Solaire — Ajax + Reolink
// ============================================================
add_shortcode('vigi_packs_solaires', 'vigilanti_packs_solaires_shortcode');
function vigilanti_packs_solaires_shortcode() {
ob_start();
?>
<section class="vigi-packs-section">
<div class="vigi-packs-inner">
<h2 class="vigi-packs-title">Nos Packs Sécurité Clés en Main</h2>
<p class="vigi-packs-sub">Des solutions complètes, prêtes à installer, adaptées à votre domicile ou votre entreprise en Nouvelle-Calédonie.</p>
<div class="vigi-packs-grid">
<!-- Pack Ajax -->
<div class="vigi-pack-card">
<div class="vigi-pack-badge">Partenaire officiel</div>
<div class="vigi-pack-img-wrap">
<img src="https://www.vigilanti-alarmes.com/wp-content/uploads/2026/06/pack-ajax-alarme-complet.jpg"
alt="Pack Alarme Ajax Complet"
class="vigi-pack-img" />
</div>
<div class="vigi-pack-body">
<div class="vigi-pack-label">Systèmes de sécurité</div>
<h3 class="vigi-pack-title">Pack Alarme Ajax Complet</h3>
<p class="vigi-pack-desc">Système d'alarme sans fil professionnel Ajax : centrale Hub 2 Plus, détecteurs de mouvement, contacts de porte, sirène extérieure, clavier tactile et télécommandes. Installation et configuration incluses.</p>
<ul class="vigi-pack-specs">
<li>✓ Centrale Ajax Hub 2 Plus</li>
<li>✓ Détecteurs de mouvement PIR</li>
<li>✓ Contacts magnétiques portes/fenêtres</li>
<li>✓ Sirène extérieure Ajax StreetSiren</li>
<li>✓ Clavier tactile + télécommandes</li>
<li>✓ Application mobile incluse</li>
</ul>
<div class="vigi-pack-price">
<span class="vigi-pack-price-label">À partir de</span>
<span class="vigi-pack-price-amount">180 000 XPF</span>
<span class="vigi-pack-price-note">installation incluse</span>
</div>
<a href="/systemes-de-securite/" class="vigi-pack-btn">Demander un devis →</a>
</div>
</div>
<!-- Pack Reolink Solaire -->
<div class="vigi-pack-card">
<div class="vigi-pack-badge vigi-pack-badge-green">Sans câblage</div>
<div class="vigi-pack-img-wrap">
<img src="https://www.vigilanti-alarmes.com/wp-content/uploads/2026/06/pack-reolink-solaire.jpg"
alt="Pack Vidéosurveillance Solaire Reolink"
class="vigi-pack-img" />
</div>
<div class="vigi-pack-body">
<div class="vigi-pack-label">Vidéosurveillance</div>
<h3 class="vigi-pack-title">Pack Vidéosurveillance Solaire Reolink</h3>
<p class="vigi-pack-desc">Kit complet de 4 caméras solaires 4K sans fil Reolink avec hub central. Aucun câblage nécessaire, autonomie solaire permanente, vision nocturne couleur et accès smartphone en temps réel.</p>
<ul class="vigi-pack-specs">
<li>✓ 4 caméras solaires 4K Reolink</li>
<li>✓ 4 panneaux solaires inclus</li>
<li>✓ Hub central Reolink</li>
<li>✓ Vision nocturne couleur</li>
<li>✓ Détection de mouvement IA</li>
<li>✓ Application mobile incluse</li>
</ul>
<div class="vigi-pack-price">
<span class="vigi-pack-price-label">À partir de</span>
<span class="vigi-pack-price-amount">150 000 XPF</span>
<span class="vigi-pack-price-note">installation incluse</span>
</div>
<a href="/videosurveillance/" class="vigi-pack-btn">Demander un devis →</a>
</div>
</div>
</div>
</div>
</section>
<style id="vigi-packs-css">
.vigi-packs-section {
background: linear-gradient(180deg, #0a0c14 0%, #0d0f1a 100%);
padding: 70px 20px;
margin: 0;
}
.vigi-packs-inner {
max-width: 1100px;
margin: 0 auto;
}
.vigi-packs-title {
text-align: center;
color: #ffffff;
font-size: 2rem;
font-weight: 800;
margin-bottom: 12px;
letter-spacing: -0.5px;
}
.vigi-packs-sub {
text-align: center;
color: rgba(255,255,255,0.65);
font-size: 1.05rem;
margin-bottom: 48px;
max-width: 680px;
margin-left: auto;
margin-right: auto;
}
.vigi-packs-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 32px;
}
.vigi-pack-card {
background: #12141f;
border-radius: 14px;
overflow: hidden;
border: 1px solid rgba(220,20,60,0.18);
box-shadow: 0 6px 32px rgba(0,0,0,0.4);
transition: box-shadow 0.3s ease, border-color 0.3s ease;
position: relative;
}
.vigi-pack-card:hover {
box-shadow: 0 10px 48px rgba(220,20,60,0.28);
border-color: rgba(220,20,60,0.42);
}
.vigi-pack-badge {
position: absolute;
top: 16px;
left: 16px;
background: #dc143c;
color: #fff;
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 5px 12px;
border-radius: 20px;
z-index: 2;
}
.vigi-pack-badge-green {
background: #1a7a3c;
}
.vigi-pack-img-wrap {
width: 100%;
height: 280px;
overflow: hidden;
background: #060810;
display: flex;
align-items: center;
justify-content: center;
}
.vigi-pack-img {
width: 100%;
height: 100%;
object-fit: contain;
display: block;
padding: 20px;
transition: transform 0.4s ease;
}
.vigi-pack-card:hover .vigi-pack-img {
transform: scale(1.04);
}
.vigi-pack-body {
padding: 28px 30px 32px;
}
.vigi-pack-label {
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.1em;
color: #dc143c;
margin-bottom: 8px;
}
.vigi-pack-title {
font-size: 1.3rem;
font-weight: 800;
color: #ffffff;
margin-bottom: 12px;
line-height: 1.3;
}
.vigi-pack-desc {
color: rgba(255,255,255,0.72);
font-size: 0.93rem;
line-height: 1.7;
margin-bottom: 18px;
}
.vigi-pack-specs {
list-style: none;
padding: 0;
margin: 0 0 24px 0;
}
.vigi-pack-specs li {
color: rgba(255,255,255,0.78);
font-size: 0.88rem;
padding: 4px 0;
border-bottom: 1px solid rgba(255,255,255,0.07);
}
.vigi-pack-specs li:last-child {
border-bottom: none;
}
.vigi-pack-price {
background: rgba(220, 20, 60, 0.08);
border: 1px solid rgba(220, 20, 60, 0.25);
border-radius: 8px;
padding: 14px 18px;
margin: 16px 0 14px;
display: flex;
flex-direction: column;
gap: 2px;
}
.vigi-pack-price-label {
font-size: 0.75rem;
color: #aaa;
text-transform: uppercase;
letter-spacing: 0.08em;
font-weight: 600;
}
.vigi-pack-price-amount {
font-size: 1.6rem;
font-weight: 900;
color: #dc143c;
line-height: 1.1;
}
.vigi-pack-price-note {
font-size: 0.75rem;
color: #888;
font-style: italic;
}
.vigi-pack-btn {
display: inline-block;
background: #dc143c;
color: #fff !important;
padding: 12px 26px;
border-radius: 6px;
font-weight: 700;
font-size: 0.9rem;
text-decoration: none;
transition: background 0.2s ease;
}
.vigi-pack-btn:hover {
background: #b01030;
color: #fff !important;
text-decoration: none;
}
@media (max-width: 768px) {
.vigi-packs-grid {
grid-template-columns: 1fr;
}
.vigi-packs-title {
font-size: 1.5rem;
}
}
</style>
<?php
return ob_get_clean();
}
Systèmes de sécurité – VIGILANTI — Sécurité & Informatique
Aller au contenu
Systèmes de sécurité
Alarmes Ajax, contrôle d’accès, détection incendie — Partenaire Ajax Systems
VIGILANTI est partenaire Ajax Systems en Nouvelle-Calédonie. Nous installons et maintenons les meilleurs systèmes de sécurité sans fil professionnels pour particuliers et entreprises.
Nos produits Ajax
Ajax Hub 2 Plus — Centrale d’alarme
La centrale d’alarme la plus avancée d’Ajax. Connexion quadruple (Ethernet, Wi-Fi, 2G/3G/4G), compatible avec jusqu’à 200 appareils. Gestion complète depuis l’application Ajax sur smartphone.
Connexion quadruple : Ethernet + Wi-Fi + 4G
Jusqu’à 200 appareils connectés
Batterie de secours 38h
Application iOS/Android incluse
Chiffrement des communications
À partir de Centrale seule 45 000 XPF — installation et configuration incluses
Demander un devis
Kit alarme Ajax Plus — Maison ou bureau
Kit complet comprenant la centrale Hub 2 Plus, détecteurs de mouvement, contacts de portes/fenêtres, sirène intérieure et extérieure. Installation professionnelle par nos techniciens certifiés Ajax.
Centrale Hub 2 Plus incluse
2 détecteurs de mouvement
Contacts magnétiques portes/fenêtres
Sirène extérieure 110 dB
Télécommande
Kit maison à partir de 155 000 XPF — installation incluse
Demander un devis
Contrôle d’accès et interphonie
Systèmes de contrôle d’accès par badge, code ou biométrie. Interphonie vidéo, gestion des entrées/sorties, historique des accès. Idéal pour les entreprises, résidences et sites industriels.
Lecteurs de badges RFID
Interphonie vidéo HD
Gestion multi-portes et multi-sites
Historique des accès en temps réel
Intégration avec système Ajax
Sur devis — selon configuration
Demander un devis
Sécurisez votre domicile ou votre entreprise
Nos techniciens se déplacent dans toute la Nouvelle-Calédonie et les îles.
Demander un devis gratuit