loader image

Descripción de Qué es Wimbo

Wimbo es una innovadora solución de identificación para mascotas que utiliza plaquitas de acero con códigos QR. Estas plaquitas permiten a los dueños de mascotas crear un perfil en línea para su mascota, donde pueden incluir información importante como el nombre, características de personalidad, contacto de emergencia, dirección, historial de vacunas y una galería de fotos. Con Wimbo, la seguridad y la tranquilidad están siempre al alcance de tu mano.

Descripción de Cómo Trabaja Wimbo en 4 Pasos

  1. Compra tu Plaquita QR:
    • Adquiere una plaquita QR de Wimbo en nuestra tienda en línea. Elige entre varios tamaños y colores disponibles.
  2. Regístrate en Nuestra Web:
    • Crea una cuenta en nuestro sitio web y enlaza el código QR de tu plaquita al perfil de tu mascota.
  3. Crea el Perfil de tu Mascota:
    • Completa el perfil de tu mascota con la información que desees mostrar: nombre, personalidad, contacto, dirección, vacunas y fotos.
  4. Recibe Notificaciones en Tiempo Real:
    • Cada vez que alguien escanee el código QR de la plaquita, recibirás una notificación por email y WhatsApp con la ubicación aproximada del escaneo.

Ventajas y Beneficios de Nuestras Plaquitas

  • Seguridad y Tranquilidad: Mantén a tu mascota segura con un perfil en línea accesible desde cualquier lugar.
  • Notificaciones en Tiempo Real: Recibe alertas instantáneas cuando alguien escanee la plaquita de tu mascota.
  • Personalización: Elige qué información mostrar en el perfil de tu mascota.
  • Durabilidad: Plaquitas de acero inoxidable, resistentes y duraderas.
  • Sin Suscripciones: Paga una sola vez y disfruta del servicio de por vida, sin costos adicionales ni suscripciones.

Por Qué Preferirnos

  • Económicas y Funcionales: Nuestras plaquitas QR son asequibles y ofrecen un servicio completo sin pagos extras.
  • Innovación y Tecnología: Utilizamos la última tecnología para garantizar la seguridad de tu mascota.
  • Fácil de Usar: Nuestro sistema es intuitivo y fácil de usar, sin necesidad de instalar aplicaciones adicionales.
  • Atención al Cliente: Ofrecemos soporte dedicado para ayudarte en cada paso del proceso.

Call to Actions (CTAs)

  1. “¡Compra tu Plaquita QR Ahora y Protege a tu Mascota!”
  2. “Regístrate Hoy y Crea el Perfil de tu Mascota en Minutos”
  3. “Descubre la Tranquilidad con Wimbo: Compra Ahora”
  4. “¡No Esperes Más! Protege a tu Mascota con Wimbo”
  5. “¡Haz Clic Aquí y Asegura la Seguridad de tu Mascota!”

Espero que esta información te sea útil para comenzar con la creación de tu página web. ¿Hay algo más en lo que pueda asistirte?

 

 

 

DESCRIPCION DE PRODUCTOS PLACAS QR PARA WOOCOMMERCE

 

Descripción Corta

La Placa Wimbo QR para Mascotas es una innovadora y resistente placa de acero con un acabado brillante y un código QR único. Permite crear un perfil detallado de tu mascota y recibir notificaciones en tiempo real si se pierde.

 

Descripción Larga

¡Presentamos la Placa Wimbo QR para Mascotas! Esta elegante y resistente placa de acero en color negro no solo es un accesorio bonito, sino también una herramienta esencial para la seguridad de tu mascota. Con un acabado brillante gracias a la pintura automotriz y un laqueado protector, esta placa está diseñada para durar. La protección final con resina epoxica y curado UV asegura una alta durabilidad y resistencia.

 

Las medidas de la placa son 65mm de ancho, 38mm de alto y 2.5mm de grosor, con una apertura para correa de 8mm de ancho y 30mm de alto, perfecta para cualquier collar. El código QR único permite la creación de un perfil detallado de tu mascota, donde puedes incluir su nombre, descripción, fotos, vacunas, teléfonos de contacto y más. Además, recibirás notificaciones en tiempo real al email y WhatsApp con un enlace a Google Maps, mostrando la ubicación aproximada del escaneo.

 

Lo mejor de todo es que tú decides qué información mostrar, manteniendo el control total sobre la privacidad de tu mascota. La Placa Wimbo QR no solo es funcional, sino también un accesorio adorable e innovador que asegura que tu mascota siempre esté segura y fácil de encontrar. ¡Haz que tu mascota luzca genial y esté protegida con la Placa Wimbo QR!

 

Descripción Técnica

Color: Negro

Material: Acero

Acabado: Brillante con pintura automotriz y laqueado protector

Protección Final: Resina epoxica con curado UV

Medidas: 65mm de ancho, 38mm de alto, 2.5mm de grosor

Apertura para Correa: 8mm de ancho, 30mm de alto

Código QR: Único para creación de perfil

Notificaciones: En tiempo real al email y WhatsApp con enlace a Google Maps

Beneficios

Innovación y Seguridad: Perfil detallado de tu mascota accesible desde cualquier dispositivo.

Durabilidad: Materiales de alta calidad y protección UV para una larga vida útil.

Control de Privacidad: Tú decides qué información mostrar.

Notificaciones en Tiempo Real: Recibe alertas instantáneas con la ubicación aproximada si tu mascota se pierde.

 

Redirect 301 /wimbo/placa-qr/1225/ /wimbo/perfil-de-mascota/dana/

 

 

Codigo de Redirecciones

 

Ajustes en el Código

  1. Obtener el inserted_post_id: Utilizaremos el ID del post recién creado proporcionado por JetFormBuilder.
  2. Redirigir correctamente: Usaremos este ID para obtener la URL correcta del nuevo post.

Aquí tienes el código ajustado:

PHP

				
					add_action('jet-form-builder/custom-action/', 'add_htaccess_redirect', 10, 3);

function add_htaccess_redirect($request, $action_handler) {
    // Obtener los valores del formulario
    $url_temporal = isset($request['url_tempo']) ? $request['url_tempo'] : '';
    $post_id = isset($request['inserted_post_id']) ? $request['inserted_post_id'] : 0;

    // Verificar si el post_id es válido
    if ($post_id) {
        // Obtener la URL del nuevo post perfil_de_mascota
        $post_url = get_permalink($post_id);

        // Formatear la redirección
        $redirect_rule = "Redirect 301 " . parse_url($url_temporal, PHP_URL_PATH) . " " . parse_url($post_url, PHP_URL_PATH) . "\n";

        // Ruta del archivo .htaccess
        $htaccess_file = ABSPATH . '.htaccess';

        // Leer el contenido actual del archivo .htaccess
        $htaccess_content = file_get_contents($htaccess_file);

        // Agregar la nueva redirección al inicio del archivo
        $new_htaccess_content = $redirect_rule . $htaccess_content;

        // Escribir el nuevo contenido en el archivo .htaccess
        file_put_contents($htaccess_file, $new_htaccess_content);

        // Agregar una nota al debug.log para rastrear errores
        if (defined('WP_DEBUG') && WP_DEBUG) {
            error_log('Redirección añadida: ' . $redirect_rule);
        }
    } else {
        // Agregar una nota al debug.log si el post_id no es válido
        if (defined('WP_DEBUG') && WP_DEBUG) {
            error_log('Error: post_id no válido.');
        }
    }
}

				
			

