Las aplicaciones web modernas exigen un alto nivel de funcionalidad inteligente y con reconocimiento de ubicación. Las plataformas de comercio electrónico necesitan calcular las tarifas de envío internacionales y los sitios de contenido tienen que ofrecer noticias específicas de cada región. La geolocalización puede transformar los sitios estáticos de WordPress en experiencias dinámicas y personalizadas. Sin embargo, puede ser difícil implementar esta funcionalidad, especialmente si no tienes el proveedor de alojamiento adecuado.

Esta guía completa explora cómo implementar potentes funcionalidades de geolocalización en WordPress. Además, se centra especialmente en las funcionalidades integradas de Kinsta que eliminan algunos de los dolores de cabeza más comunes a la hora de añadir geolocalización a tu sitio.

Comprender el geotargeting y la geolocalización

Las aplicaciones que tienen en cuenta la ubicación se centran en dos términos clave: geotargeting y geolocalización. Están relacionados, pero cada uno tiene una función distinta en tu kit de herramientas de WordPress:

  • La geolocalización señala la ubicación de tus visitantes.
  • El geotargeting ofrece contenidos o experiencias específicas basadas en esos datos.

Netflix lo demuestra de manera eficaz: cuando viajas al extranjero, el servicio de streaming determina tu país actual a través de la geolocalización y, a continuación, ajusta tu biblioteca de contenidos mediante la segmentación geográfica para que coincida con los acuerdos de licencia regionales. Esta combinación crea una experiencia perfecta al tiempo que mantiene el cumplimiento de los derechos internacionales de los medios de comunicación.

La página de inicio de Netflix muestra varias filas de contenido, incluidas las secciones Tu próxima película y Nuevo en Netflix sobre un fondo oscuro. El banner superior dice Solo en Netflix con texto que explica su programación original exclusiva. Se muestran varias miniaturas de programas y películas en formato de desplazamiento horizontal.
El sitio web de Netflix.

Existen dos métodos principales para detectar la ubicación del visitante:

  • La detección de la ubicación basada en la IP se basa en bases de datos que asignan direcciones IP a regiones geográficas. Funciona universalmente sin requerir el permiso del usuario. La mayoría de las soluciones de geolocalización del lado del servidor lo utilizan, incluidas las capacidades integradas de Kinsta.
  • La detección basada en GPS accede al hardware de localización de un dispositivo a través de las APIs del navegador. Proporciona coordenadas precisas, pero requiere el consentimiento explícito del usuario. Esta funcionalidad está detrás de las búsquedas de localización «Cerca de mí» o de las aplicaciones meteorológicas que necesitan un posicionamiento exacto.

La geolocalización y el geotargeting funcionan juntos, pero dentro de la primera, hay múltiples tecnologías que pueden funcionar para un caso de uso determinado. Ninguna es «mejor» que la otra — hay beneficios que trascienden las adaptaciones individuales.

El caso de uso de la geolocalización para tu negocio

Implementar la geolocalización en cualquier sitio web puede aportar beneficios tangibles tanto a tu empresa como a tus usuarios. En primer lugar, la personalización impulsa el compromiso. Si tu sitio puede personalizar la experiencia de cada usuario, es posible que más de ellos hagan negocios contigo.

Amazon es un ejemplo de cómo puedes cosechar los frutos. Su sitio de compras puede mostrar los plazos de envío de cada producto en función de tu ubicación:

Página de un producto de Amazon que muestra un reloj de pulsera de fácil lectura para hombre de Amazon Essentials. La página muestra las opciones de entrega a Albany 12208.
Una página de producto de Amazon que muestra los plazos de envío de un reloj.

Dependiendo de tu ubicación, también puedes ver horarios de eventos relevantes de Amazon Prime, como partidos deportivos:

Interfaz de compras navideñas de Amazon con un fondo rojo brillante y una funcionalidad de promoción de más de 100 regalos de última hora. Entre el diseño de múltiples categorías de compras hay un panel central que promociona un partido de la NFL entre los Broncos y los Chargers con los logotipos de los equipos.
La página de inicio de Amazon muestra la hora local de un partido Broncos-Chargers.

Esto se puede ver en todo Internet, por ejemplo, en los sitios meteorológicos que muestran automáticamente tu previsión local. Independientemente de la implementación, la personalización reduce la fricción en la experiencia del usuario y puede mejorar significativamente las tasas de conversión.

