WooCommerce - Cantidad fija de un producto
Estoy intentando lograr algo en WooCommerce sobre lo que no encuentro información. Es el siguiente escenario:
Vendo tornillos y tengo 1500 en stock. Me gustaría que el cliente pueda elegir entre comprar 10, 30, 50 y 100 tornillos en una lista desplegable. El precio por tornillo es menor cuando compras 100 comparado con 10, 30, etc.
Esto funciona como quiero usando atributos de producto y variaciones. PERO el stock no se afecta como quiero ya que el sistema piensa que es un paquete de 100 tornillos y por lo tanto reduce el stock en 1.
Estoy pensando en modificar el archivo class-wc-product-variation.php
que contiene el siguiente código:
function reduce_stock( $by=1 ) {
global $woocommerce;
if ( $this->variation_has_stock ) {
if ( $this->managing_stock() ) {
$this->stock = $this->stock - $by;
$this->total_stock = $this->total_stock - $by;
update_post_meta( $this->variation_id, '_stock', $this->stock );
$woocommerce->clear_product_transients( $this->id ); // Limpiar transitorios
// Verificar atributo de agotado del producto padre
if ( ! $this->is_in_stock() ) {
// Verificar producto padre
$parent_product = new WC_Product( $this->id );
// Solo continuar si el padre no permite pedidos pendientes
if ( ! $parent_product->backorders_allowed() && $parent_product->get_total_stock() <= 0 ) {
update_post_meta( $this->id, '_stock_status', 'outofstock' );
}
}
return $this->stock;
}
} else {
return parent::reduce_stock( $by );
}
}
Estoy intentando establecer $by
con el nombre de la variación del producto (10, 30, 50, 100) pero no soy muy bueno en PHP. He intentado recopilar algo de código relevante (al menos eso creo) y unirlo en la siguiente función:
function new_reduce_by () {
// Obtener el nombre de la variación
$this->variation_data[$name] = $attrvalue[0];
// Extraer solo los números (algunos atributos pueden terminar en "gramos" etc.)
preg_match_all('!\d+!', $attrvalue[0], $modified_attrvalue);
// Convertir el array a una variable
$custom_reduce_value = implode(' ', $modified_attrvalue[0]);
// Retornar el nombre (valor) de la variación
return $custom_reduce_value;
}
He intentado llamar esta función de diferentes maneras pero sin éxito, supongo que el código anterior no es correcto.
¿Debería funcionar el código anterior? Si es así, ¿cómo llamo a la función de la mejor manera? Sé que no puedes llamar una función cambiando $by=1
, necesitas pasar un valor o variable.
¿O debería resolver esto de otra manera?
¡Muchas gracias!
Quizás deberías reconsiderar tu enfoque aquí, a primera vista me parece que podrías simplificar mucho esto usando un hook después de que el pedido sea procesado.
Si todas tus variaciones son realmente solo cantidades, entonces tiene sentido que cuando se complete un pedido actualices las cantidades para el producto padre y cada una de las variaciones para que todas reflejen el mismo conteo de inventario.
Así que al procesar el pedido tienes el ID del padre y los IDs de las variaciones dentro del $product y simplemente puedes actualizar los valores de cantidad para cada uno dentro del bucle.
No recuerdo el hook correcto de memoria, pero puedes encontrar la documentación de WooCommerce en http://wcdocs.woothemes.com/apidocs/index.html y http://wcdocs.woothemes.com/codex/extending/hooks/

Tienes razón, olvidé por completo que podía usar hooks para esto. El problema ahora sin embargo es cómo obtener realmente la variación y modificar el balance de stock. No logro encontrar el código apropiado y como mi conocimiento de PHP no es tan bueno, no puedo escribir mi propio código desde cero. El código que publiqué en mi pregunta no funciona. Supongo que es porque primero tengo que obtener los productos. He intentado: $order = new WC_Order( $order_id );
$items = $order_info->get_items();
Pero no sé cómo proceder.

Echa un vistazo a http://wcdocs.woothemes.com/category/snippets/ quizás encuentres algún código allí.

Puedes utilizar este plugin: http://wordpress.org/support/plugin/woocommerce-incremental-product-quantities
en conjunto con este plugin: https://wordpress.org/plugins/woocommerce-bulk-discount/
El plugin Advanced Product Quantities te permitirá establecer cantidades mínimas así como definir un valor de paso para incrementos de cantidad. Lo único es que, en tu situación, vas de 10, 30, 50, 100 - esto no sigue una regla de incremento por paso. Así que si puedes modificar tus conjuntos de cantidad a, digamos, conjuntos de 10 o 25, entonces este plugin será la solución.
El plugin Bulk Discounts te permitirá crear reglas de descuento en porcentaje de forma global o por producto.

Por favor, proporciona algunos detalles sobre cómo exactamente el producto referenciado aborda la pregunta y sería bueno incluir un enlace (normalmente hay mucha información con nombres similares). Además, no estoy seguro si estás hablando de tu propio producto (a juzgar por tus detalles) y, de ser así, por favor revela también la afiliación.