Código generado por IA. Revisar y usar cuidadosamente. Más información sobre preguntas frecuentes.

Explicación de los cambios:

  1. Uso de inserted_post_id: Ahora estamos utilizando el ID del post recién creado proporcionado por JetFormBuilder.
  2. Redirección correcta: Obtenemos la URL del nuevo post utilizando get_permalink($post_id).

Verificación y Depuración:

  • Asegúrate de que el archivo .htaccess sea escribible.
  • Revisa el archivo debug.log en el directorio wp-content para cualquier error registrado.

Prueba esta configuración y verifica si la redirección funciona correctamente. Si sigues teniendo problemas, házmelo saber y exploraremos otras posibles soluciones.

CREACION DE LOCALIZACION HTML5

Sí, comprendo lo que necesitas. Vamos a dividir el proceso en dos partes: una para cuando se obtienen las coordenadas de HTML5 y otra para cuando se utilizan las coordenadas de MaxMind. Primero intentaremos obtener las coordenadas de HTML5 y, si no se obtienen, usaremos las de MaxMind. Luego, enviaremos la notificación correspondiente según el método utilizado. 

Archivo geolocation.js

JavaScript

				
					document.addEventListener('DOMContentLoaded', function() {
    getLocation();
});

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition, showError, { enableHighAccuracy: true, maximumAge: 0 });
    } else {
        console.log("Geolocalización no está soportada por este navegador.");
        sendVisitNotification(null, null); // Fallback to IP-based location
    }
}

function showPosition(position) {
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
    console.log("Latitud: " + lat + " Longitud: " + lon);
    sendVisitNotification(lat, lon, true);
}

function showError(error) {
    switch(error.code) {
        case error.PERMISSION_DENIED:
            console.log("El usuario denegó la solicitud de Geolocalización.");
            break;
        case error.POSITION_UNAVAILABLE:
            console.log("La información de ubicación no está disponible.");
            break;
        case error.TIMEOUT:
            console.log("La solicitud para obtener la ubicación del usuario ha caducado.");
            break;
        case error.UNKNOWN_ERROR:
            console.log("Ha ocurrido un error desconocido.");
            break;
    }
    sendVisitNotification(null, null, false); // Fallback to IP-based location
}

function sendVisitNotification(lat, lon, html5) {
    var postId = wp_ajax_data.post_id;

    if (!postId) {
        console.log('No se pudo obtener el ID del post.');
        return;
    }

    var xhr = new XMLHttpRequest();
    xhr.open('POST', wp_ajax_data.ajax_url, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.onload = function() {
        if (xhr.status === 200) {
            console.log('Notificación enviada.');
        } else {
            console.log('Error al enviar la notificación.');
        }
    };
    xhr.send('action=send_location&post_id=' + postId + '&lat=' + lat + '&lon=' + lon + '&html5=' + html5);
}

				
			

Archivo functions.php

Asegurémonos de que la función send_visit_notification siempre reciba los cuatro argumentos necesarios.

PHP

				
					// Enviar notificación de visita
function send_visit_notification($post_id, $lat, $lon, $html5) {
    $visitor_ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';

    // Obtener el autor del post
    $post = get_post($post_id);
    if (!$post) {
        error_log("Error: No se pudo obtener el post con ID: $post_id");
        return;
    }
    
    $author_id = $post->post_author;
    $author_email = get_the_author_meta('user_email', $author_id);
    $post_title = get_the_title($post_id);

    // Crear el enlace de Google Maps
    $google_maps_link = "https://www.google.com/maps/search/?api=1&query={$lat},{$lon}";

    // Crear el mensaje del email
    if ($html5) {
        $subject = 'Alerta de Scaneo de Placa Wimbo QR';
        $message = "Han escaneado la placa de tu mascota \"$post_title\" desde la IP: $visitor_ip.\n\n";
        $message .= "El Usuario ha permitido el acceso a su ubicación por lo que la precisión de la ubicación varía solo entre 5 a 10 metros.\n";
        $message .= "Accede a este link para obtener una ubicación aproximada del lugar del escaneo: $google_maps_link\n";
        $message .= "Coordenadas: {$lat}, {$lon}\n";
        $message .= "Ver en Google Maps: $google_maps_link";
    } else {
        $subject = 'Alerta de Scaneo de Placa Wimbo QR';
        $message = "Han escaneado la placa de tu mascota \"$post_title\" desde la IP: $visitor_ip.\n\n";
        $message .= "El usuario ha bloqueado el acceso a su ubicación, por lo cual las coordenadas obtenidas podrían ser inexactas y se basan en el registro de ubicación de la IP de la compañía.\n";
        $message .= "Accede a este link para obtener una ubicación aproximada del lugar del escaneo: $google_maps_link\n";
        $message .= "Coordenadas: {$lat}, {$lon}\n";
        $message .= "Ver en Google Maps: $google_maps_link";
    }

    // Enviar el email
    wp_mail($author_email, $subject, $message, ['From: notificaciones@wimbo.com.ar']);
    
    // Log para confirmar que el email fue enviado
    error_log("Notificación enviada al email: $author_email para el post $post_title con coordenadas: {$lat}, {$lon}.");
}

// Hook para capturar la visita
add_action('wp_ajax_send_visit_notification', function() {
    $post_id = isset($_POST['post_id']) ? sanitize_text_field($_POST['post_id']) : null;
    $lat = isset($_POST['lat']) ? sanitize_text_field($_POST['lat']) : null;
    $lon = isset($_POST['lon']) ? sanitize_text_field($_POST['lon']) : null;
    $html5 = isset($_POST['html5']) ? filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN) : false;

    send_visit_notification($post_id, $lat, $lon, $html5);
});
add_action('wp_ajax_nopriv_send_visit_notification', function() {
    $post_id = isset($_POST['post_id']) ? sanitize_text_field($_POST['post_id']) : null;
    $lat = isset($_POST['lat']) ? sanitize_text_field($_POST['lat']) : null;
    $lon = isset($_POST['lon']) ? sanitize_text_field($_POST['lon']) : null;
    $html5 = isset($_POST['html5']) ? filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN) : false;

    send_visit_notification($post_id, $lat, $lon, $html5);
});

				
			
  1. Actualiza el archivo geolocation.js con el código anterior.
  2. Actualiza el archivo functions.php con el código para encolar el script y pasar datos de PHP a JavaScript.
  3. Visita la página de perfil de mascota en tu sitio.
  4. Permite el acceso a la ubicación cuando se

Usted

Enviado por usted:

Lo has logrado funnncionaaa, nunca dude de ti, eres el mejor…

 

AGREGANDO EL TIPO DE DISPOSITIVO

Vamos a hacerlo! Añadiremos la detección del dispositivo y del navegador en el código JavaScript y PHP, y luego ajustaremos las notificaciones para incluir esta información. 

Archivo geolocation.js