El cumplimiento de la normativa también depende del conocimiento de la ubicación. El GDPR en Europa, la CCPA en California y muchas otras regiones imponen requisitos específicos para el tratamiento de los datos de los usuarios. Una correcta implementación de la geolocalización te ayuda a cumplir dichos requisitos para cada visitante.

Por último, el contenido localizado genera confianza. Las investigaciones demuestran que los usuarios completan las compras con más frecuencia cuando los precios aparecen en su moneda local y la información de envío es clara. Por ejemplo, un estudio de Common Sense Advisory muestra que tres cuartas partes de los consumidores prefieren comprar productos en su propio idioma.

Cómo integrar la geolocalización con WordPress

La arquitectura flexible de WordPress significa que existen múltiples enfoques si deseas añadir la localización a tu sitio. Tu elección de alojamiento de sitios web, uso de plugins, conocimientos de programación y más serán factores a tener en cuenta en tu enfoque preferido. Sin embargo, trabajar con los datos en sí puede hacerse de varias maneras.

Trabajar con datos geográficos en WordPress

Aunque el core de WordPress incluye muchas funcionalidades fundamentales, no incluye la geolocalización integrada. No hay nada en el core de WordPress que registre datos de ubicación, aunque sí soporta el almacenamiento y procesamiento de datos de ubicación de varias maneras.

La base de datos de WordPress

Por ejemplo, la base de datos de WordPress puede almacenar coordenadas y datos de ubicación utilizando campos personalizados o tablas de ubicación dedicadas.

También puede manejar taxonomías basadas en la ubicación. Esto funciona bien para los localizadores de tiendas o los servicios de listados inmobiliarios que utilizan una base de datos de ubicación personalizada. Sin embargo, WordPress no almacena ningún dato de geolocalización por defecto, simplemente existe la posibilidad de hacerlo.

La API REST de WordPress

La API REST de WordPress también permite trabajar con datos de geolocalización, aunque no incluye endpoints específicos. Tendrías que crear tus propias extensiones de endpoints para crear aplicaciones que tengan en cuenta la ubicación y se comuniquen con servicios externos o aplicaciones móviles. Aquí tienes un ejemplo:

add_action('rest_api_init', function() {
    // Create a custom namespace for your geolocation endpoints
register_rest_route('your-site-geo/v1', '/location', [
        'methods' => 'GET',
        'callback' => 'handle_location_request',
        'permission_callback' => function() {
            return true;
        }
    ]);
});

function handle_location_request($request) {
    // Access geolocation data (example using Kinsta's implementation)
    $location = [
        'country' => $_SERVER['GEOIP_COUNTRY_CODE'] ?? null,
        'city' => $_SERVER['GEOIP_CITY'] ?? null,
        'latitude' => $_SERVER['GEOIP_LATITUDE'] ?? null,
        'longitude' => $_SERVER['GEOIP_LONGITUDE'] ?? null
    ];
    
    return new WP_REST_Response($location, 200);
}

Esto crea un nuevo endpoint en /wp-json/your-site-geo/v1/location que devuelve datos de localización para cualquier consumidor de la API.

El código utiliza your-site-geo como espacio de nombres personalizado. Tu espacio de nombres debe ser específico a tus necesidades para evitar conflictos con otros plugins o código personalizado. Es aconsejable seguir las directrices de espacios de nombres de WordPress:

  • Utiliza un prefijo específico del proveedor o del paquete para evitar conflictos.
  • Incluye un número de versión (como v1).
  • Mantén los endpoints específicos y centrados.

También puedes registrar datos de localización para endpoints existentes:

add_action('rest_api_init', function() {
    register_rest_field('post', 'location_data', [
        'get_callback' => function($post) {
            return get_post_meta($post['id'], 'location_data', true);
        },
        'update_callback' => function($value, $post) {
            update_post_meta($post->ID, 'location_data', $value);
        },
        'schema' => [
            'type' => 'object',
            'properties' => [
                'latitude' => ['type' => 'number'],
                'longitude' => ['type' => 'number'],
                'country' => ['type' => 'string'],
                'city' => ['type' => 'string']
            ]
        ]
    ]);
});

