Restringir un método de pago en WooCommerce por usuario

Este pequeño plugin que os voy a mostrar es un desarrollo a medida que ha necesitado hace poco un cliente. Lo muestro aquí porque es lo suficientemente corto y expresivo como para que en una entrada de blog como esta, pueda resultar útil sin entrar en demasiadas complejidades o en un código excesivamente largo. Veamos.

El problema es el siguiente:

  • Queremos que en cada usuario exista una casilla para elegir si puede usar contrarrembolso o no

Esto es un problema medianamente normal porque usar contrarrembolso en una tienda online tiene sus riesgos. Tú envías el paquete sin haber recibido nada y luego si el usuario lo rechaza, te llega el paquete devuelto, después de haberlo preparado; y te toca pagar los costes de envío. Así que digamos que este tipo de pagos por contrarrembolso está bien que sean sólo a un grupo de clientes que sabemos que no van a generar problemas.

Si quieres algún desarrollo a medida para WooCommerce grande o pequeño escríbenos

Así que bueno, vamos al lío, lo primero es saber donde meter este código. Podéis crear un plugin para ello o meterlo en el functions.php de vuestro tema hijo.

Mostrar un selector en el perfil de cada usuario para elegir si permitimos o no contrarrembolso

Esto es lo primero, articular una forma de que en cada perfil aparezca un selector donde elegir si permitimos contrarrembolso o no:

add_action( 'show_user_profile', 'cod_restringir_contrarrembolso_mostrar_campo' );
add_action( 'edit_user_profile', 'cod_restringir_contrarrembolso_mostrar_campo' );
function cod_restringir_contrarrembolso_mostrar_campo( $user ) { 
  if( !current_user_can( 'manage_options' ) )
    return;

  $_restringir_contrarrembolso = get_user_meta( $user->ID, '_restringir_contrarrembolso', true );
  ?>
  <h3>Permitir/restringir contrarrembolso</h3>
  <table class="form-table">
    <tr>
      <th><label for="restringir_contrarrembolso">Restringir contrarrembolso</label></th>
      <td>
        <select name="restringir_contrarrembolso">
          <option value="no" <?php selected( $_restringir_contrarrembolso, "no" ); ?>>Permitir contrarrembolso</option>
          <option value="yes" <?php selected( $_restringir_contrarrembolso, "yes" ); ?>>Prohibir contrarrembolso</option>
        </select>
      </td>
    </tr>
  </table>
<?php }

Básicamente hacemos lo siguiente:

  1. Registramos dos hooks, para que se muestre el selector, en dos hooks de tipo action que se ejecutan al ver y al editar el perfil del usuario
  2. Al comienzo de la función, hacemos que solo los administradores puedan usarla, para evitar un mal uso de la misma, para eso decimos específicamente que si no tiene la capability de manage_options típica de administradores, que no siga
  3. Cargamos el valor de si restringimos contrarrembolso o no en una variable, usamos un metadato de usuario para guardar este valor
  4. Mostramos el selector, con su título y una tabla al estilo de las que usa WordPress en el backend en los perfiles, fijaros que usamos la función selected para que se elija el valor asignado en base a lo que hemos recogido en el punto anterior

Guardar el valor que haya elegido el usuario al actualizar el perfil

Los siguiente será hacer que el valor que elija el usuario se guarde en la base de datos. El código es el siguiente:

add_action( 'personal_options_update', 'cod_restringir_contrarrembolso_guardar_campo' );
add_action( 'edit_user_profile_update', 'cod_restringir_contrarrembolso_guardar_campo' );
function cod_restringir_contrarrembolso_guardar_campo( $user_id ) {
  if( !current_user_can( 'manage_options' ) )
    return;

  update_user_meta( $user_id, '_restringir_contrarrembolso', $_POST['restringir_contrarrembolso'] );
}

Por partes:

  1. Registramos los hooks correspondientes que se ejecutan en las operaciones de guardado
  2. Hacemos el chequeo de seguridad para que nadie pueda usar esta función sin ser administrador
  3. Actualizamos el valor, en base al valor elegido en el selector

Deshabilitamos si procede el contrarrembolso en WooCommerce

Y bueno, ya que tenemos la información gestionada, nos falta llevar a cabo la acción que estamos buscando:

add_filter( 'woocommerce_available_payment_gateways', 'cod_woocommerce_payment_gateways' );
function cod_woocommerce_payment_gateways( $available_gateways ) {
  $_restringir_contrarrembolso = get_user_meta( get_current_user_id(), '_restringir_contrarrembolso', true );

  if( $_restringir_contrarrembolso != 'yes' )
    return $available_gateways;

  unset( $available_gateways[ 'cod' ] );

  return $available_gateways;
}

Veamos:

  1. Registramos el hook de tipo filtro que recibe todos los métodos de pago disponibles y los devuelve de nuevo, de forma que ahí podemos añadir, quitar o editar los métodos de pago que queramos
  2. Recogemos el valor
  3. Si el usuario no tiene deshabilitada la opción de tener contrarrembolso, devolvemos los métodos de pago tal cual, sin tocarlos
  4. Si en efecto, el usuario los tiene deshabilitados, es decir, si tiene ‘yes’ guardado en el valor asociado, se eliminar el contrarrembolso (unset( $available_gateways[ ‘cod’ ] );)
  5. Y se devuelven las pasarelas de pago con este tipo deshabilitado

Podéis hacer lo mismo para otras pasarelas cambiando el identificador de la misma o cambiando la lógica de las funciones. El identificador de contrarrembolso es cod y el del resto de métodos de pago lo podéis ver fácilmente aquí:

  1. En WooCommerce -> Ajustes -> Pagos
  2. Elegís un método de pago y os lleva a una url de este tipo: http://tusitio.com/wp-admin/admin.php?page=wc-settings&tab=checkout&section=bacs

Lo que pongo en negrita es el identificador.1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (Ninguna valoración todavía)

Cargando…

Almacenamos las IPs desde la que se envían las valoraciones para evitar fraudes

Carrito

loader