Guardar términos y condiciones de WooCommerce en la base de datos

El 25 de mayo de 2018 entró en vigor el Reglamento General de Protección de Datos (RGPD), la nueva ley que pretende otorgar mayor seguridad y control a las personas sobre su información personal, así como establecer unas reglas comunes en toda Europa de protección de dicha información. Entre muchas otras cosas, quien gestione datos privados debe poder demostrar que el cliente/usuario dió su permiso para gestionar sus datos personales.

¿Qué hace WooCommerce por defecto?

WooCommerce te lo pone fácil para que el usuario no pueda comprar nada si no acepta los términos y condiciones. Solo hay que crear una página con los términos y condiciones de la tienda y asignarla en Ajustes > Finalizar compra > Páginas de finalizar compra.

Y así, justo antes de pagar, veremos esto:

Genial, pero eso solo fuerza al usuario a marcar la casilla. Legalmente no podrás demostrar que el usuario marcó tal casilla porque WooCommerce no almacena en ningún lugar tal aceptación por defecto.

¿Cómo guardar los términos y condiciones en la base de datos entonces?

Lo que vamos a hacer es añadir un pequeño código para que sí podamos guardar esa aceptación, y para eso abrimos nuestro archivo functions.php de WordPress, que está en la ruta wp-content/themes/el_tema_en_cuestion/functions.php. Aquí hago dos pequeños paréntesis en forma de consejos:

  1. Para acceder al archivo, tendremos que conectarnos vía FTP. Teóricamente también se puede acceder mediante el editor de ficheros que tiene WordPress en el menú Apariencia, pero no es recomendable ya que te lo pone «demasiado fácil» y es muy sencillo tocar algo que no se debe, además de por temas de seguridad.
  2. Es recomendable crear un tema hijo y modificar el functions.php del tema hijo en vez del tema padre, ya que cada vez que el tema padre se actualize se perderán los cambios. Para saber cómo crear un tema hijo os recomiendo visitar el siguiente post: https://ayudawp.com/como-crear-un-tema-hijo-en-wordpress/

Una vez dentro del archivo, el código a añadir es (ojo, siempre después de la etiqueta <?php):

// Almacenar términos y condiciones en la base de datos
add_action('woocommerce_checkout_update_order_meta', 'woo_save_terms_and_conditions_status');
function woo_save_terms_and_conditions_status( $order_id ) {
if ($_POST['terms']) update_post_meta( $order_id, '_terms', esc_attr($_POST['terms']));
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'woo_display_terms_and_conditions_status', 10, 1 );
function woo_display_terms_and_conditions_status($order){
$terms = get_post_meta( $order->id, '_terms', true );
$terms_status = ( $terms == 'on' ? __('aceptado') : __('undefined') );
echo '<p><strong>'.__('Términos y condiciones').':</strong> ' . $terms_status . '</p>';
}

Y ya está. Ahora, cada vez que nos compren algo, en el pedido en nuestro panel de administración podremos ver lo siguiente porque tenemos la aceptación almacenada en nuestra base de datos:

—-

Fuente: http://www.remicorson.com/storing-woocommerce-terms-conditions-in-the-database/

En esta entrada pueden haber enlaces de afiliado a productos y servicios en los que a veces podrás obtener descuentos si compras algo, y yo, como autor de la entrada, una pequeña comisión. No te preocupes, nunca pagarás de más y nunca verás enlaces de afiliados de algo que yo mismo no utilice o recomiende.

21 comentarios