En muchos casos, la API REST será el primer recurso al que recurras para incorporar la funcionalidad de geolocalización, lo que significa que contar con esta flexibilidad será una gran ventaja.

Tipos de entrada personalizadas

Puede que también utilices tipos de entrada personalizadas en WordPress. Si es así, los nuevos tipos de contenido que crees pueden incluir metadatos de ubicación. Esto te permite organizar el contenido utilizando información geográfica, sin necesidad de realizar modificaciones complejas en la base de datos.

El primer paso es registrar el tipo de entrada en WordPress:

register_post_type('store_location', [
    'public' => true,
    'label' => 'Store Locations',
    'supports' => [
        'title',
        'editor',
        'Custom-fields'  // Enables custom fields and meta
    ]
]);

También debes crear un meta box personalizado para almacenar las coordenadas que recopiles y generar el HTML para ello:

<?php
add_action('add_meta_boxes', function() {
    add_meta_box(
        'store_location_coordinates',
        'Store Coordinates',
        'render_location_meta_box',
        'Store_location'  // The post type where this meta box should appear
    );
});

function render_location_meta_box($post) {
    // Get existing coordinates if they exist
    $latitude = get_post_meta($post->ID, 'latitude', true);
    $longitude = get_post_meta($post->ID, 'longitude', true);    

    // Output the form fields
    ?>
    <label>Latitude:
        <input type="number" 
               step="any" 
               name="latitude" 
               value="<?php echo esc_attr($latitude); ?>">
    </label>
    <label>Longitude:
        <input type="number" 
               step="any" 
               name="longitude" 
               value="<?php echo esc_attr($longitude); ?>">
    </label>
    <?php
}

Lo más importante es guardar los datos de ubicación una vez que publiques o guardes la entrada en WordPress:

add_action('save_post_store_location', function($post_id) {
    // Verify if this is an autosave
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }    

    // Save latitude if it exists
    if (isset($_POST['latitude'])) {
        update_post_meta(
            $post_id,
            'latitude',
            sanitize_text_field($_POST['latitude'])
        );
    }    

    // Save longitude if it exists
    if (isset($_POST['longitude'])) {
        update_post_meta(
            $post_id,
            'longitude',
            sanitize_text_field($_POST['longitude'])
        );
    }
});

Construir una función para obtener cualquier ubicación cercana podría adoptar varias formas. Aquí tienes un ejemplo aproximado de una que (en teoría) obtiene la latitud y la longitud de una ubicación:

function get_nearby_locations($lat, $lng, $radius = 10) {
    $locations = get_posts([
        'post_type' => 'store_location',
        'posts_per_page' => -1
    ]);

    $nearby = array_filter($locations, function($location) use ($lat, $lng, $radius) {
        $store_lat = get_post_meta($location->ID, 'latitude', true);
        $store_lng = get_post_meta($location->ID, 'longitude', true);

        return calculate_distance($lat, $lng, $store_lat, $store_lng) <= $radius;
    });

    return $nearby;
}

El uso de cualquiera de estas opciones depende de tus necesidades específicas. Por ejemplo, utiliza campos personalizados para metadatos de ubicación simples o amplía la API REST para implementaciones headless. Para contenido centrado en la ubicación, los tipos de entradas personalizadas podrían ser lo mejor.

El enfoque de los plugins para la geolocalización

WordPress soporta plugins para casi todo, y también hay numerosas soluciones para añadir la localización a tu sitio. Por ejemplo, If-So Geolocation o Geolocation IP Detection tienen excelentes reviews y valoraciones, actualizaciones regulares y sistemas de soporte eficientes:

La imagen de cabecera del plugin Geolocation IP Detection de WordPress.org. Muestra un banner amarillo con un icono de pin/marcador de ubicación negro. Debajo hay texto en negro y la URL de un sitio web (www.yellowtree.de).
El logotipo de Geolocation IP Detection del directorio de plugins de WordPress.

Estos proporcionan muchas de las funcionalidades típicas en un paquete sencillo, que además utiliza un formato familiar. Los plugins pueden proporcionar una serie de beneficios cuando necesitas implementar la geolocalización:

  • Consigues un despliegue rápido y proporcionan una implementación rápida sin necesidad de código personalizado.
  • No hay mantenimiento por tu parte, ya que es algo de lo que se encarga el desarrollador del plugin (junto con las actualizaciones).
  • A menudo hay apoyo de la comunidad y documentación para ayudarte si lo necesitas.

