Soporte » Plugins y Hacks » WooCommerce » Eliminar precio en oferta cuando stock cero o negativo

  • Resuelto jcres

    (@jcres)


    Hola todos, agradecería si me pudierais guiar en una necesidad que tengo.

    Necesito que los producto rebajados/en oferta dejen de estarlo y pasen automáticamente a tener su precio normal cuando su stock sea cero o negativo. Permito reservas (queda oculto al cliente, figurando como en stock) por lo que el stock puede ser negativo.

    Entiendo que es una función básica cuando tienes que dar salida rápida a productos con fecha de caducidad cercana o que su adquisición fue más barata pero necesitas automatizarlo.

    Sólo he encontrado un plugin de pago en internet que haga esto pero la página no da mucha confianza y no veo referencias.

    Vi este código que publicó una persona hace un año en Stackoverflow pero no me funciona:

    function remove_sale_price ( $order_id ) { 
        $order = new WC_Order( $order_id );
        foreach ( $order->get_items() as $item_id => $item ) {
            $prod_id  = $item->get_product_id();
            $name     = $item->get_name();
            $product  = wc_get_product($prod_id);
            if ($product->is_type( 'variable' )) {
                $prod_idv  = $item->get_variation_id();
                $product   = wc_get_product($prod_idv);
            }
            $quantity = $product->get_stock_quantity();
            $note     = 'Removed sale price on <b>«' . $name . '»</b>.';
            if ( $quantity < 1 ) {
                $order->add_order_note( $note );
                $product->set_sale_price('');
                $product->save();
            }
        }
    }
    add_action( 'woocommerce_order_status_processing', 'remove_sale_price' );
    add_action( 'woocommerce_order_status_completed', 'remove_sale_price' );

    Agradecería si me pudierais decir algún algún plugin gratuito o de pago o echar un ojo al código cómo lo veis.
    Gracias.

    Saludos

Viendo 5 respuestas - de la 1 a la 5 (de un total de 5)
  • Moderador Jose Luis

    (@jose64)

    Hola.

    Bienvenido al foro de soporte. El código que publicas es para hacerlo en el pedido, no en la página de producto. Prueba este otro código:

    add_filter('woocommerce_get_price_html', 'change_in_stock_product_price_html', 100, 2 );
    function change_in_stock_product_price_html( $price_html, $product ) {
        if ( ! $product->is_in_stock() ) {
            $regular_price = wc_price($product->get_regular_price());
            $price_html = __($regular_price, "woocommerce");
        }
        return $price_html;
    }

    Está basado en:

    Woocommerce How to replace the sale price of out of stock products but keep the Regular price?

    Puedes seguir adaptándolo a tus necesidades usando otros condicionales:

    WooCommerce Conditional Logic – Tags, Examples & PHP

    Recuerda marcar el debate como resuelto, así nos ayudas a mantener el foro al día.

    Iniciador del debate jcres

    (@jcres)

    Muchas gracias por la rápida respuesta Jose Luis. El problema es que como comentaba permito reservas (no es visible que es una reserva de cara al cliente), por las pruebas que he hecho, parece que el código que propones no funciona en ese caso, pues el producto ya no lo considera sin stock si permite seguir comprándolo.

    Necesito permitir reservas para seguir vendiendo con normalidad pero ya sin rebaja porque serían productos que no están en stock. En el código que puse, habían puesto la condición cuando el stock es menor que 1 (es decir, cero y negativos), por lo que incluye así a los que permiten reserva que sería un stock negativo. Pero no funciona.

    Mis conocimientos son nulos en programación, no he conseguido ver en la página de condicionales ninguno relativo a cantidad.

    Gracias de nuevo

    Iniciador del debate jcres

    (@jcres)

    Gran fallo mío, estuve probando los códigos usando como método de pago la transferencia bancaria (que no uso en producción). Me quedaban en estado pendiente de pago los pedidos de prueba y me despisté pensando que el estado era en proceso. El código primero que puse funciona cuando el pedido está en proceso o completado.

    Resumiendo, que funciona el código que puse si permites reservar o comprar aun no habiendo stock y se activará cuando un nuevo pedido agote el stock del producto comprado. Y funciona el código de Jose Luis, que no requiere tener un pedido nuevo pero no es compatible tal cual si permites reservas.

    Gracias de nuevo
    Saludos

    Moderador Jose Luis

    (@jose64)

    Hola @jcres

    Efectivamente, al usar $product->is_in_stock() se verifica que el producto se pueda vender, habría que modificar el código y usar el inventario real, aquí te dejo el código modificado:

    add_filter('woocommerce_get_price_html', 'change_in_stock_product_price_html', 100, 2 );
    function change_in_stock_product_price_html( $price_html, $product ) {
        $quantity = $product->get_stock_quantity();
        if ( $quantity < 1 ) {
            $regular_price = wc_price($product->get_regular_price());
            $price_html = __($regular_price, "woocommerce");
        }
        return $price_html;
    }
    Iniciador del debate jcres

    (@jcres)

    Muchísimas gracias Jose Luis.
    Saludos

Viendo 5 respuestas - de la 1 a la 5 (de un total de 5)
  • Debes estar registrado para responder a este debate.