JavaScript

				
					document.addEventListener('DOMContentLoaded', function() {
    getLocation();
    captureBrowserData();
});

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition, showError, { enableHighAccuracy: true, maximumAge: 0 });
    } else {
        console.log("Geolocalización no está soportada por este navegador.");
        sendVisitNotification(null, null, false); // Fallback to IP-based location
    }
}

function showPosition(position) {
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
    console.log("Latitud: " + lat + " Longitud: " + lon);
    sendVisitNotification(lat, lon, true);
}

function showError(error) {
    switch(error.code) {
        case error.PERMISSION_DENIED:
            console.log("El usuario denegó la solicitud de Geolocalización.");
            break;
        case error.POSITION_UNAVAILABLE:
            console.log("La información de ubicación no está disponible.");
            break;
        case error.TIMEOUT:
            console.log("La solicitud para obtener la ubicación del usuario ha caducado.");
            break;
        case error.UNKNOWN_ERROR:
            console.log("Ha ocurrido un error desconocido.");
            break;
    }
    sendVisitNotification(null, null, false); // Fallback to IP-based location
}

function sendVisitNotification(lat, lon, html5) {
    var postId = wp_ajax_data.post_id;
    var browserData = captureBrowserData();

    if (!postId) {
        console.log('No se pudo obtener el ID del post.');
        return;
    }

    var xhr = new XMLHttpRequest();
    xhr.open('POST', wp_ajax_data.ajax_url, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.onload = function() {
        if (xhr.status === 200) {
            console.log('Notificación enviada.');
        } else {
            console.log('Error al enviar la notificación.');
        }
    };
    xhr.send('action=send_location&post_id=' + postId + '&lat=' + lat + '&lon=' + lon + '&html5=' + html5 + '&browser_data=' + JSON.stringify(browserData));
}

function captureBrowserData() {
    var userAgent = navigator.userAgent;
    var platform = navigator.platform;
    var language = navigator.language;
    var screenResolution = window.screen.width + 'x' + window.screen.height;

    var deviceType = 'PC';
    if (/Mobi|Android/i.test(userAgent)) {
        deviceType = 'Mobile';
    } else if (/Tablet|iPad/i.test(userAgent)) {
        deviceType = 'Tablet';
    }

    var browserName = 'Unknown';
    if (userAgent.indexOf("Chrome") > -1) {
        browserName = "Chrome";
    } else if (userAgent.indexOf("Safari") > -1) {
        browserName = "Safari";
    } else if (userAgent.indexOf("Firefox") > -1) {
        browserName = "Firefox";
    } else if (userAgent.indexOf("MSIE") > -1 || !!document.documentMode) {
        browserName = "IE";
    } else if (userAgent.indexOf("Edge") > -1) {
        browserName = "Edge";
    }

    return {
        userAgent: userAgent,
        platform: platform,
        language: language,
        screenResolution: screenResolution,
        deviceType: deviceType,
        browserName: browserName
    };
}

				
			

Archivo functions.php

PHP

				
					// Encolar el script de geolocalización y pasar la URL de AJAX
function enqueue_geolocation_script() {
    if (is_singular('perfil-de-mascota')) {
        wp_enqueue_script('geolocation-script', get_template_directory_uri() . '/js/geolocation.js', [], null, true);

        // Pasar la URL de admin-ajax.php al script de JavaScript
        wp_localize_script('geolocation-script', 'wp_ajax_data', [
            'ajax_url' => admin_url('admin-ajax.php'),
            'post_id' => get_the_ID(),
        ]);
    }
}
add_action('wp_enqueue_scripts', 'enqueue_geolocation_script');

// Manejar la solicitud AJAX que recibe las coordenadas
function handle_geolocation_ajax() {
    $lat = isset($_POST['lat']) ? sanitize_text_field($_POST['lat']) : null;
    $lon = isset($_POST['lon']) ? sanitize_text_field($_POST['lon']) : null;
    $post_id = isset($_POST['post_id']) ? sanitize_text_field($_POST['post_id']) : null;
    $html5 = isset($_POST['html5']) ? filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN) : false;
    $browser_data = isset($_POST['browser_data']) ? json_decode(stripslashes($_POST['browser_data']), true) : null;

    if ($lat && $lon && $html5) {
        // Registrar en debug.log
        error_log("Coordenadas HTML5 recibidas: Latitud: $lat, Longitud: $lon para el post ID: $post_id");

        // Enviar notificación con coordenadas HTML5
        send_visit_notification($post_id, $lat, $lon, $html5, $browser_data);
        wp_send_json_success('Coordenadas HTML5 recibidas.');
    } else {
        error_log("Error: No se recibieron coordenadas HTML5.");
        // Obtener coordenadas basadas en IP usando MaxMind
        $visitor_ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
        $coordinates = get_coordinates_from_ip($visitor_ip);
        if ($coordinates) {
            send_visit_notification($post_id, $coordinates['lat'], $coordinates['lon'], false, $browser_data);
        } else {
            send_visit_notification($post_id, 'No disponible', 'No disponible', false, $browser_data);
        }
        wp_send_json_error('No se recibieron coordenadas HTML5.');
    }

    wp_die();
}
add_action('wp_ajax_send_location', 'handle_geolocation_ajax');
add_action('wp_ajax_nopriv_send_location', 'handle_geolocation_ajax');

// Obtener coordenadas basadas en IP usando MaxMind
function get_coordinates_from_ip($ip) {
    $account_id = '1063783';
    $license_key = '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';
    $url = "https://geoip.maxmind.com/geoip/v2.1/city/$ip";

    $response = wp_remote_get($url, [
        'headers' => [
            'Authorization' => 'Basic ' . base64_encode("$account_id:$license_key")
        ]
    ]);

    if (is_wp_error($response)) {
        error_log("Error en la solicitud a la API de MaxMind: " . $response->get_error_message());
        return false;
    }

    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if (isset($data['location']['latitude']) && isset($data['location']['longitude'])) {
        error_log("Coordenadas MaxMind obtenidas: Latitud: {$data['location']['latitude']}, Longitud: {$data['location']['longitude']}");

        return [
            'lat' => $data['location']['latitude'],
            'lon' => $data['location']['longitude']
        ];
    } else {
        error_log("Error: Respuesta inesperada de la API de MaxMind.");
        return false;
    }
}