Para el tipo de desarrollo que quieres llevar a cabo, un plugin podría no ser la mejor opción. Para empezar, dependes de la calidad de ese plugin para tu funcionalidad. Si ofreces productos personalizados de WordPress, puede que esta no sea una asociación apropiada. Cada plugin vendrá con su propia implementación de base de datos de ubicación, y la calidad aquí podría variar tanto como otras funcionalidades.

Los plugins son excelentes para los usuarios finales o los propietarios de sitios que necesitan añadir conocimiento de la ubicación a un sitio existente. Sin embargo, la posibilidad de conflictos con otros plugins, la carga adicional del servidor y la flexibilidad limitada para implementaciones personalizadas hacen que tal vez quieras una opción más robusta.

Aplicaciones reales de la geolocalización en WordPress

No tienes que buscar mucho para encontrar ejemplos de productos WordPress que utilizan la geolocalización en su código base. Por ejemplo, WooCommerce incluye geolocalización integrada para el cálculo de impuestos y reglas de envío.

La página de configuración de WooCommerce muestra las opciones de configuración de ubicación e impuestos. Hay un menú desplegable ampliado para la ubicación predeterminada del cliente, que muestra cuatro opciones: Sin ubicación por defecto, País/región de la tienda, Geolocalizar y Geolocalizar (con soporte de caché de página). La página también incluye configuraciones para las ubicaciones de venta, las ubicaciones de envío, la habilitación de impuestos y la gestión de cupones.
La opción de geolocalización dentro de WooCommerce.

Utiliza la base de datos GeoIP2 de MaxMind para detectar automáticamente las ubicaciones de los clientes, lo que ayuda a garantizar precios y opciones de entrega precisos desde la primera carga de la página.

Otros plugins también ofrecen compatibilidad con la geolocalización. Un plugin de formularios como el add-on Gravity Geolocation de Gravity Forms es un caso de uso típico. Permite a los usuarios introducir su ubicación en un formulario, al que Gravity Forms asignará un conjunto de coordenadas y otros datos relevantes.

Esto resulta especialmente valioso para los formularios de generación de clientes potenciales y de solicitud de servicios. Y lo que es más importante, tienes la flexibilidad de adaptar la necesidad de conocer la ubicación a tu caso de uso específico.

La ventaja de Kinsta: capacidades de geolocalización nativas

Si eres cliente de Kinsta, no necesitas soluciones extravagantes y poco elegantes para implementar la geolocalización. El panel de control MyKinsta soporta una sólida detección de la ubicación sin la sobrecarga de plugins adicionales de WordPress.

Comprender el sistema de geolocalización de Kinsta

La implementación de la geolocalización de Kinsta aprovecha dos potentes tecnologías:

  • El módulo de geolocalización nativo de NGINX proporciona una detección eficiente de la ubicación a nivel de servidor.
  • La base de datos GeoIP2 de MaxMind garantiza un mapeo de ubicaciones preciso y actualizado.

Esta integración en el panel de MyKinsta ofrece varias ventajas sobre una solución basada en plugins o código:

  • Como la detección de la ubicación se realiza a nivel de servidor, el impacto en el rendimiento es mínimo en comparación con otros enfoques.
  • Kinsta realiza un mantenimiento regular de la funcionalidad, lo que significa que obtienes una geolocalización actual y actualizada.
  • Dispones de un conocimiento y detección fiables de la ubicación de tu sitio sin necesidad de JavaScript ni permisos del navegador.
  • También hay una integración adicional con el sistema Edge Caching de Kinsta.

La herramienta de geolocalización IP de Kinsta se integra con WordPress y puede ofrecerte una funcionalidad de primera que funciona bien y es adaptable. Esto es posible gracias a la forma en que Kinsta expone la información de ubicación y la transmite al resto de tu stack.

Datos de ubicación disponibles

WordPress utiliza PHP, y la herramienta de Geolocalización IP pasa cierta información centrada en la ubicación a la variable PHP $_SERVER.

Tienes a tu disposición una serie de endpoints y variables que devuelven diferentes conjuntos de datos:

// Basic geographical data

