Jump to content

Informação no carrinho (Woocommerce) baseado no estado de stock


TeeAlves

Recommended Posts

Bom dia, 

Precisava da vossa preciosa ajuda, dado que já são alguns dias a tentar e não estou a conseguir chegar à conclusão pretendida 😄

Ora, basicamente temos uma loja online e gostaria de modificar a label por baixo do método de envio (hook: woocommerce_cart_shipping_method_full_label) baseado no estado de stock dos produtos existentes no carrinho.

 

Basicamente, caso exista 1 produto que o estado de stock seja "por encomenda" então a label do método de envio 1 = "48/72h" e a label do método de envio 2 = "48/72h".

Caso exista 1 produto que seja "stock limitado" então label do método de envio 1 = "24/48h" e a label do método de envio 2 = "48/72h".

Caso contrário (isto é, todos os produtos estejam "em stock") a label = ""Envio até às 16h".

 

A minha tentativa mais próxima deu nisto : (mas ele verifica em cada produto, ou seja, adiciona uma label tantas vezes quantas o número de produtos do carrinho)

<?php
add_filter( 'woocommerce_cart_item_name', 'custom_text_based_status_name', 10, 3 );
function custom_text_based_status_name( $item_name, $cart_item, $cart_item_key ) {
    if( ! ( is_checkout() ) )
        return $item_name;
    $shipping_class_1 = 'onbackorder';
    $shipping_class   = $cart_item['data']->get_stock_status();
    if( $shipping_class === $shipping_class_1 ) {
        add_filter( 'woocommerce_cart_shipping_method_full_label', 'custom_shipping_methods_label', 10, 2 ); 
        function custom_shipping_methods_label( $label, $method ) { 
               switch ( $method->id ) {
                case 'fish_n_ships:62': //Portugal Continental - Transportadora
                    $txt = __('Expedição estimada: 24 a 48h úteis'); // <= Additional text
                    break;
                   case 'fish_n_ships:63': //Portugal Continental - Gratuito
                    $txt =  __('Expedição estimada: 72 a 96h úteis'); // <= Additional text
                       break;
                default: //nos restantes casos
                    $txt =  __('Confirmaremos assim que possível'); // <= Additional text
            }
           return $label . '<br /><small style="color:#777777">' . $txt . '</small>';
        }
    }    
    return $item_name; 
}

Já faz dias que ando de volta disto a tentar e sem solução à vista. Alguém pode ajudar? Obrigado 😃

Link to comment
Share on other sites

Não conheço o Woocommerce, mas parece-me um pouco estranho que tenhas um add_filter dentro de outro (e possivelmente é o que faz teres várias labels, pois é chamado para cada item).

Assumo que o teu problema seja teres acesso ao valor de $shipping_class.  Talvez consigas usar uma variável global?  Isto não é uma boa prática, e penso que só funcionará se os hooks de woocommerce_cart_item_name forem executados antes do hooks de woocommerce_cart_shipping_method_full_label, mas podes tentar.

Na tua solução actual, talvez consigas resolver o problema verificando o valor de $label (estou a assumir que os múltiplos valores estão a ser sucessivamente concatenados nessa variável, pelo que verificando se a variável já contém o conteúdo que pretendes, podes evitar duplicá-lo).

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.