// Enviar notificación de visita
function send_visit_notification($post_id, $lat, $lon, $html5, $browser_data) {
    $visitor_ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';

    // Obtener el autor del post
    $post = get_post($post_id);
    if (!$post) {
        error_log("Error: No se pudo obtener el post con ID: $post_id");
        return;
    }
    
    $author_id = $post->post_author;
    $author_email = get_the_author_meta('user_email', $author_id);
    $post_title = get_the_title($post_id);

    // Crear el enlace de Google Maps
    $google_maps_link = "https://www.google.com/maps/search/?api=1&query={$lat},{$lon}";

    // Obtener datos del navegador y dispositivo
    $device_type = $browser_data['deviceType'] ?? 'Desconocido';
    $browser_name = $browser_data['browserName'] ?? 'Desconocido';

    // Crear el mensaje del email
    if ($html5) {
        $subject = 'Alerta de Scaneo de Placa Wimbo QR';
        $message = "Han escaneado la placa de tu mascota \"$post_title\" desde la IP: $visitor_ip, desde un dispositivo tipo: $device_type y desde el navegador: $browser_name.\n\n";
        $message .= "El Usuario ha permitido el acceso a su ubicación por lo que la precisión de la ubicación varía solo entre 5 a 10 metros.\n";
        $message .= "Accede a este link para obtener una ubicación aproximada del lugar del escaneo: $google_maps_link\n";
        $message .= "Coordenadas: {$lat}, {$lon}\n";
        $message .= "Ver en Google Maps: $google_maps_link";
    } else {
        $subject = 'Alerta de Scaneo de Placa Wimbo QR';
        $message = "Han escaneado la placa de tu mascota \"$post_title\" desde la IP: $visitor_ip, desde un dispositivo tipo: $device_type y desde el navegador: $browser_name.\n\n";
        $message .= "El usuario ha bloqueado el acceso a su ubicación, por lo cual las coordenadas obtenidas podrían ser inexactas y se basan en el registro de ubicación de la IP de la compañía prestadora de servicio.\n";
        $message .= "Accede a este link para obtener una ubicación aproximada del lugar del escaneo: $google_maps_link\n";
        $message .= "Coordenadas: {$lat}, {$lon}\n";
        $message .= "Ver en Google Maps: $google_maps_link";
    }

    // Enviar el email
    wp_mail($author_email, $subject, $message, ['From: notificaciones@wimbo.com.ar']);
    
    // Log para confirmar que el email fue enviado
    error_log("Notificación enviada al email: $author_email para el post $post_title con coordenadas: {$lat}, {$lon}.");
}

// Hook para capturar la visita
add_action('wp_ajax_send_visit_notification', function() {
    $post_id = isset($_POST['post_id']) ? sanitize_text_field($_POST['post_id']) : null;
    $lat = isset($_POST['lat']) ? sanitize_text_field($_POST['lat']) : null;
    $lon = isset($_POST['lon']) ? sanitize_text_field($_POST['lon']) : null;
    $html5 = isset($_POST['html5']) ? filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN) : false;
    $browser_data = isset($_POST['browser_data']) ? json_decode(stripslashes($_POST['browser_data']), true) : null;

    send_visit_notification($post_id, $lat, $lon, $html5, $browser_data);
});
add_action('wp_ajax_nopriv_send_visit_notification', function() {
    $post_id = isset($_POST['post_id']) ? sanitize_text_field($_POST['post_id']) : null;
    $lat = isset($_POST['lat']) ? sanitize_text_field($_POST['lat']) : null;
    $lon = isset($_POST['lon']) ? sanitize_text_field($_POST['lon']) : null;
    $html5 = isset($_POST['html5']) ? filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN) : false;
    $browser_data = isset($_POST['browser_data']) ? json_decode(stripslashes($_POST['browser_data']), true) : null;

    send_visit_notification($post_id, $lat, $lon, $html5, $browser_data);
});

				
			

Verificación y Pruebas

  1. Actualiza el archivo functions.php con el código anterior.
  2. Visita la página de perfil de mascota en tu sitio.
  3. Permite o deniega el acceso a la ubicación cuando se te solicite.
  4. Revisa los logs de error para asegurarte de que la notificación se envía correctamente y sin errores.

 

 

Implementación de TWILIO

 

¡Perfecto! Vamos a instalar la biblioteca de Twilio en tu entorno de WordPress. Dado que no estás familiarizado con Composer, te guiaré a través de un método alternativo que no requiere su uso.

Paso 1: Descargar la Biblioteca de Twilio

  1. Descargar el SDK de Twilio: Ve a la página de GitHub de Twilio PHP SDK y descarga el archivo ZIP del repositorio.
  2. Extraer el archivo ZIP: Extrae el contenido del archivo ZIP en tu computadora.

Paso 2: Subir la Biblioteca a tu Servidor

  1. Acceder a tu servidor: Utiliza tu cliente FTP (como FileZilla) para conectarte a tu servidor DreamHost.
  2. Navegar a tu instalación de WordPress: Ve a la carpeta wp-content/plugins/.
  3. Crear una nueva carpeta para Twilio: Dentro de wp-content/plugins/, crea una nueva carpeta llamada twilio-sdk.
  4. Subir los archivos: Sube los archivos extraídos del SDK de Twilio a la carpeta twilio-sdk.

Paso 3: Crear un Plugin Personalizado para Integrar Twilio

  1. Crear el archivo del plugin: En la carpeta wp-content/plugins/twilio-sdk/, crea un nuevo archivo llamado twilio-integration.php.
  2. Agregar el encabezado del plugin: Abre twilio-integration.php y agrega el siguiente código para definir el plugin:

 

  1. Crear el archivo del plugin: En la carpeta wp-content/plugins/twilio-sdk/, crea un nuevo archivo llamado twilio-integration.php.
  2. Pegar el código: Abre twilio-integration.php y pega el código anterior.

Activar el Plugin en WordPress

  1. Acceder al panel de administración de WordPress: Ve a tu sitio de WordPress y accede al panel de administración.
  2. Activar el plugin: Navega a Plugins > Plugins instalados y activa el plugin “Twilio Integration”.
  3. Asegúrate de que el código en twilio-integration.php sea el siguiente:
				
					4.	<?php
5.	/*
6.	Plugin Name: Twilio Integration
7.	Description: Plugin para integrar Twilio en WordPress.
8.	Version: 1.0
9.	Author: Tu Nombre
10.	*/
11.	
12.	// Incluir el SDK de Twilio
13.	require_once plugin_dir_path(__FILE__) . 'src/Twilio/autoload.php';
14.	
15.	use Twilio\Rest\Client;
16.	
17.	function send_whatsapp_notification($telefono, $message_content) {
18.	    $sid = 'AC2a2143a073ccdec1fa1a160e31496668'; // Tu Account SID
19.	    $token = '4e6405da93162bd463512d2006ee7007'; // Tu Auth Token
20.	    $twilio_number = 'whatsapp:+14155238886'; // Número de WhatsApp de Twilio
21.	
22.	    try {
23.	        $client = new Client($sid, $token);
24.	
25.	        $client->messages->create(
26.	            "whatsapp:$telefono",
27.	            array(
28.	                'from' => $twilio_number,
29.	                'body' => $message_content
30.	            )
31.	        );
32.	    } catch (Exception $e) {
33.	        error_log('Error al enviar el mensaje de WhatsApp: ' . $e->getMessage());
34.	    }
35.	}
36.	
37.	// Agregar el shortcode para probar Twilio
38.	add_shortcode('test_twilio', function() {
39.	    send_whatsapp_notification('5492616652408', '¡Hola! Este es un mensaje de prueba desde Twilio.');
40.	    return 'Mensaje enviado.';
41.	});

				
			

ESTE ES EL CODIGO DEL FUNTION.PHP ACTUALIZADO QUE ENVIA LAS NOTIFICACIONES CON LA INTEGRACION DE WHATSAPP SANDBOX DE TWILIO INTEGRADA

 

PHP:

				
					// Encolar el script de geolocalización y pasar la URL de AJAX