$country_code = $_SERVER['GEOIP_COUNTRY_CODE']; // Two-letter country code (such as "US" or "GB")
$country_name = $_SERVER['GEOIP_COUNTRY_NAME']; // Full country name
$region = $_SERVER['GEOIP_REGION'];             // State/province code
$city = $_SERVER['GEOIP_CITY'];                 // City name
$postal_code = $_SERVER['GEOIP_POSTAL_CODE'];   // Local postal or ZIP code

// Precise location data
$latitude = $_SERVER['GEOIP_LATITUDE'];         // Decimal latitude
$longitude = $_SERVER['GEOIP_LONGITUDE'];       // Decimal longitude

Hay más variables que se pueden utilizar, como los distintos formatos de códigos de países y ciudades. En cualquier caso, todas las variables expuestas te ofrecen una forma de codificar PHP personalizado basado en la funcionalidad de la geolocalización de IP de Kinsta.

Implementar la geolocalización a través de MyKinsta

Como ocurre con gran parte de la funcionalidad de MyKinsta, configurar la geolocalización a través del panel de control es sencillo. El primer punto de contacto es la pantalla Herramientas para cualquiera de tus sitios:

El panel de control MyKinsta muestra seis tarjetas de funcionalidades en un diseño de cuadrícula. La fila superior muestra las opciones de supervisión de New Relic, protección con contraseña y Forzar HTTPS. La fila inferior muestra las funcionalidades de configuración de Geolocalización, ionCube Loader y PHP.
La pantalla de Herramientas de un sitio dentro del panel de MyKinsta.

Al hacer clic en el botón Activar de la tarjeta Geolocalización, aparecerá un cuadro de diálogo modal donde podrás elegir si establecer la geolocalización a nivel de país o de país y ciudad.

Una ventana de diálogo modal para la configuración de geolocalización dentro del panel de control MyKinsta. Los botones de radio permiten la geolocalización para la orientación a nivel de país o a nivel de país y ciudad.
Configurando la Geolocalización en MyKinsta.

En algunos casos, también verás una advertencia si utilizas Edge Caching. Esto se debe a que no admite variaciones de caché de geolocalización de «alcance estrecho» — por ejemplo, cerca de las fronteras. En su lugar, el caché se guarda en cada ubicación de Punto de Presencia (PoP) en función de dónde viva el primer visitante de la página.

Una vez que elijas una configuración de geolocalización y hagas clic en el botón Activar, MyKinsta configurará todo en segundo plano. Después de unos momentos, verás que el panel Herramientas se actualiza con nuevas opciones:

La pantalla de herramientas del panel de control de MyKinsta con un menú lateral que contiene opciones como Dominios, Copias de seguridad, Herramientas y Analíticas. El área de contenido principal muestra una tarjeta de funcionalidad de Geolocalización con un icono de globo terráqueo, que explica que permite reglas de redireccionamiento basadas en las ubicaciones IP de los visitantes. El estado indica que está
La tarjeta de Herramientas de Geolocalización IP dentro de MyKinsta.

Tienes la opción de desactivar la geolocalización en el menú «kebab». Si haces clic en Modificar, aparecerá de nuevo el cuadro de diálogo modal de elección de geolocalización para que lo modifiques. Por último, si quieres activar el geobloqueo — que restringe el acceso a tu sitio en función de la ubicación — el equipo de soporte de Kinsta puede hacerlo por ti, ya que no está disponible a través del panel de MyKinsta.

Construir aplicaciones que tengan en cuenta la ubicación: ejemplos prácticos

Tienes prácticamente todas las herramientas y funcionalidades a tu disposición a través de las implementaciones de geolocalización de NGINX y MyKinsta. Esto significa que tienes mucho margen para utilizar tanto fragmentos de código como las capacidades integradas de Kinsta para configurar una solución que se adapte a tus necesidades.

Para una solución sin código, la funcionalidad de redireccionamiento de Kinsta será ideal.

Redireccionamientos geográficos

Una de las características clave de la herramienta de geolocalización IP de Kinsta es la forma en que puedes aplicar condiciones basadas en la ubicación a través de un sofisticado enrutamiento del tráfico.

Si tuvieras que utilizar código para una configuración como ésta, necesitaría mucho trabajo:

