¿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.
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.
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;
}
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.
Preguntas frecuentes
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.
woocommerce_checkout_fields. Por ejemplo: add_filter('woocommerce_checkout_fields', function($fields) {
$fields['billing']['billing_state']['label'] = 'Distrito';
return $fields;
});
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.