function enqueue_geolocation_script() {
    if (is_singular('perfil-de-mascota')) {
        wp_enqueue_script('geolocation-script', get_template_directory_uri() . '/js/geolocation.js', [], null, true);

        // Pasar la URL de admin-ajax.php al script de JavaScript
        wp_localize_script('geolocation-script', 'wp_ajax_data', [
            'ajax_url' => admin_url('admin-ajax.php'),
            'post_id' => get_the_ID(),
        ]);
    }
}
add_action('wp_enqueue_scripts', 'enqueue_geolocation_script');

// Manejar la solicitud AJAX que recibe las coordenadas
function handle_geolocation_ajax() {
    $lat = isset($_POST['lat']) ? sanitize_text_field($_POST['lat']) : null;
    $lon = isset($_POST['lon']) ? sanitize_text_field($_POST['lon']) : null;
    $post_id = isset($_POST['post_id']) ? sanitize_text_field($_POST['post_id']) : null;
    $html5 = isset($_POST['html5']) ? filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN) : false;
    $browser_data = isset($_POST['browser_data']) ? json_decode(stripslashes($_POST['browser_data']), true) : null;

    if ($lat && $lon && $html5) {
        // Registrar en debug.log
        error_log("Coordenadas HTML5 recibidas: Latitud: $lat, Longitud: $lon para el post ID: $post_id");

        // Enviar notificación con coordenadas HTML5
        send_visit_notification($post_id, $lat, $lon, $html5, $browser_data);
        wp_send_json_success('Coordenadas HTML5 recibidas.');
    } else {
        error_log("Error: No se recibieron coordenadas HTML5.");
        // Obtener coordenadas basadas en IP usando MaxMind
        $visitor_ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
        $coordinates = get_coordinates_from_ip($visitor_ip);
        if ($coordinates) {
            send_visit_notification($post_id, $coordinates['lat'], $coordinates['lon'], false, $browser_data);
        } else {
            send_visit_notification($post_id, 'No disponible', 'No disponible', false, $browser_data);
        }
        wp_send_json_error('No se recibieron coordenadas HTML5.');
    }

    wp_die();
}
add_action('wp_ajax_send_location', 'handle_geolocation_ajax');
add_action('wp_ajax_nopriv_send_location', 'handle_geolocation_ajax');

// Obtener coordenadas basadas en IP usando MaxMind
function get_coordinates_from_ip($ip) {
    $account_id = '1063783';
    $license_key = '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';
    $url = "https://geoip.maxmind.com/geoip/v2.1/city/$ip";

    $response = wp_remote_get($url, [
        'headers' => [
            'Authorization' => 'Basic ' . base64_encode("$account_id:$license_key")
        ]
    ]);

    if (is_wp_error($response)) {
        error_log("Error en la solicitud a la API de MaxMind: " . $response->get_error_message());
        return false;
    }

    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if (isset($data['location']['latitude']) && isset($data['location']['longitude'])) {
        error_log("Coordenadas MaxMind obtenidas: Latitud: {$data['location']['latitude']}, Longitud: {$data['location']['longitude']}");

        return [
            'lat' => $data['location']['latitude'],
            'lon' => $data['location']['longitude']
        ];
    } else {
        error_log("Error: Respuesta inesperada de la API de MaxMind.");
        return false;
    }
}

// Incluir el SDK de Twilio
if (!class_exists('Twilio\Rest\Client')) {
    require_once plugin_dir_path(__FILE__) . 'twilio-sdk/src/Twilio/autoload.php';
}

use Twilio\Rest\Client;

function send_visit_notification($post_id, $lat, $lon, $html5, $browser_data) {
    // Obtener el número de teléfono del metacampo
    $telefono = get_post_meta($post_id, 'telefono_1', true);

    // Obtener el autor del post
    $post = get_post($post_id);
    if (!$post) {
        error_log("Error: No se pudo obtener el post con ID: $post_id");
        return;
    }
    
    $author_id = $post->post_author;
    $author_email = get_the_author_meta('user_email', $author_id);
    $post_title = get_the_title($post_id);

    // Crear el enlace de Google Maps
    $google_maps_link = "https://www.google.com/maps/search/?api=1&query={$lat},{$lon}";

    // Obtener datos del navegador y dispositivo
    $device_type = $browser_data['deviceType'] ?? 'Desconocido';
    $browser_name = $browser_data['browserName'] ?? 'Desconocido';

    // Crear el contenido del mensaje
    $message_content = "Han escaneado la placa de tu mascota \"$post_title\" desde la IP: {$_SERVER['REMOTE_ADDR']}, desde un dispositivo tipo: $device_type y desde el navegador: $browser_name.\n\n";
    if ($html5) {
        $message_content .= "El Usuario ha permitido el acceso a su ubicación por lo que la precisión de la ubicación varía solo entre 5 a 10 metros.\n\n";
    } else {
        $message_content .= "El usuario ha bloqueado el acceso a su ubicación, por lo cual las coordenadas obtenidas podrían ser inexactas y se basan en el registro de ubicación de la IP de la compañía prestadora de servicio.\n\n";
    }
    $message_content .= "Accede a este link para obtener una ubicación aproximada del lugar del escaneo: $google_maps_link\n";
    $message_content .= "Datos del navegador: " . json_encode($browser_data);

    // Enviar notificación por correo electrónico
    wp_mail($author_email, 'Notificación de visita', $message_content);

    // Enviar notificación por WhatsApp
    if ($telefono) {
        send_whatsapp_notification($telefono, $message_content);
    }

    // Log para confirmar que el email fue enviado
    error_log("Notificación enviada al email: $author_email y al número de WhatsApp: $telefono para el post $post_title con coordenadas: {$lat}, {$lon}.");
}

if (!function_exists('send_whatsapp_notification')) {
    function send_whatsapp_notification($telefono, $message_content) {
        $sid = 'AC2a2143a073ccdec1fa1a160e31496668'; // Tu Account SID
        $token = '4e6405da93162bd463512d2006ee7007'; // Tu Auth Token
        $twilio_number = 'whatsapp:+14155238886'; // Número de WhatsApp de Twilio

        try {
            $client = new Client($sid, $token);

            $client->messages->create(
                "whatsapp:$telefono",
                array(
                    'from' => $twilio_number,
                    'body' => strip_tags($message_content) // Eliminar etiquetas HTML para WhatsApp
                )
            );
        } catch (Exception $e) {
            error_log('Error al enviar el mensaje de WhatsApp: ' . $e->getMessage());
        }
    }
}

// Manejador de AJAX para enviar la notificación
add_action('wp_ajax_send_location', 'handle_send_location');
add_action('wp_ajax_nopriv_send_location', 'handle_send_location');

function handle_send_location() {
    $post_id = intval($_POST['post_id']);
    $lat = sanitize_text_field($_POST['lat']);
    $lon = sanitize_text_field($_POST['lon']);
    $html5 = filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN);
    $browser_data = json_decode(stripslashes($_POST['browser_data']), true);

    send_visit_notification($post_id, $lat, $lon, $html5, $browser_data);

    wp_die();
}

				
			

