Cómo ocultar métodos de pago por producto o categoría en WooCommerce (actualizado 2021)

Por defecto WooCommerce mostrará todos los métodos de pago activos en tu página de finalizar compra pero no siempre eso es lo que quieres.

Imagina, por ejemplo, que en algún producto no quieres que se pueda usar la transferencia bancaria, o Paypal, o contra reembolso.

Las situaciones pueden ser muy variopintas, desde un producto de entrega inmediata donde no tiene sentido la transferencia bancaria, o simplemente productos virtuales donde no tiene lógica ninguna que se muestre el pago a la entrega o contrareembolso ¿verdad?

Pues bien, WooCommerce nos permite decidir muchas cosas en sus ajustes o en los detalles de los productos, pero esto no. Vamos a retomar las riendas.

Oculta métodos de pago por producto con código (GRATIS)

Si tienes claro en qué productos quieres ocultar algunas pasarelas de pago nada mejor que usar un poco de código. Solo tienes que añadirlo al archivo functions.php  de tu tema activo o a tu plugin de personalizaciones o mu-plugin.

/* Quitar métodos de pago
* Oculta las pasarelas de pago disponibles por producto
* Añade este codigo a tu plugin de funciones o el archivo functions.php del tema activo
* En el ejemplo se desactivan las pasarelas Paypal (paypal) y contrareembolso (cod) pero
* tambien puedes desactivar otras como transferencia bancaria (bacs) o Stripe (stripe), por ejemplo
* Cambia los IDs de producto de ejemplo en el array $prodids, p.ej. $prodids=array(15,30);
*/
//Primero comprobamos si el producto esta disponible o no en el carrito.
function is_product_in_cart( $prodids ){
	$product_in_cart = false;
	foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
		$product = $cart_item['data'];
    		if ( in_array( $product->id, $prodids ) ) {
	        	$product_in_cart = true;
		}
	}
	return $product_in_cart;
}
//  Luego ya desactivamos la pasarela que queramos por ID de producto. Cambia los números de ID en el array $prodids
function payment_gateway_disable_product( $available_gateways ) {
	global $woocommerce;
	//print_r( $available_gateways );
	$prodids=array(15,30);
	if ( isset( $available_gateways['paypal'] ) && is_product_in_cart( $prodids ) ) {
	    unset(  $available_gateways['paypal'] );
	}
        if ( isset( $available_gateways['cod'] ) && is_product_in_cart( $prodids ) ) {
	    unset(  $available_gateways['cod'] );
	}
	return $available_gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_product' );

En el ejemplo anterior solo debes tener en cuenta las variables a modificar. Por un lado está el array $prodids , que es donde pones la lista de los IDs de tus productos para los que quieres ocultar pasarelas de pago, en el ejemplo los IDs 15 y 30.

Para saber el ID de un producto solo tienes que pasarte por la página de administración de productos, ahí lo tienes bien clarito, al pasar el cursor sobre cualquier producto.

El otro parámetro a tener en cuenta es la(s) pasarela(s) de pago a ocultar, en el ejemplo Paypal (paypal) y contrareembolso (cod). Si quieres añadir o quitar pasarelas de pago a ocultar simplemente sigue el ejemplo, pudiendo también ocultar otras pasarelas como la transferencia bancaria (bacs), Stripe (stripe) u otras, depende de tu objetivo.

Para saber el ID de las pasarelas de pago simplemente pásate por la administración de tu tienda en WooCommerce -> Ajustes -> Finalizar compra  y ahí los tienes.

Ocultar métodos de pago por categoría con código (GRATIS)

También puedes decidir qué pasarelas de pago ocultar, no por producto sino por categoría completa. Puedes hacerlo con este otro código.

/*
 * Oculta pasarelas de pago si un producto de una categoría está en el carrito.
 *  - Nota: Si se añaden varios productos y solo uno es de la categoría tampoco aparece la pasarela ocultada
 * Uso:
 *    unset available_gateways : Nombre de las pasarelas de pago de WooCommerce que no se verán - paypal, cod, bacs y cheque
 *    category_ids :  Los IDs de categorías para las que ocultar la pasarela de pago. El ID lo tienes haciendo clic en la categoria en Productos -> Categorias, se mostrará el "tag_ID" en la barra de direcciones
 */
add_filter( 'woocommerce_available_payment_gateways', 'ayudawp_quitar_pasarela_por_categoria' );

function ayudawp_quitar_pasarela_por_categoria( $available_gateways ) {
if ( is_admin() ) return $available_gateways;
if ( ! is_checkout() ) return $available_gateways;
$unset = false;
$category_ids = array( 2, 34 );//Sustituye estos números por los IDs de las categorías en las que se aplica
foreach ( WC()->cart->get_cart_contents() as $key => $values ) {
$terms = get_the_terms( $values['product_id'], 'product_cat' ); 
foreach ( $terms as $term ) { 
if ( in_array( $term->term_id, $category_ids ) ) {
$unset = true;
break;
}
}
}
if ( $unset == true ) unset( $available_gateways['paypal'] );//Aquí sustituye paypal por la pasarela que quieras desactivar
return $available_gateways;
}

Ocultar métodos de pago por categoría con plugins (GRATIS)

Como hemos visto, otro modo de ocultar métodos de pago es hacerlo por categoría de productos, y para esto hay algunos plugins gratuitos que ofrecen esta posibilidad de manera gratuita.

WooCommerce Product Payments

La versión gratuita de este plugin sirve para eso exactamente, para elegir para qué categorías ocultarás métodos de pago. Pero su enfoque es diferente, en realidad lo que haces es elegir el método de pago, solo uno, disponible para cada categoría de producto.

En su página de ajustes encontrarás la lista de tus categorías de producto, seleccionas una o varias y elige su método de pago por defecto, el resto se ocultarán en la página de finalizar compra.

Como ves es algo limitado, pues no puedes seleccionar varios métodos de pago por categoría.

Booster for WooCommerce

En su versión gratuita puedes ocultar cada método de pago por categoría de producto, solo tienes que empezar a teclear nombres de categoría en cada método de pago para ocultarlo.

Para este uso es bastante más completo que el anterior al ser su enfoque justo el contrario, y el correcto. Pero, como ves, las opciones para ocultar pasarelas por producto están inhabilitadas, solo disponibles en la versión plus.

Ocultar métodos de pago por producto con plugins (DE PAGO)

Curiosamente todos los plugins que ofrecen ocultar métodos de pago no ofrecen gratis la opción de hacerlo por producto, solo por categoría, así que si quieres esta opción con plugins te toca pasar por caja.

Algunos plugins que ofrecen esa opción en su versión de pago son estos:

Booster Plus for WooCommerce (19,99$)

Ahora sí, en su versión de pago ya están activos los campos para ocultar pasarelas de pago por producto.

WooCommerce Payment GateWay per product premium (19,95€/año)

Este plugin es la versión de pago del gratuito WooCommerce Products Payments, y por esta módica cantidad anual ya puedes especificar qué pasarelas de pago estarán disponibles en cada producto, y de la manera correcta, mediante un nuevo widget en el editor de productos.

Si no seleccionas ninguna se mostrarán todas las pasarelas, y si seleccionas alguna solo se mostrarán las elegidas.

WooCommerce Conditional Shipping and Payments (79$)

Este plugin de los creadores de WooCommerce ofrece, entre sus múltiples configuraciones, la posibilidad de elegir qué pasarelas de pago se mostrarán por producto, categoría, país o método de envío. Muy completo, eso sí, totalmente configurable como puedes ver en la siguiente captura.


Como ves, algo que considero tan básico no está incluido en WooCommerce por defecto, pero afortunadamente tenemos opciones de sobra, de pago y gratis.

VALORA Y COMPARTE ESTE ARTÍCULO PARA MEJORAR LA CALIDAD DEL BLOG…
(11 votos, promedio: 5)

¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!

AVISO: Esta publicación es de hace 3 años o más. Si es un código o un plugin podría no funcionar en las últimas versiones de WordPress, y si es una noticia podría estar ya obsoleta. Luego no digas que no te hemos avisado. ¡Ah! ¿te funciona? pues entonces no he dicho nada :)

