• // Mostrar el precio de costo en la edición del pedido en el backend
    add_filter( 'woocommerce_order_item_display_meta_value', 'custom_order_item_price', 10, 3 );
    function custom_order_item_price( $display_value, $meta, $order_item ) {
        // obtén el rol del usuario que creó la orden
        $user = get_user_by( 'id', $order_item->get_order()->get_customer_id() );
        $roles = ( array ) $user->roles;
        
        // comprueba si el usuario que creó la orden es mayorista
        if ( in_array( 'mayorista', $roles ) ) {
            // comprueba si el meta es el precio del producto
            if ( '_line_total' == $meta->key ) {
                // obtén el valor del campo personalizado "precio_costo"
                $product_id = $order_item->get_product_id();
                $precio_costo = get_post_meta( $product_id, 'precio_costo', true );
                
                // si hay un valor de "precio_costo", utilízalo como precio en lugar del precio normal
                if ( $precio_costo ) {
                    $display_value = wc_price( $precio_costo );
                }
            }
        }
        return $display_value;
    }

    It doesn’t work, it always puts the normal price, can someone help me?

Viewing 4 replies - 1 through 4 (of 4 total)
  • AddWeb Solution

    (@addweb-solution-pvt-ltd)

    Hi

    I think it’s priority issue, can you please change action priority

    or
    before calling new action first remove default action using “remove_action()”

    Thread Starter JesusSol

    (@jesussol)

    // Remover la acción predeterminada para agregar el precio a la orden
    remove_action( 'woocommerce_before_calculate_totals', 'woocommerce_update_order_item_meta', 10, 1 );
    
    // Agregar la nueva acción para agregar el precio de costo a la orden
    add_action( 'woocommerce_before_calculate_totals', 'custom_update_order_item_meta', 15, 1 );
    function custom_update_order_item_meta( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        // Verifica si el usuario que creó la orden tenía el rol "salones_looks"
        $order_id = $cart->get_order_id();
        $order = wc_get_order( $order_id );
        $user_id = $order->get_user_id();
        $user = get_userdata( $user_id );
        if ( in_array( 'mayorista', (array) $user->roles ) ) {
            // Recorre todos los productos en el carrito
            foreach ( $cart->get_cart() as $item ) {
                $product = $item['data'];
                // Obtiene el precio de costo del producto
                $cost = get_post_meta( $product->get_id(), 'precio_costo', true );
                // Si hay un precio de costo, actualiza el precio del producto en el carrito
                if ( $cost ) {
                    $item['data']->set_price( $cost );
                }
            }
        }
    }

    I tried it with this other code and it doesn’t work either, keep putting the normal price

    Thread Starter JesusSol

    (@jesussol)

    From the front end, the client with the role of wholesaler works perfectly, but when I put the order on pending payment and add an item with the role of administrator or shop manager, that item is set at a normal price.

    // Mostrar el precio de costo en el front end
    function custom_product_price( $price, $product ) {
        // obtén el rol del usuario actual
        $user = wp_get_current_user();
        $roles = ( array ) $user->roles;
        
        // comprueba si el usuario es mayorista
        if ( in_array( 'mayorista', $roles ) ) {
            // obtén el valor del campo personalizado "costo"
            $costo = get_post_meta( $product->get_id(), 'precio_costo', true );
            
            // si hay un valor de "costo", utilízalo como precio en lugar del precio normal
            if ( $costo ) {
                $price = $costo;
            }
        }
        return $price;
    }
    add_filter( 'woocommerce_product_get_price', 'custom_product_price', 10, 2 );
    Moderator bcworkz

    (@bcworkz)

    Administrator or shop manager users do not necessarily have the mayorista role as well. Without it the custom price would not be applied.

    When you add filters that you want to have the final say in the matter, it’s a good idea to always hook with a priority arg larger than the default 10. You can even pass PHP_INT_MAX to be sure nothing else will override your callback.

    If you continue to have difficulty, I recommend asking in WooCommerce’s dedicated support forum where its devs and expert users are in a better position to help you.

Viewing 4 replies - 1 through 4 (of 4 total)
  • The topic ‘I try to add a product in the backend used another price than the normal price’ is closed to new replies.