Mostrar Joinchat sólo en determinados países

Introducción

Hay ocasiones en las que una compañía solo ofrece sus servicios o productos en un único territorio, no tiene sentido por tanto que mostremos el boton flotante de Joinchat fuera de esa localización. Vamos a ver cómo podemos definir en qué país o países se muestra Joinchat, ocultando este canal de contacto al resto.

No es la primera vez que alguien nos ha preguntado por esto, pero sí es la primera en que nos piden una solución para implementar. Hace un par de días nos llegó la petición desde Repscan, una empresa de Barcelona dedicada a mejorar la reputación online de empresas y personas, ellos borran y generan contenidos de manera legal y permanente.

Su mensaje era éste:
«Hasta el momento nos está funcionando genial y nos ayuda mucho en la conversión de Leads pero tenemos un problema con la gente que nos llega de LATAM porque no podemos ofrecer el servicio.
Habría alguna forma de mostrar el icono del chat solo a personas de España o limitarlo a determinados países.»

Para implementar esta funcionalidad vamos a usar un «Snippet» y como en otras ocasiones utilizaremos el plugin Code Snippets, y desde aquí podéis descargar el JSON para poder importarlo desde dicho plugin, pero si te sientes cómodo puedes hacerlo como prefieras.

Código

function joinchat_hide_by_country( $show ) {

	// true for included countries, false for excluded countries.
	$is_whitelist = true;

	// List of countries.
    // Edit list to your needs, e.g. for Iberian Peninsula (Spain & Portugal)
	$countries = array(
		'ES',
		'PT',
	);

	// Keep privacy anonymize user ip.
	$user_ip = wp_privacy_anonymize_ip( $_SERVER['REMOTE_ADDR'] );
	$cached_ip = 'ipcountry_' . md5( $user_ip );

	if ( ! $country = get_transient( $cached_ip ) ) {

		// Retreive two-letter country code (ISO 3166-1 alpha-2).
		// For more options view API doc (https://ip-api.com/docs).
		$response = wp_remote_get( 'http://ip-api.com/json/' . $user_ip . '?fields=status,countryCode' );
		$data = json_decode( wp_remote_retrieve_body( $response ) ?: '{"status":"error"}' );

		if ( $data && $data->status === 'success' ) {
			$country = $data->countryCode;

			// Cache country in transient (1 day) for faster future responses
			// and don't pass rate limit (45 requests per minute from an IP address).
			set_transient( $cached_ip, $country, DAY_IN_SECONDS );
		}
	}

	if ( ! $country ) {
		return $show;
	}

	// Check current country.
	if ( $is_whitelist && ! in_array( $country, $countries ) || ! $is_whitelist && in_array( $country, $countries ) ) {
		return false;
	}

	return $show;

}
add_filter( 'joinchat_show', 'joinchat_hide_by_country' );

Como podéis ver está perfectamente comentado y es muy simple, solamente tenéis que añadir los países en los que deseáis que se muestre Joinchat, en el ejemplo que os damos se trataría de la península Ibérica (‘ES’ y ‘PT’), de tal forma que solo los visitantes de estos países verán el botón flotante de Joinchat para poder contactar.

Para hacer esto posible usaremos la API pública de Gelolocation IP-API. Es gratuita con un límite de 45 peticiones por minuto desde la misma IP. Para no repetir llamadas a la API consultando la misma IP de usuario y tener una respuesta más rápida, el resultado se guarda en caché en un «transient» durante 24 horas.

Otro punto importante es que la IP del usuario se anonimiza para mantener la privacidad y no tener ningún problema con la GDPR 😉

Los códigos de país deben usar el formato de dos letras (ISO 3166-1 alfa-2).

NOTA

Esta consulta se realiza en el servidor con cada petición por lo que no funcionará con caché de página.

Contenido

Versión gratuita

Snippets

Versión Premium

Chat Funnel

En esta sección

🍪 Utilizamos cookies para mejorar tu experiencia. Visita nuestra Política de Privacidad para saber más.

AL UTILIZAR NUESTRA WEB, ACEPTAS EL USO DE COOKIES.