Sobre el autor

18 comentarios en “Cómo ocultar métodos de pago por producto o categoría en WooCommerce (actualizado 2021)”

  1. Hola Fernando, muchas gracias por el artículo y por tu blog tan genial. Yo tengo el siguiente problema, quizás me puedas orientar un poco: actualmente uso la pasarela de MercadoPago porque te permite hacer los envíos mediante DHL a precio preferencial, pero esto solo funciona en México. ¿Cómo le puedo hacer para que mis clientes en el extranjero tengan la opción de pagar con PayPal en vez de MercadoPago? Lo obvio sería activar activar ambas formas de pago y dejarlos elegir al momento, pero a mi me gustaría que si el usuario está en México solo tenga como opción MercadoPago y si está fuera de México, solo pueda hacerlo con PayPal…. ¿Alguna idea? Gracias

  2. Buenas Fernando, gracias por el articulo. Tengo un pequeño problema con el código que pusiste. Cuando pongo el código en el functions.php funciona correctamente pero en la administración de woocommerce en Ajustes -> Finalizar compra sale vació las opciones debido al código ya que si lo quito se arregla ¿sabes a que puede ser debido?

    1. Me autorespondo: Justo despues de abrir la funcion payment_gateway_disable_product comprobar mediante la funcion is_admin() si estamos en el frontend o el backend para ocultar o mostrar el codigo 🙂

  3. Hola Fernando, como siempre unos artículos interesantísimos,
    pero tengo una duda, ¿este método se puede usar para ocultar formas de pago dependiendo de la provincia o zona de envío? por ej. yo tengo una zona de envío a Baleares, Canarias, Ceuta y Melilla y no quiero que salga ningún método de pago excepto uno que yo llamo «le calcularemos los gastos de envío» ¿se puede hacer?.

    Gracias y saludos.

      1. Gracias Fernando por la respuesta, pero no entiendo bien lo que tendría que hacer para ocultar las diferentes formas de pago.
        Gracias.

  4. Hola, el código funciona para productos simples o variables pero para todas sus variaciones por lo que estoy probando ya que tengo un producto variable y al meter el id de la variación no fucniona. ¿Cómo sería en el caso de un producto variable donde quiero mostrar un método de pago solo para una variación (permite la compra financiada) y no en el resto de variaciones?

  5. Andrés Núñez Flórez

    Hola, ¿sabes cómo se puede resolver en caso que un producto con medio de pago excluido (por ejemplo que no se puede pagar con PayU) se compre en conjunto con otros productos, no se inhabiliten las demás formas de pago? ya que al comprar varios productos si quiero que esté habilitado PayU.

  6. Hola Fernando, que tal estas.
    Muy interesante los codigos, tengo una consulta, se que el titulo habla de ocultar metodo de pago, incluso me fije en el subtitulo:
    Oculta métodos de pago por producto con código (GRATIS)

    En mi caso, yo quiero ocultar por ejemplo transferencia bancaria a todos los productos que tengo (son miles), pero solo quiero mostrar para 1 solo producto, en este caso, cual seria la mejor opcion? Es para evitar poner miles de IDs en el array.

    Agradezco desde ya la atencion.

  7. Hola Fernando.
    Tengo una duda. No se si se podrá realizar con WordPress.

    Quiero realizar una tienda online con varios vendedores y que cada uno de ellos pueda configurar su propio metodo de envío y de pago.

    Es decir como un Amazon, pero sin que el dinero pase por el intermediario. Es decir, que en el carrito de compra el cliente pueda pagar a casa vendedor por separado.

    gracias por la atención de antemano.

  8. Hola Fernando,

    Gracias por tu post. He incluido el código en mi function.php de mi child theme y cuando voy a usar el woocomerce en el backend, el apartado de inicio no me funciona y me muestra este mensaje:

    Ha habido un error crítico en esta web. Por favor, comprueba la bandeja de entrada del correo electrónico del administrador de tu sitio para obtener instrucciones. Aprende más sobre la depuración en WordPress.

    Desaparece cuando borro esa parte del código que nos has facilitado y no logro ver el error, a pesar de que otro compañero del blog ya lo indica más arriba.

    ¿Puedes ayudarme porfa?

    Muchas gracias

  9. Buenas Fernando… hace tiempo usé este código, el de los productos, pero al actualizar la web esta semana, este código me da un error. ¿Será que se ha quedado anticuado el script?.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información base sobre privacidad:
  • Responsable: Fernando Tellado ([email protected])
  • Fin del tratamiento: Moderación de comentarios para evitar spam
  • Legitimación: Tu consentimiento
  • Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal
  • Derechos: Acceso, rectificación, portabilidad, olvido

 

Ir arriba Ir al contenido