En este ajuste, he añadido una verificación para asegurarme de que la función send_whatsapp_notification no se declare dos veces. Prueba este código y dime si el error persiste o si hay algo más que necesites ajustar.

7de30

 

RESUMEN DE COMO ESTA Implementado el sistema de notificaciones wimbo actualmente al escanear una plaquita qr:

 

Plugin twilio-sdk

Ubicación: /home/dh_t49bb8/wimbo.com.ar/wp-content/plugins

ARCHIVO: twilio-integration.php

UBICACIÓN: /home/dh_t49bb8/wimbo.com.ar/wp-content/plugins/twilio-sdk/

CODIGO:

				
					<?php
/*
Plugin Name: Twilio Integration
Description: Plugin para integrar Twilio en WordPress.
Version: 1.0
Author: Tu Nombre
*/

// Incluir el SDK de Twilio
require_once plugin_dir_path(__FILE__) . 'src/Twilio/autoload.php';

use Twilio\Rest\Client;

function send_whatsapp_notification($telefono, $message_content) {
    $sid = 'AC2a2143a073ccdec1fa1a160e31496668'; // Tu Account SID
    $token = '4e6405da93162bd463512d2006ee7007'; // Tu Auth Token
    $twilio_number = 'whatsapp:+5492612420364'; // Número de WhatsApp de Twilio

    $client = new Client($sid, $token);

    $client->messages->create(
        "whatsapp:$telefono",
        array(
            'from' => $twilio_number,
            'body' => $message_content
        )
    );
}

// Agregar el shortcode para probar Twilio
add_shortcode('test_twilio', function() {
    send_whatsapp_notification('5492617177320', '¡Hola! Este es un mensaje de prueba desde Twilio.');
    return 'Mensaje enviado.';
});

				
			

ARCHIVO: geolocation.js

UBICACIÓN: /home/dh_t49bb8/wimbo.com.ar/wp-content/themes/hello-elementor/js

CODIGO:

				
					document.addEventListener('DOMContentLoaded', function() {
    getLocation();
    captureBrowserData();
});

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition, showError, { enableHighAccuracy: true, maximumAge: 0 });
    } else {
        console.log("Geolocalización no está soportada por este navegador.");
        sendVisitNotification(null, null, false); // Fallback to IP-based location
    }
}

function showPosition(position) {
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
    console.log("Latitud: " + lat + " Longitud: " + lon);
    sendVisitNotification(lat, lon, true);
}

function showError(error) {
    switch(error.code) {
        case error.PERMISSION_DENIED:
            console.log("El usuario denegó la solicitud de Geolocalización.");
            break;
        case error.POSITION_UNAVAILABLE:
            console.log("La información de ubicación no está disponible.");
            break;
        case error.TIMEOUT:
            console.log("La solicitud para obtener la ubicación del usuario ha caducado.");
            break;
        case error.UNKNOWN_ERROR:
            console.log("Ha ocurrido un error desconocido.");
            break;
    }
    sendVisitNotification(null, null, false); // Fallback to IP-based location
}

function sendVisitNotification(lat, lon, html5) {
    var postId = wp_ajax_data.post_id;
    var browserData = captureBrowserData();

    if (!postId) {
        console.log('No se pudo obtener el ID del post.');
        return;
    }

    var xhr = new XMLHttpRequest();
    xhr.open('POST', wp_ajax_data.ajax_url, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.onload = function() {
        if (xhr.status === 200) {
            console.log('Notificación enviada.');
        } else {
            console.log('Error al enviar la notificación.');
        }
    };
    xhr.send('action=send_location&post_id=' + postId + '&lat=' + lat + '&lon=' + lon + '&html5=' + html5 + '&browser_data=' + JSON.stringify(browserData));
}

function captureBrowserData() {
    var userAgent = navigator.userAgent;
    var platform = navigator.platform;
    var language = navigator.language;
    var screenResolution = window.screen.width + 'x' + window.screen.height;

    var deviceType = 'PC';
    if (/Mobi|Android/i.test(userAgent)) {
        deviceType = 'Mobile';
    } else if (/Tablet|iPad/i.test(userAgent)) {
        deviceType = 'Tablet';
    }

    var browserName = 'Unknown';
    if (userAgent.indexOf("Chrome") > -1) {
        browserName = "Chrome";
    } else if (userAgent.indexOf("Safari") > -1) {
        browserName = "Safari";
    } else if (userAgent.indexOf("Firefox") > -1) {
        browserName = "Firefox";
    } else if (userAgent.indexOf("MSIE") > -1 || !!document.documentMode) {
        browserName = "IE";
    } else if (userAgent.indexOf("Edge") > -1) {
        browserName = "Edge";
    }

    return {
        userAgent: userAgent,
        platform: platform,
        language: language,
        screenResolution: screenResolution,
        deviceType: deviceType,
        browserName: browserName
    };
}

				
			

ARCHIVO: Notificaciones

Ubicación: Agregado al funtion.php a través del pluging Code snippets

Codigo:

				
					// Encolar el script de geolocalización y pasar la URL de AJAX
function enqueue_geolocation_script() {
    if (is_singular('perfil-de-mascota')) {
        wp_enqueue_script('geolocation-script', get_template_directory_uri() . '/js/geolocation.js', [], null, true);

        // Pasar la URL de admin-ajax.php al script de JavaScript
        wp_localize_script('geolocation-script', 'wp_ajax_data', [
            'ajax_url' => admin_url('admin-ajax.php'),
            'post_id' => get_the_ID(),
        ]);
    }
}
add_action('wp_enqueue_scripts', 'enqueue_geolocation_script');

// Manejar la solicitud AJAX que recibe las coordenadas
function handle_geolocation_ajax() {
    $lat = isset($_POST['lat']) ? sanitize_text_field($_POST['lat']) : null;
    $lon = isset($_POST['lon']) ? sanitize_text_field($_POST['lon']) : null;
    $post_id = isset($_POST['post_id']) ? sanitize_text_field($_POST['post_id']) : null;
    $html5 = isset($_POST['html5']) ? filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN) : false;
    $browser_data = isset($_POST['browser_data']) ? json_decode(stripslashes($_POST['browser_data']), true) : null;

    if ($lat && $lon && $html5) {
        // Registrar en debug.log
        error_log("Coordenadas HTML5 recibidas: Latitud: $lat, Longitud: $lon para el post ID: $post_id");

        // Enviar notificación con coordenadas HTML5
        send_visit_notification($post_id, $lat, $lon, $html5, $browser_data);
        wp_send_json_success('Coordenadas HTML5 recibidas.');
    } else {
        error_log("Error: No se recibieron coordenadas HTML5.");
        // Obtener coordenadas basadas en IP usando MaxMind
        $visitor_ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
        $coordinates = get_coordinates_from_ip($visitor_ip);
        if ($coordinates) {
            send_visit_notification($post_id, $coordinates['lat'], $coordinates['lon'], false, $browser_data);
        } else {
            send_visit_notification($post_id, 'No disponible', 'No disponible', false, $browser_data);
        }
        wp_send_json_error('No se recibieron coordenadas HTML5.');
    }

    wp_die();
}
add_action('wp_ajax_send_location', 'handle_geolocation_ajax');
add_action('wp_ajax_nopriv_send_location', 'handle_geolocation_ajax');