Deja un comentario

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

  1. Si ya hay usuarios registrados, y usan contenido gratuíto, como puedo hacer para que acepten los términos, sin que hagan una compra? Por el simple hecho de estar en el sitio web o ver contenido gratis? Y a su vez guardar esa prueba? O más bien eso sería un aviso legal?

  2. Hola, lo he utilizado, pero me pone «undefined», creo que es pq uso el Yith terms and conditions popup plugin. Sabrias decirme como podria mostrar el valor de lo que se ha aceptado a través de ese plugin?

    • Me temo que no sé decirte la respuesta, pero ¿qué es lo que hace exactamente ese plugin? O sea, ¿si lo desactivas ya funciona el código que he puesto?

  3. Buenas Gerard, tu código funciona a la perfección, aun así no me aclaro con el tema RGPD, te cuento, ademas de este checkbox tengo otro para la política de privacidad en finalizar comprar, registro de usuarios y en comentarios(valoraciones), deben estos checkbox dejar constancia que han sido aceptados, o solo términos y condiciones en finalizar comprar?

    Espero haberme explicado bien, gran trabajo muchas gracias.

    Un Saludo.

    • Hola Jose Manuel,

      Me alegro que te funcione, primero de todo.

      Respecto a tu pregunta, sí, técnicamente debes poder demostrar que el usuario marcó la checkbox, o sea, el marcado tiene que estar en alguna «base de datos», ya sea la misma de WordPress, o tu correo, o algún sitio.

      Una cosa que te puedes ahorrar es la segunda checkbox en la página de finalizar compra (la de política de privacidad). Lo que se recomienda es agregar la primera capa de información con un enlace a la política de privacidad, y luego el checkbox a la página de términos y condiciones. Y en esa página de términos y condiciones también metes el enlace a la página de privacidad. Así, el usuario tendría que leer (aunque nadie lo haga) todos los términos y condiciones y allí le saldría la política de privacidad. Algo así: https://i.imgur.com/y5lQ55d.png

      ¡Un saludo!

      • Gracias por la aclaración y el consejo, ahora se que me tengo que centrar en conseguir que esa aceptación de Política de privacidad quede registrada, espero no volverme loco, muchas gracias.
        Un saludo!

        • No hay de qué. Como idea (también para mi para una futura entrada en este blog), se podría reemplazar el formulario de comentarios/registro de usuario por otro que registre esa checkbox, usando algun plugin. Hay que investigar 😉

  4. Hola Gerard:

    Coloqué el código en el archivo functions.php del theme hijo desde el Cpanel, lo descargué, agregué el código y lo volvi a cargar pero al hacerlo la web dejó de funcionar y sale con un mensaje que dice «El sitio está experimentando dificultades técnicas.» (te dejo esta imagen http://prnt.sc/oh0kbx) y cuando coloco nuevamente el archivo functions.php se restablece la web. El theme que uso es Rehub y es un marketplace

    Que puedo hacer? Necesito realmente guardar evidencia de esa aceptación de Términos y Condiciones.

    • Hola Johana,

      Se me ocurren dos cosas que estén pasando:
      1) El código que has puesto tiene algún error. Asegúrate que copias y pegas todos los caracteres que he puesto, incluidos los {} y cada punto y coma.
      2) Algún plugin o tu tema tiene problemas de compatibilidad. ¿Puedes probar desactivando todos los plugins a ver si funciona? Si no, ¿qué pasa si cambias tu tema al tema por defecto de WordPress y añades el código al functions.php de ese tema por defecto?

      • Buen día Gerard:

        Tienes toda la razón, estaba pegando mal el código, por alguna razón google chrome me traduce la página y al mismo tiempo el coódigo (la palabra funtion), pero ya me di cuenta lo pegué bien y funciona a la perfección muchas gracias.

        Ahora, los usuarios tienen dos maneras de aceptar los términos y condiciones de la web, una por medio de la compra que para eso es éste código, y otra manera, es cuando se registran a la web sin comprar, es en ese momento que no logro guardar prueba de la aceptación, sabes de algún código o algo que me permita guardar esa aceptación por ese lado?.

        Te agradezco muchísimo.

        • Muy buena pregunta. La verdad es que ahora mismo desconozco cómo hacerlo funcionar en el lado que tú comentas, pero cuando tenga un ratito libre lo investigaré y si lo soluciono ya lo pondré por aquí 😉

          • Ok.

            Te agradezco muchísimo por compartir tus conocimientos, me sirvió el dato del código y quedo atenta por si descubres la otra manera de guardar la aceptación. Felicidades.

  5. Buenas,

    Excelente la idea, pero no deberían guardarse los términos y condiciones en algún sitio en cada pedido aunque fuera reiterativo?
    Lo digo porque si solo se guarda un «terminos: aceptado» tampoco demuestra que era lo que ponía en los términos que se aceptaron, que es lo que finalmente importa a la hora de defenderse ante la ley según qué problemas.

    • La verdad es que tiene todo el sentido del mundo, aunque no sé si es requerido. Técnicamente el usuario mismo podría descargarse los términos y condiciones cuando los estuviera leyendo, cosa que no puede hacer con la casilla de verificación.

  6. Gracias por la respuesta Gerard, aunque creo que no entendiste a lo que me refería. Empezando por que esto de la LOPD es una pantomina, en mi supuesto lo que me refiero es que si llega una denuncia de un usuario a nuestra tienda diciendo que él nunca ha aceptado las condiciones X, ¿como podriamos demostrar legalmente que sí las ha aceptado?

    Con tu código lo más que se consigue es que se guarde un SÍ, pero ¿un sí a qué? Poniendonos en lo peor, de cara a un juicio, de qué vale ese SÍ si no están guardadas las condiciones?

    • Bueno, ahí ya entramos en temas legales, así que no sabría que decirte porque no soy abogado… Ahora casi todas las webs llevan la casilla de «acepto la política de privacidad», y no creo que casi nadie guarde esa política de privacidad. Además, imaginemos que sí guardamos las condiciones aceptadas. ¿Quién me dice que nadie entró en mi base de datos y modificó algunas frases de esa política que guardé? Básicamente vengo a decir que lo mejor es que un abogado pueda responder a esto 🙂

  7. Hola,

    Quisiera saber si tienes idea de cómo dejar marcada la casilla de términos y condiciones por defecto.

    Lo estoy necesitando con mucha urgencia.

    Gracias de antemano!

    • Hola Andrés,

      La verdad es que así a bote pronto no lo sé, aunque no debería ser difícil con un poco de jQuery.