Woocommerce: Agregar-Modificar Estado-País en Finalizar Compra

junio 1, 2026
Aprende a usar el hook woocommerce_states para agregar, modificar o eliminar los estados, provincias o departamentos que se muestran en el formulario de Finalizar Compra de WooCommerce — sin necesidad de plugins adicionales.

¿Por qué personalizar los estados en WooCommerce?

Por defecto, WooCommerce carga automáticamente la lista completa de estados, provincias o departamentos del país que hayas configurado en WooCommerce → Ajustes → General. Esto puede ser un problema en varios escenarios reales:

  • Tu tienda solo hace envíos a una ciudad específica (ej. solo Lima).
  • Quieres mostrar zonas personalizadas que WooCommerce no incluye (ej. distritos de Lima).
  • Operas en un país cuyas divisiones no están correctamente cargadas en WooCommerce.
  • Deseas simplificar el formulario reduciendo las opciones del desplegable.

La solución es usar el filtro de PHP woocommerce_states, que te permite reemplazar la lista de estados de cualquier país sin modificar los archivos del plugin.

💡
Buena práctica: Nunca modifiques directamente los archivos del plugin WooCommerce. Usa siempre hooks en el functions.php de tu tema hijo (child theme) o en un plugin personalizado. Así tus cambios sobrevivirán las actualizaciones.

Cómo funciona el hook woocommerce_states

El hook woocommerce_states es un filtro de WooCommerce que intercepta el array de estados antes de que se rendericen en el checkout. Recibe como parámetro un array asociativo con todos los países y sus estados.

La estructura del array es: $states['CÓDIGO_PAÍS']['CÓDIGO_ESTADO'] = 'Nombre del Estado'. Los códigos de país siguen el estándar ISO 3166-1 alpha-2 (2 letras) y los códigos de estado son los que define internamente WooCommerce.

Compatible con WooCommerce 3.x, 4.x, 5.x, 6.x, 7.x, 8.x y las versiones 9.x actuales. El hook no ha cambiado su firma desde versiones anteriores.

1 Agregar el código en functions.php

Abre el archivo functions.php de tu tema hijo y agrega el siguiente código. En este ejemplo, restringimos el envío en Perú únicamente a Lima:

Ejemplo básico: solo Lima (Perú)

	/**
	 * Personalizar los estados/provincias en el checkout de WooCommerce.
	 * En este ejemplo, solo se muestra Lima para Perú.
	 */
	add_filter( 'woocommerce_states', 'antocas_personalizar_estados' );

	function antocas_personalizar_estados( $states ) {
		$states['PE'] = array(
			'CAL' => 'El Callao',
			'LIM' => 'Lima',
		);
		return $states;
	}
	

Ejemplo avanzado: múltiples departamentos de Perú

	add_filter( 'woocommerce_states', 'antocas_personalizar_estados' );

function antocas_personalizar_estados( $states ) {
    $states['PE'] = array(
        'AMA' => 'Amazonas',
        'ANC' => 'Áncash',
        'APU' => 'Apurímac',
        'ARE' => 'Arequipa',
        'AYA' => 'Ayacucho',
        'CAJ' => 'Cajamarca',
        'CAL' => 'El Callao',
        'CUS' => 'Cusco',
        'HUV' => 'Huancavelica',
        'HUA' => 'Huánuco',
        'ICA' => 'Ica',
        'JUN' => 'Junín',
        'LAL' => 'La Libertad',
        'LAM' => 'Lambayeque',
        'LIM' => 'Lima',
        'LOR' => 'Loreto',
        'MDD' => 'Madre de Dios',
        'MOQ' => 'Moquegua',
        'PAS' => 'Pasco',
        'PIU' => 'Piura',
        'PUN' => 'Puno',
        'SAM' => 'San Martín',
        'TAC' => 'Tacna',
        'TUM' => 'Tumbes',
        'UCA' => 'Ucayali',
    );
    return $states;
}
	
⚠️
Importante: Si usas un tema hijo, el código va en el functions.php del tema hijo. Si no tienes tema hijo, considera crear un plugin personalizado para no perder los cambios al actualizar el tema.

2 Guardar y verificar el resultado

Después de guardar el archivo, sigue estos pasos para verificar que el cambio funciona correctamente:

  • Ve a tu tienda online y agrega un producto al carrito.
  • Navega a la página Finalizar Compra (checkout).
  • En el campo Estado / Provincia, despliega el menú y confirma que solo aparecen los estados que configuraste.
  • Si ves el listado completo, limpia la caché del navegador y del plugin de caché que tengas instalado.

