PHP

Mostrar u ocultar métodos de pago por departamento en WooCommerce

Muestra u oculta métodos de pago en el checkout clásico de WooCommerce según el departamento de envío del cliente. Funciona con el refresco AJAX del checkout cuando el cliente cambia de dirección.

Dónde pegarlo: Tema hijo (functions.php) o gestor de snippets como Code Snippets Probado con: WooCommerce 10.7.0 Última revisión: 17 Sep, 2026

Prueba este código primero en un entorno de staging. Pégalo siempre en un tema hijo o en un gestor de snippets (como Code Snippets); nunca directamente en un tema padre, porque una actualización del tema lo eliminaría.

PHP
<?php
// Mostrar u ocultar metodos de pago segun el departamento de envio en WooCommerce
// Aplica al checkout clasico (el formulario que dibuja woocommerce_checkout_fields y
// se actualiza por AJAX con update_order_review). El checkout de bloques (Gutenberg)
// no pasa por este filtro: usa la Store API, con su propio extension point en PHP
// (por ejemplo ExtendSchema o un endpoint de payment-methods) y requiere otra implementacion.

// 1. Configuracion: id del metodo de pago => departamentos donde se muestra.
//    Los codigos de departamento son los que usa WooCommerce para Peru, definidos en
//    wp-content/plugins/woocommerce/i18n/states.php bajo la clave 'PE'. Los mas usados:
//    LMA = Municipalidad Metropolitana de Lima, CAL = El Callao, LIM = Lima (provincias),
//    ARE = Arequipa. Revisa ese archivo para el resto (AMA, ANC, APU, AYA, CAJ, CUS...).
//    Un metodo que NO aparece en este arreglo no se restringe: queda disponible en
//    cualquier departamento. Ajusta los id de metodo a los que uses en tu tienda: los
//    plugins de Andina Digital registran, por ejemplo, andina_pagos_qr (Yape y Plin) y
//    andina_transferencia (transferencia bancaria); WooCommerce trae ademas bacs
//    (transferencia bancaria del core) y cod (contra entrega).
function sa_snippet_metodos_por_departamento_config() {
	return array(
		// Ejemplo: contra entrega solo para Lima Metropolitana y Callao.
		'cod' => array( 'LMA', 'CAL' ),

		// Ejemplo: ocultar la transferencia bancaria fuera de estos departamentos.
		// Descomenta y ajusta el id del metodo y la lista segun tu caso.
		// 'andina_transferencia' => array( 'LMA', 'CAL', 'LIM', 'ARE' ),
	);
}

// 2. Filtrar los metodos de pago disponibles en el checkout segun el departamento del cliente.
add_filter( 'woocommerce_available_payment_gateways', 'sa_snippet_metodos_por_departamento' );
function sa_snippet_metodos_por_departamento( $available_gateways ) {
	$sa_metodos_por_departamento = sa_snippet_metodos_por_departamento_config();

	// Filtrar solo en el frontend. is_admin() es verdadero tambien durante el AJAX de
	// update_order_review (admin-ajax.php vive en wp-admin), por eso se deja pasar
	// cuando ademas es una peticion AJAX: asi el filtro sigue aplicando al refrescar
	// el checkout cuando el cliente cambia el departamento de envio.
	if ( is_admin() && ! wp_doing_ajax() ) {
		return $available_gateways;
	}

	// Sin carrito de WooCommerce inicializado no hay checkout que filtrar.
	if ( ! WC()->cart ) {
		return $available_gateways;
	}

	// Departamento del cliente: primero el de envio (el que decide el costo del pedido),
	// con el de facturacion como respaldo si todavia no eligio direccion de envio.
	$departamento = WC()->customer->get_shipping_state();
	if ( ! $departamento ) {
		$departamento = WC()->customer->get_billing_state();
	}

	// Sin departamento seleccionado no se puede decidir nada: se muestran todos los
	// metodos (pasa, por ejemplo, en la primera carga del checkout).
	if ( ! $departamento ) {
		return $available_gateways;
	}

	// 3. Quitar los metodos que no admiten el departamento del cliente.
	foreach ( $available_gateways as $gateway_id => $gateway ) {
		if ( ! isset( $sa_metodos_por_departamento[ $gateway_id ] ) ) {
			continue; // Este metodo no esta en la configuracion: sin restriccion.
		}

		if ( ! in_array( $departamento, $sa_metodos_por_departamento[ $gateway_id ], true ) ) {
			unset( $available_gateways[ $gateway_id ] );
		}
	}

	return $available_gateways;
}

Si prefieres no tocar código

Este snippet también está disponible como plugin listo para instalar: Pagos QR con Yape y Plin para WooCommerce.

Ver plugin

Cómo usarlo

Sigue estos tres pasos:

  1. Copia el código en un tema hijo (functions.php) o en un gestor de snippets como Code Snippets.
  2. Edita el arreglo de configuración al inicio del código: reemplaza los id de método de pago por los que use tu tienda (revísalos en WooCommerce, Ajustes, Pagos) y ajusta la lista de departamentos permitidos con los códigos de wp-content/plugins/woocommerce/i18n/states.php bajo la clave PE.
  3. Abre el checkout clásico con una dirección de envío dentro de los departamentos permitidos y confirma que el método aparece; cambia luego a un departamento fuera de la lista y confirma que desaparece al refrescarse el resumen del pedido, sin recargar la página.

Este snippet aplica al checkout clásico de WooCommerce, que usa el filtro woocommerce_available_payment_gateways. El checkout de bloques (Gutenberg) no pasa por este filtro: usa la Store API, con su propio mecanismo de registro en PHP, y requiere otra implementación.