class GeographicRedirects {
    public function __construct() {
        add_action('template_redirect', [$this, 'handle_redirects']);
    }

    public function handle_redirects() {
        $country_code = $_SERVER['GEOIP_COUNTRY_CODE'] ?? null;

        if ($country_code) {
            $redirect_url = $this->get_redirect_url($country_code);
            if ($redirect_url) {
                wp_redirect($redirect_url, 301);
                exit;
            }
        }
    }
    
    private function get_redirect_url($country_code) {
        $redirects = [
            'DE' => 'https://de.example.com',
            'FR' => 'https://fr.example.com',
            'ES' => 'https://es.example.com'
        ];

        return $redirects[$country_code] ?? null;
    }
}

new GeographicRedirects();

En su lugar, MyKinsta te permite utilizar el panel de Redireccionamiento, que incluye campos para elegir un país y una ciudad.

La ventana modal de configuración de la regla de redireccionamiento MyKinsta muestra campos para configurar redireccionamientos basados en la ubicación. El formulario incluye menús desplegables para la selección de dominios y la orientación por ubicación, con campos de entrada para especificar rutas de redireccionamiento.
Añadiendo una regla de redireccionamiento a través del panel de MyKinsta.

Esta es una forma eficaz de utilizar la geolocalización de Kinsta junto con las reglas de redireccionamiento. Simplemente rellenas las URL desde las que deseas redirigir y a las que deseas redirigir, eliges un dominio, seleccionas un país y una ciudad, y defines el código de estado. Una vez que hagas clic en el botón Añadir Regla de Redireccionamiento, Kinsta lo aplicará a tu configuración NGINX.

Integración del mapa interactivo

Un localizador de tiendas dinámico mostrará la ubicación del visitante y cualquiera de tus tiendas cercanas. Esto será ideal si tienes varias sucursales, especialmente si están ubicadas en un área extensa:

Un localizador de tiendas de IKEA Países Bajos muestra un mapa del oeste de los Países Bajos con varias ubicaciones de tiendas marcadas con chinchetas azules. En el lado izquierdo, una lista muestra las tiendas IKEA, incluidas Delft, Barendrecht, Haarlem y Breda, con sus direcciones y horarios de apertura. El mapa base es proporcionado por Google Maps e incluye funcionalidades geográficas como la costa del Mar del Norte y las principales autopistas.
El localizador de tiendas de la web holandesa de Ikea.

Puedes crear una experiencia interactiva similar utilizando las variables de geolocalización IP de Kinsta y la API de Google Maps. Para ello, necesitas una clave API de Google Maps y unos conocimientos básicos de la API JavaScript de Google Maps. Además, necesitarás los datos de localización de cada tienda que gestiones. En este caso, los datos pueden proceder de un tipo de entrada personalizado o de una base de datos.

Para la implementación, la práctica habitual es añadir el código al archivo functions.php de tu tema o a un plugin personalizado. Una vez que hayas configurado tu clave API de Google Maps, puedes configurar la estructura de datos de ubicación de la tienda:

// Register the store locations post type
add_action('init', function() {
    register_post_type('store_location', [
        'public' => true,
        'label' => 'Store Locations',
        'supports' => ['title', 'editor', 'custom-fields'],
        'show_in_rest' => true
    ]);

    // Register custom fields for location data
    register_meta('post', 'latitude', [
        'type' => 'number',
        'single' => true,
        'show_in_rest' => true
    ]);
    register_meta('post', 'longitude', [
        'type' => 'number',
        'single' => true,
        'show_in_rest' => true
    ]);
});

Para importar las ubicaciones de tus tiendas, puedes utilizar la interfaz de administración de WordPress, crear un tipo de entrada personalizado, añadir la latitud y la longitud en campos personalizados, añadir detalles de la tienda a tu contenido o incluso realizar una importación programática. Por ejemplo:

function import_store_locations($stores) {
    foreach ($stores as $store) {
        $post_id = wp_insert_post([
            'post_type' => 'store_location',
            'post_title' => sanitize_text_field($store['name']),
            'post_status' => 'publish'
        ]);

        if (!is_wp_error($post_id)) {
            update_post_meta($post_id, 'latitude', floatval($store['lat']));
            update_post_meta($post_id, 'longitude', floatval($store['lng']));
            update_post_meta($post_id, 'address', sanitize_text_field($store['address']));
            update_post_meta($post_id, 'phone', sanitize_text_field($store['phone']));
        }
    }
}


