Sumar y restar cantidades con SQL en WordPress

Hace unos días un usuario preguntaba en un comentario del blog como sumar y restar cantidades a una tabla de productos en WordPress usando SQL.

Parecía una pregunta simple con una respuesta simple pero después de darle un par de vueltas y hacer una pequeña prueba de concepto me ha parecido interesante mostrar aquí las dos aproximaciones que se me ocurren.

El ejemplo es sencillo, tengo una tabla de productos que contiene el nombre del producto y la cantidad de producto en existencia. La idea es incrementar o disminuir estas cantidades a medida que se compren o se vendan productos.

Para ello he creado un plugin que crea las tablas necesarias y un par de formularios en el escritorio para comprar y vender productos. Si necesitas entender mejor como funciona todo eso puedes consultar el artículo «Cómo programar un formulario sin utilizar plugins» en este blog.

Gif animado con una demo del plugin en funcionamiento sumando y restando cantidades de la tabla de la base de datos

Update directo

La primera solución que he adoptado se basa en realizar un «UPDATE«, sumando o restando al campo cantidad el incremento o decremento.

Sería algo así:

$cantidad_adquirida = (int)$_POST['cantidad'];
$id_producto = (int)$_POST['id_producto'];

$wpdb->query(
    $wpdb->prepare(
        "UPDATE `$tabla_producto` SET cantidad = cantidad + %d
         WHERE id = %d",
         $cantidad_adqurida, $id_producto
    )
);

Esta aproximación es muy directa y creo que bastante fácil de entender. Vamos con la segunda.

Select más $wpdb->update

Aproximación en tres pasos: uno para averiguar la cantidad actual con un “SELECT”, luego hago la suma (o la resta) y finalmente una actualización a la nueva cantidad utilizando $wpdb->update

$cantidad_vendida = (int)$_POST['cantidad'];
$id_producto = (int)$_POST['id_producto'];

$consulta_cantidad_actual = "SELECT cantidad FROM $tabla_producto WHERE id = $id_producto";
$cantidad_actual = $wpdb->get_var($consulta_cantidad_actual);
$cantidad_final = $cantidad_actual - $cantidad_vendida;

$wpdb->update(
    $tabla_producto,
    array( 'cantidad' => $cantidad_final ),
    array( 'id' => $id_producto )
);

Creo que esta opción, aunque un poco menos directa, es más versátil y me permitiría implementar más operaciones encapsulándola en una sola función, ya es cuestión de contexto.

En cualquier caso tienes el código completo en GitHub en forma de plugin para que puedas instalarlo y probarlo en local. Ten cuidado porque aunque está todo hecho dentro del escritorio no tomo todas las medidas de seguridad a la hora de procesar el formulario por simplificar la explicación.

Por cierto que el código incluye algunas otras cositas interesantes que espero poder comentar en próximos artículos.

Y, por último, me encantaría que si se te ocurre otra manera de encararlo me dejaras un comentario para ampliar el artículo y ofrecer una solución más completa.

Foto de cabecera cortesía de Crissy Jarvis en Unsplash

Deja un comentario

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