// Obtener coordenadas basadas en IP usando MaxMind
function get_coordinates_from_ip($ip) {
    $account_id = '1063783';
    $license_key = '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';
    $url = "https://geoip.maxmind.com/geoip/v2.1/city/$ip";

    $response = wp_remote_get($url, [
        'headers' => [
            'Authorization' => 'Basic ' . base64_encode("$account_id:$license_key")
        ]
    ]);

    if (is_wp_error($response)) {
        error_log("Error en la solicitud a la API de MaxMind: " . $response->get_error_message());
        return false;
    }

    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if (isset($data['location']['latitude']) && isset($data['location']['longitude'])) {
        error_log("Coordenadas MaxMind obtenidas: Latitud: {$data['location']['latitude']}, Longitud: {$data['location']['longitude']}");

        return [
            'lat' => $data['location']['latitude'],
            'lon' => $data['location']['longitude']
        ];
    } else {
        error_log("Error: Respuesta inesperada de la API de MaxMind.");
        return false;
    }
}

// Incluir el SDK de Twilio
if (!class_exists('Twilio\Rest\Client')) {
    require_once plugin_dir_path(__FILE__) . 'twilio-sdk/src/Twilio/autoload.php';
}

use Twilio\Rest\Client;

function send_visit_notification($post_id, $lat, $lon, $html5, $browser_data) {
    // Obtener el número de teléfono del metacampo
    $telefono = get_post_meta($post_id, 'telefono_1', true);

    // Obtener el autor del post
    $post = get_post($post_id);
    if (!$post) {
        error_log("Error: No se pudo obtener el post con ID: $post_id");
        return;
    }
    
    $author_id = $post->post_author;
    $author_email = get_the_author_meta('user_email', $author_id);
    $post_title = get_the_title($post_id);

    // Crear el enlace de Google Maps
    $google_maps_link = "https://www.google.com/maps/search/?api=1&query={$lat},{$lon}";

    // Obtener datos del navegador y dispositivo
    $device_type = $browser_data['deviceType'] ?? 'Desconocido';
    $browser_name = $browser_data['browserName'] ?? 'Desconocido';

    // Crear el contenido del mensaje
    $message_content = "Han escaneado la placa de tu mascota \"$post_title\" desde la IP: {$_SERVER['REMOTE_ADDR']}, desde un dispositivo tipo: $device_type y desde el navegador: $browser_name.\n\n";
    if ($html5) {
        $message_content .= "El Usuario ha permitido el acceso a su ubicación por lo que la precisión de la ubicación varía solo entre 5 a 10 metros.\n\n";
    } else {
        $message_content .= "El usuario ha bloqueado el acceso a su ubicación, por lo cual las coordenadas obtenidas podrían ser inexactas y se basan en el registro de ubicación de la IP de la compañía prestadora de servicio.\n\n";
    }
    $message_content .= "Accede a este link para obtener una ubicación aproximada del lugar del escaneo: $google_maps_link\n";
    
    // Enviar notificación por correo electrónico
    wp_mail($author_email, 'Notificación de visita', $message_content);

    // Enviar notificación por WhatsApp
    if ($telefono) {
        send_whatsapp_notification($telefono, $message_content);
    }

    // Log para confirmar que el email fue enviado
    error_log("Notificación enviada al email: $author_email y al número de WhatsApp: $telefono para el post $post_title con coordenadas: {$lat}, {$lon}.");
}

if (!function_exists('send_whatsapp_notification')) {
    function send_whatsapp_notification($telefono, $message_content) {
        $sid = 'AC2a2143a073ccdec1fa1a160e31496668'; // Tu Account SID
        $token = '4e6405da93162bd463512d2006ee7007'; // Tu Auth Token
        $twilio_number = 'whatsapp:+5492612420364'; // Número de WhatsApp de Twilio

        try {
            $client = new Client($sid, $token);

            $client->messages->create(
                "whatsapp:$telefono",
                array(
                    'from' => $twilio_number,
                    'body' => strip_tags($message_content) // Eliminar etiquetas HTML para WhatsApp
                )
            );
        } catch (Exception $e) {
            error_log('Error al enviar el mensaje de WhatsApp: ' . $e->getMessage());
        }
    }
}

// Manejador de AJAX para enviar la notificación
add_action('wp_ajax_send_location', 'handle_send_location');
add_action('wp_ajax_nopriv_send_location', 'handle_send_location');

function handle_send_location() {
    $post_id = intval($_POST['post_id']);
    $lat = sanitize_text_field($_POST['lat']);
    $lon = sanitize_text_field($_POST['lon']);
    $html5 = filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN);
    $browser_data = json_decode(stripslashes($_POST['browser_data']), true);

    send_visit_notification($post_id, $lat, $lon, $html5, $browser_data);

    wp_die();
}

				
			

Datos adicionales:

Nro de teléfono de twilio creado en sandbox Use WhatsApp and send a message from your device to

+1 415 523 8886

with code join women-including

 

Nro de telefono de twilio creado en whatsapp senders +5492612420364

 

Account SID AC2a2143a073ccdec1fa1a160e31496668

Auth Token: 4e6405da93162bd463512d2006ee7007

Código Final implementado para Notificaciones Email & Whatsapp

Funcionando perfectamente con la plantilla de whatsapp de Twilio

				
					// Encolar el script de geolocalización y pasar la URL de AJAX
function enqueue_geolocation_script() {
    if (is_singular('perfil-de-mascota')) {
        wp_enqueue_script('geolocation-script', get_template_directory_uri() . '/js/geolocation.js', [], null, true);

        // Pasar la URL de admin-ajax.php al script de JavaScript
        wp_localize_script('geolocation-script', 'wp_ajax_data', [
            'ajax_url' => admin_url('admin-ajax.php'),
            'post_id' => get_the_ID(),
        ]);
    }
}
add_action('wp_enqueue_scripts', 'enqueue_geolocation_script');

// Manejar la solicitud AJAX que recibe las coordenadas
function handle_geolocation_ajax() {
    $lat = isset($_POST['lat']) ? sanitize_text_field($_POST['lat']) : null;
    $lon = isset($_POST['lon']) ? sanitize_text_field($_POST['lon']) : null;
    $post_id = isset($_POST['post_id']) ? sanitize_text_field($_POST['post_id']) : null;
    $html5 = isset($_POST['html5']) ? filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN) : false;
    $browser_data = isset($_POST['browser_data']) ? json_decode(stripslashes($_POST['browser_data']), true) : null;

    if ($lat && $lon && $html5) {
        // Registrar en debug.log
        error_log("Coordenadas HTML5 recibidas: Latitud: $lat, Longitud: $lon para el post ID: $post_id");

        // Enviar notificación con coordenadas HTML5
        send_visit_notification($post_id, $lat, $lon, $html5, $browser_data);
        wp_send_json_success('Coordenadas HTML5 recibidas.');
    } else {
        error_log("Error: No se recibieron coordenadas HTML5.");
        // Obtener coordenadas basadas en IP usando MaxMind
        $visitor_ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
        $coordinates = get_coordinates_from_ip($visitor_ip);
        if ($coordinates) {
            send_visit_notification($post_id, $coordinates['lat'], $coordinates['lon'], false, $browser_data);
        } else {
            send_visit_notification($post_id, 'No disponible', 'No disponible', false, $browser_data);
        }
        wp_send_json_error('No se recibieron coordenadas HTML5.');
    }

    wp_die();
}
add_action('wp_ajax_send_location', 'handle_geolocation_ajax');
add_action('wp_ajax_nopriv_send_location', 'handle_geolocation_ajax');