// Example usage:
$stores = [
    [
        'name' => 'Downtown Store',
        'lat' => 40.7128,
        'lng' => -74.0060,
        'address' => '123 Main St',
        'phone' => '(555) 123-4567'
    ]
    // Add more stores...
];

import_store_locations($stores);

La implementación del localizador requerirá un par de líneas de código y las variables Kinsta expuestas:

class StoreLocator {
    private $visitor_location;
    private $google_maps_key;
 
    public function __construct($google_maps_key) {
        $this->google_maps_key = $google_maps_key;
        $this->visitor_location = $this->get_visitor_location();        

        add_action('wp_enqueue_scripts', [$this, 'enqueue_maps_scripts']);
    }

    private function get_visitor_location() {
        // Use Kinsta's geolocation data
        if (isset($_SERVER['GEOIP_LATITUDE'], $_SERVER['GEOIP_LONGITUDE'])) {
            return [
                'lat' => floatval($_SERVER['GEOIP_LATITUDE']),
                'lng' => floatval($_SERVER['GEOIP_LONGITUDE'])
            ];
        }

        // Fallback to country center
        if (isset($_SERVER['GEOIP_COUNTRY_CODE'])) {
            return $this->get_country_center($_SERVER['GEOIP_COUNTRY_CODE']);
        }

        // Default to New York
        return ['lat' => 40.7128, 'lng' => -74.0060];
    }

