# Visibilidad de Joinchat por países

🌟 Esta función está incluida con [**Joinchat Premium**](https://join.chat/es/precio/).

## 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 botón 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.

Para implementar esta funcionalidad vamos a usar un "Snippet" y como en otras ocasiones utilizaremos el plugin [Code Snippets](https://es.wordpress.org/plugins/code-snippets/), y desde aquí podéis [descargar el JSON](https://docs.join.chat/app/uploads/2022/02/join.chat-hide-by-country.code-snippets.json.zip) 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' );
Lenguaje del código: PHP (php)
```

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](https://ip-api.com/). 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](https://es.wikipedia.org/wiki/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**.
> 
> 🌟 Para una integración perfecta de la visibilidad por países en Joinchat con soporte de caché de página puedes adquirir [**Joinchat Premium**](https://join.chat/es/precio/).
> 
> ![Joinchat visibilidad por paises](https://docs.join.chat/app/uploads/2026/07/joinchat-visibilidad-por-paises.png)