// Obtener coordenadas basadas en IP usando MaxMind
function get_coordinates_from_ip($ip) {
    $account_id = '1063783';
    $license_key = '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';
    $url = "https://geoip.maxmind.com/geoip/v2.1/city/$ip";

    $response = wp_remote_get($url, [
        'headers' => [
            'Authorization' => 'Basic ' . base64_encode("$account_id:$license_key")
        ]
    ]);

    if (is_wp_error($response)) {
        error_log("Error en la solicitud a la API de MaxMind: " . $response->get_error_message());
        return false;
    }

    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if (isset($data['location']['latitude']) && isset($data['location']['longitude'])) {
        error_log("Coordenadas MaxMind obtenidas: Latitud: {$data['location']['latitude']}, Longitud: {$data['location']['longitude']}");

        return [
            'lat' => $data['location']['latitude'],
            'lon' => $data['location']['longitude']
        ];
    } else {
        error_log("Error: Respuesta inesperada de la API de MaxMind.");
        return false;
    }
}

// Incluir el SDK de Twilio
if (!class_exists('Twilio\Rest\Client')) {
    require_once plugin_dir_path(__FILE__) . 'twilio-sdk/src/Twilio/autoload.php';
}

use Twilio\Rest\Client;

function send_visit_notification($post_id, $lat, $lon, $html5, $browser_data) {
    // Obtener el número de teléfono del metacampo
    $telefono = get_post_meta($post_id, 'telefono_1', true);

    // Obtener el autor del post
    $post = get_post($post_id);
    if (!$post) {
        error_log("Error: No se pudo obtener el post con ID: $post_id");
        return;
    }

    $author_id = $post->post_author;
    $author_email = get_the_author_meta('user_email', $author_id);
    $post_title = get_the_title($post_id);

    // Crear el enlace de Google Maps
    $google_maps_link = "https://www.google.com/maps/search/?api=1&query={$lat},{$lon}";

    // Obtener datos del navegador y dispositivo
    $device_type = $browser_data['deviceType'] ?? 'Desconocido';
    $browser_name = $browser_data['browserName'] ?? 'Desconocido';

    // Crear el contenido del mensaje para WhatsApp
    if ($html5) {
        $ubicacion_tipo = "El Usuario ha permitido el acceso a su ubicación por lo que la precisión de la ubicación varía solo entre 5 a 10 metros.";
    } else {
        $ubicacion_tipo = "El usuario ha bloqueado el acceso a su ubicación, por lo cual las coordenadas obtenidas podrían ser inexactas y se basan en el registro de ubicación de la IP de la compañía prestadora de servicio.";
    }

    // Enviar notificación por correo electrónico
    $message_content = "Han escaneado la placa de tu mascota \"$post_title\" desde la IP: {$_SERVER['REMOTE_ADDR']}, desde un dispositivo tipo: $device_type y desde el navegador: $browser_name.\n\n";
    $message_content .= "$ubicacion_tipo\n\n";
    $message_content .= "Accede a este link para obtener una ubicación aproximada del lugar del escaneo: $google_maps_link\n";
    wp_mail($author_email, 'Notificación de visita', $message_content);

    // Enviar notificación por WhatsApp utilizando la plantilla
    if ($telefono) {
        send_whatsapp_notification_new($telefono, $post_title, $google_maps_link, $lat, $lon, $device_type, $browser_name, $html5);
    }

    // Log para confirmar que el email fue enviado
    error_log("Notificación enviada al email: $author_email y al número de WhatsApp: $telefono para el post $post_title con coordenadas: {$lat}, {$lon}.");
}


function send_whatsapp_notification_new($telefono, $post_title, $google_maps_link, $lat, $lon, $device_type, $browser_name, $html5) {
    $sid = 'AC2a2143a073ccdec1fa1a160e31496668'; // Tu Account SID
    $token = '4e6405da93162bd463512d2006ee7007'; // Tu Auth Token
    $twilio_number = 'whatsapp:+5492612420364'; // Número de WhatsApp de Twilio

    try {
        $client = new Client($sid, $token);

        // Verificar los valores dinámicos antes de enviar el mensaje
        error_log("Enviando a WhatsApp - Valores dinámicos: ");
        error_log("Teléfono: $telefono");
        error_log("Nombre de la mascota: $post_title");
        error_log("Latitud: $lat, Longitud: $lon");
        error_log("Dispositivo: $device_type, Navegador: $browser_name");
        error_log("Ubicación: " . ($html5 ? "El Usuario ha permitido el acceso a su ubicación." : "El usuario ha bloqueado el acceso a su ubicación."));
        error_log("Enlace de Google Maps: $google_maps_link");

        // Usar la plantilla de WhatsApp con las variables dinámicas
        $client->messages->create(
            "whatsapp:$telefono",
            array(
                'from' => $twilio_number,
                'contentSid' => 'HX8c09c208dc0c93b7f7dbafc429be2ade', // Tu Content SID
                'contentVariables' => json_encode(array(
                    "1" => $post_title,  // {{1}} - Nombre de la mascota
                    "2" => $_SERVER['REMOTE_ADDR'],  // {{2}} - Dirección IP
                    "3" => $device_type,  // {{3}} - Tipo de dispositivo
                    "4" => $browser_name,  // {{4}} - Navegador
                    "5" => $html5 ? "El Usuario ha permitido el acceso a su ubicación por lo que la precisión de la ubicación varía entre 5 a 10 metros." : "El usuario ha bloqueado el acceso a su ubicación.",  // {{5}} - Condición de ubicación
                    "6" => $google_maps_link  // {{6}} - Enlace a Google Maps
                ))
            )
        );

        error_log("Notificación de WhatsApp enviada exitosamente.");

    } catch (Exception $e) {
        error_log('Error al enviar el mensaje de WhatsApp: ' . $e->getMessage());
    }
}



// Manejador de AJAX para enviar la notificación
add_action('wp_ajax_send_location', 'handle_send_location');
add_action('wp_ajax_nopriv_send_location', 'handle_send_location');

function handle_send_location() {
    $post_id = intval($_POST['post_id']);
    $lat = sanitize_text_field($_POST['lat']);
    $lon = sanitize_text_field($_POST['lon']);
    $html5 = filter_var($_POST['html5'], FILTER_VALIDATE_BOOLEAN);
    $browser_data = json_decode(stripslashes($_POST['browser_data']), true);

    send_visit_notification($post_id, $lat, $lon, $html5, $browser_data);

    wp_die();
}
				
			

Filtrar por:

Tipo de plaquita:

Filtro de Categoría (check)

Tamaño:

Filtro de Tamaños (check)

Color:

Filtro de colores (Visual)