    private function get_nearby_stores($radius = 50) {
        return get_posts([
            'post_type' => 'store_location',
            'posts_per_page' => 10,
            'meta_query' => [
                [
                    'key' => 'latitude',
                    'value' => [
                        $this->visitor_location['lat'] - ($radius / 111),
                        $this->visitor_location['lat'] + ($radius / 111)
                    ],
                    'type' => 'NUMERIC',
                    'compare' => 'BETWEEN'
                ]
            ]
        ]);
    }
…

A partir de aquí, puedes añadir el mapa a tu plantilla utilizando $store_locator->render_map().

Entrega dinámica de contenidos

El contenido específico de la ubicación, los precios y las promociones son aplicaciones básicas que dependen de la geolocalización. La entrega de contenidos en función de la ubicación te permite personalizar el contenido, los precios y las promociones de tu sitio en función de la ubicación del visitante.

Para implementar esto en tus proyectos, necesitas las variaciones de contenido para las distintas regiones a las que quieres dirigirte. A partir de ahí, puedes empezar a crear una forma fiable de gestionar los datos de localización y generar claves de caché. Esto garantiza una entrega eficaz de los contenidos, al tiempo que se mantiene el conocimiento de la ubicación:

private function get_location_context() {
    // Create unique cache keys based on location data
    $context = [
        'country' => $_SERVER['GEOIP_COUNTRY_CODE'] ?? null,
        'region'  => $_SERVER['GEOIP_REGION'] ?? null,
        'locale'  => get_locale()
    ];

    // Add currency and timezone data if needed
    if ($this->requires_currency_handling) {
        $context['currency'] = $this->get_country_currency($context['country']);
    }

    return $context;
}

Esto proporciona la base para cualquier decisión basada en la ubicación y para tu sistema de procesamiento de contenido. Este sistema gestiona tanto los precios como las variaciones de contenido regionales:

private function process_dynamic_content($content, $context) {
    // Handle pricing with currency conversion
    if (strpos($content, '{price:') !== false) {
        $content = preg_replace_callback(
            '/\{price:([0-9]+\.?[0-9]*)\}/',
            fn($matches) => $this->format_price(
                floatval($matches[1]), 
                $context['currency']
            ),
            $content
        );
    }

    // Process regional content blocks
    if (strpos($content, '[region:') !== false) {
        $content = preg_replace_callback(
            '/\[region:([^\]]+)\](.*?)\[\/region\]/s',
            function($matches) use ($context) {
                $regions = array_map('trim', explode(',', $matches[1]));
                return in_array($context['country'], $regions) ? $matches[2] : '';
            },
            $content
        );
    }

    return $content;
}

Esto te permite utilizar marcadores sencillos en tu contenido que se adaptan automáticamente a la ubicación del visitante. Por ejemplo:

[region:US,CA]
    <p>Free shipping on orders over {price:50}!</p>
[/region]
[region:GB,DE,FR]
    <p>Free shipping on orders over {price:45}!</p>
[/region]

Con una simple implementación, puedes optimizarlo para mejorar el rendimiento. Este es un paso que podrías pasar por alto, pero un caché eficiente puede ayudarte a mantener el rendimiento con tu contenido sensible a la ubicación. Los modelos de caché de Kinsta son ideales para este trabajo.

Precarga y validación de formularios

Crear formularios que tengan en cuenta la ubicación implica manejar diferentes formatos de dirección, códigos postales y números de teléfono en las distintas regiones. Por ello, es importante definir las reglas de validación y formato para esas diferentes regiones:

private $format_patterns = [
    'US' => [
        'postal' => [
            'pattern' => '^(?=.{5,10}$)\d{5}(-\d{4})?$',
            'transform' => fn($value) => strtoupper(trim($value))
        ],
        'phone' => [
            'pattern' => '^\+1[2-9]\d{2}[2-9]\d{2}\d{4}$',
            'transform' => fn($value) => '+1' . preg_replace('/\D/', '', $value)
        ]
    ],
    'GB' => [
        'postal' => [
            'pattern' => '^(?=.{6,8}$)[A-Z]{1,2}[0-9][A-Z0-9]? ?[0-9][A-Z]{2}$',
            'transform' => fn($value) => preg_replace(
                '/^(.+?)([0-9][A-Z]{2})$/', 
                '$1 $2', 
                strtoupper(trim($value))
            )
        ]
    ]
];

Estas pautas manejan las variaciones comunes en los códigos postales y los números de teléfono de los distintos países. Sin embargo, los requisitos de formato de las direcciones varían de un país a otro. Puedes utilizar un enfoque sistemático para tratar estas variaciones:

private function get_address_format($country_code) {
    $formats = [
        'US' => [
            'required' => ['street', 'city', 'state', 'postal'],
            'order' => ['street', 'street2', 'city', 'state', 'postal'],
            'state_label' => 'State',
            'state_type' => 'select'
        ],
        'GB' => [
            'required' => ['street', 'city', 'postal'],
            'order' => ['street', 'street2', 'city', 'county', 'postal'],
            'state_label' => 'County',
            'state_type' => 'text'
        ]
    ];

    return $formats[$country_code] ?? $formats['US'];
}

A continuación, examina la validación de campos. Debes aplicar una validación que respete los requisitos de formato regionales:

private function validate_field($field, $value, $country_code) {
    if (!isset($this->format_patterns[$country_code][$field])) {
        return true;  // No specific validation needed
    }

    $pattern = $this->format_patterns[$country_code][$field]['pattern'];
    $transform = $this->format_patterns[$country_code][$field]['transform'];

    // Transform value before validation
    $value = $transform($value);

    return (bool)preg_match("/$pattern/", $value);
}

Un pequeño fragmento reúne todo esto:

// Validate a postal code
if (!$this->validate_field('postal', $_POST['postal_code'], 'GB')) {
    $errors[] = 'Invalid postal code format';
}

Esta implementación se adaptará automáticamente a la ubicación del visitante, gestionará las variaciones regionales en los formatos de dirección, proporcionará la validación adecuada para los campos específicos de la ubicación y mantendrá la integridad de los datos en las distintas regiones.

Resumen

La implementación de la geolocalización de WordPress a través de la infraestructura de Kinsta te permite crear potentes aplicaciones con reconocimiento de ubicación. Al habilitar la herramienta de geolocalización IP de Kinsta, podrás aprovechar una funcionalidad a nivel de servidor, robusta, de alto rendimiento y fácil de usar. Además, está centrada en la privacidad y cumple con la normativa.

¿Tienes alguna pregunta sobre la geolocalización en WordPress y su aplicación en tus proyectos? Háznoslo saber en la sección de comentarios más abajo.

Steve Bonisteel Kinsta

Steve Bonisteel es un Editor Técnico de Kinsta que comenzó su carrera de redactor como periodista de prensa escrita, persiguiendo ambulancias y camiones de bomberos. Lleva tratando temas relacionados con la tecnología de Internet desde finales de la década de 1990.