Si necesitas encontrar los códigos de estado que usa WooCommerce internamente, puedes consultarlos en el archivo del plugin: wp-content/plugins/woocommerce/i18n/states/PE.php (donde PE es el código del país).

Ejemplos para otros países de habla hispana

Solo Buenos Aires (Argentina)

	add_filter( 'woocommerce_states', 'antocas_personalizar_estados' );

	function antocas_personalizar_estados( $states ) {
		$states['AR'] = array(
			'C'  => 'Ciudad Autónoma de Buenos Aires',
			'B'  => 'Buenos Aires',
			'X'  => 'Córdoba',
		);
		return $states;
	}
	

Solo Bogotá y Medellín (Colombia)

	add_filter( 'woocommerce_states', 'antocas_personalizar_estados' );

function antocas_personalizar_estados( $states ) {
    $states['CO'] = array(
        'DC'  => 'Bogotá D.C.',
        'ANT' => 'Antioquia (Medellín)',
    );
    return $states;
}
	

Personalizar varios países a la vez

	add_filter( 'woocommerce_states', 'antocas_personalizar_estados' );

function antocas_personalizar_estados( $states ) {
    // Perú: solo Lima y Arequipa
    $states['PE'] = array(
        'LIM' => 'Lima',
        'ARE' => 'Arequipa',
    );
    // Argentina: solo Buenos Aires
    $states['AR'] = array(
        'B' => 'Buenos Aires',
        'C' => 'CABA',
    );
    return $states;
}
	

Tabla de departamentos de Perú con sus códigos WooCommerce

Estos son los códigos internos que usa WooCommerce para los 25 departamentos del Perú:

Código Departamento Código Departamento
AMA Amazonas LOR Loreto
ANC Áncash MDD Madre de Dios
APU Apurímac MOQ Moquegua
ARE Arequipa PAS Pasco
AYA Ayacucho PIU Piura
CAJ Cajamarca PUN Puno
CAL El Callao SAM San Martín
CUS Cusco TAC Tacna
HUV Huancavelica TUM Tumbes
HUA Huánuco UCA Ucayali
ICA Ica LAL La Libertad
JUN Junín LAM Lambayeque
LIM Lima

Alternativa: usar el plugin Ubigeo Perú para WooCommerce

Si necesitas ir más allá de los departamentos y trabajar con provincias y distritos del Perú en el checkout, el método manual con woocommerce_states puede quedarse corto. En ese caso, existe el plugin gratuito Ubigeo de Perú para WooCommerce, disponible en el repositorio oficial de WordPress.

  • Agrega campos de departamento, provincia y distrito en el checkout.
  • Incluye los 25 departamentos, 196 provincias y 1874 distritos del Perú.
  • Compatible con WooCommerce 9.x y WordPress 6.x (actualizado en 2025).
  • Cuenta con una versión premium que permite calcular costos de envío por ubigeo.
Puedes instalarlo desde Plugins → Añadir nuevo y buscar «Ubigeo de Perú para WooCommerce». Es la solución más completa si vendes a nivel nacional en Perú.

Preguntas frecuentes

¿El hook woocommerce_states afecta solo al checkout o también al perfil del cliente?
Afecta a todos los lugares donde WooCommerce carga la lista de estados: el formulario de checkout (finalizar compra), el formulario de dirección en «Mi cuenta» y el backend de administración de pedidos.
¿Dónde encuentro todos los códigos de países y estados que usa WooCommerce?
En la carpeta wp-content/plugins/woocommerce/i18n/states/ hay un archivo PHP por cada país (PE.php, AR.php, CO.php, etc.) con todos los códigos y nombres. También puedes consultarlos en la documentación oficial de WooCommerce en woocommerce.com.
¿Qué pasa si un cliente ya tiene una dirección guardada con un estado que eliminé?
El valor guardado en la base de datos no se borra, pero al editar la dirección el cliente verá únicamente los estados activos en el desplegable. Si el estado anterior no está en la lista, quedará en blanco y deberá seleccionar uno nuevo.
¿Cómo renombrar la etiqueta «Provincia / Estado» en el checkout?
Puedes hacerlo con el hook woocommerce_checkout_fields. Por ejemplo:

add_filter('woocommerce_checkout_fields', function($fields) {
  $fields['billing']['billing_state']['label'] = 'Distrito';
  return $fields;
});
¿Este código funciona con el nuevo bloque de checkout de WooCommerce (Gutenberg)?
Sí. El filtro woocommerce_states opera a nivel de datos y es compatible tanto con el checkout clásico (shortcode) como con el nuevo bloque de checkout basado en Gutenberg disponible desde WooCommerce 8.x en adelante.

Relacionados