Support » Code oplossingen gezocht » Minimaal gewicht uit specifieke category

  • Goedemorgen,

    Ik wil graag een extra conditie inbouwen voordat er afgerekend kan worden binnen Woocommerce.

    Een klant van mij verkoopt o.a. diepvries voer. Echter moet er minimaal voor 4 kg besteld worden voordat er kan worden afgerekend.

    In principe zou dit scriptje moeten werken maar toch lijkt deze niet te werken. Via UXthemes geven ze het advies om een Child theme aan te maken of codefragmenten te gebruiken. Hierbij heb ik voor de laatste optie gekozen (direct in de functions.php werkt ook niet)

    De producten vallen allemaal onder de categorie: diepvries-voer
    Thema: Flatsome

    Iemand enig idee waarom Woocommerce mijn script negeert?

    function cldws_set_weight_requirements() {
        // Only on cart and check out pages
        if( ! ( is_cart() || is_checkout() ) ) return;
    
        /* SETTINGS */
    
        // The minimum weight
        $minimum_weight = 4; // 4 kg
    
        // Set term (category)
        $term = 'diepvries-voer';
    
        /* END SETTINGS */
    
        // Set variable
        $found = false;
    
        // Total weight
        $total_weight = 0;
    
        // Loop through cart items        
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {        
            // Product id
            $product_id = $cart_item['product_id'];
    
            // Quantity
            $product_quantity = $cart_item['quantity'];
    
            // Get weight
            $product_weight = $cart_item['data']->get_weight();
    
            // NOT empty & has certain category
            if ( ! empty( $product_weight ) && has_term( $term, 'product_cat', $product_id ) ) {
                // The shopping cart contains a product of the specific category
                $found = true;
    
                // Calculate
                $total_weight += $product_quantity * $product_weight;
            }
        }
    
        // If the total weight is less than the minimum and there is a item in the cart from a specific category
        if( $total_weight < $minimum_weight && $found ) {
            // Displays a dynamic error warning
            wc_add_notice( sprintf(
                'The minimum weight for the "%s" category is %s, you currently have %s',
                $term,
                wc_format_weight($minimum_weight),
                wc_format_weight($total_weight)
            ), 'error' );
    
            // Removing the proceed button, until the condition is met
            remove_action( 'woocommerce_proceed_to_checkout','woocommerce_button_proceed_to_checkout', 20);
        }
    }
    add_action( 'woocommerce_check_cart_items', 'cldws_set_weight_requirements' );
11 reacties aan het bekijken - 1 tot 11 (van in totaal 11)
  • Hoi,

    Ik heb een iets eenvoudiger functie gevonden en aangepast voor je, eentje die sowieso wel werkt. Ook in bestand functions van je child thema toevoegen.

    
    function checkout_required_min_weight() {
    	// Only on Cart or Checkout page
    	if( ! ( is_cart() || is_checkout() ) ) return;
    
    	// Set the minimum weight
    	$minimum_weight = 4; // 4 kg
    
    	// Get total Cart weight
    	$total_weight = WC()->cart->get_cart_contents_weight();
    
    	// If total weight is lower than minimum, we avoid checkout and display an error notice
    	if( $total_weight < $minimum_weight  ) {
    		// Display an dynamic error notice
    		wc_add_notice( sprintf(
    			'The minimum weight is %s.<br>You currently have %s.',
    			wc_format_weight($minimum_weight),
    			wc_format_weight($total_weight)
    		), 'error' );
    		remove_action( 'woocommerce_proceed_to_checkout','woocommerce_button_proceed_to_checkout', 20);
    	}
    }
    add_action( 'woocommerce_check_cart_items', 'checkout_required_min_weight' );
    

    Guido

    Thread starter Deleur

    (@deleur)

    Hoi Guido,

    Bedankt voor je reactie. Ik zie alleen dat er niet wordt gecontroleerd op de categorie waarvoor deze conditie geldt.

    Misschien heb ik het wat onduidelijk verwoord. De klant heeft dus meerdere categorieën en er moet alleen een check komen op het gewicht in de categorie diepvries-voer (slug). Als een klant dus 500 gram diepvries voer besteld, bovenop zijn reguliere bestelling dan moet er een melding verschijnen dat het gewicht van diepvriesproducten niet voldoende is om de bestelling af te kunnen ronden.

    p.s.
    Ik heb je scriptje wel getest middels codefragmenten. Als ik een product van 500 gram in mijn winkelmandje gooi dan kan ik nog steeds gewoon afrekenen.

    Eigenlijk hetzelfde als met het vorige script, lijkt het erop alsof het script genegeerd wordt.

    Hoi,

    Je hebt gelijk, ik was even te snel met reageren. De categorie vergeten. Mijn script werkt overigens wel.

    Even opnieuw naar jouw script gekeken. In jouw script zit 1 kleine foutje, waardoor het hele script niet werkt:

    Dit:

    
    $total_weight += $product_quantity * $product_weight;
    

    Moet zijn:

    
    $total_weight = $product_quantity * $product_weight;
    

    Tijdens maken van de “code snippet” met de plugin Codefragmenten, moet je eronder “Alleen uitvoeren op de website” aanvinken.

    Guido

    Thread starter Deleur

    (@deleur)

    Hoi Guido,

    Scherp opgemerkt, had ik niet gezien.
    Echter krijg ik het nog steeds niet werkend. Het script is toegevoegd, uitgevoerd alleen op de website, maar de controle wordt niet uitgevoerd.

    Caching al uitgeschakeld maar dit had ook geen effect.
    Zou jij het eens kunnen/willen testen aan jouw kant? De site staat gewoon live namelijk.

    Website

    Hoi,

    Wat me direct opvalt is dat je het gewicht in gram weergeeft, niet in kg. Dus ik denk dat het daar aan ligt.

    Guido

    Thread starter Deleur

    (@deleur)

    Thanks Guido, dat was het euvel inderdaad. Ik had wat gespeeld met deze instellingen en de waarde in Woocommerce kwam inderdaad niet overeen met het script.

    Echter heeft mijn klant nu wel een goed punt. De diepvries producten kunnen pas verzonden worden vanaf 4 kg (4000 gram in mijn geval) maar afhalen zou gewoon moeten kunnen. Op dit moment wordt dus de gehele button uitgeschakeld om de order af te ronden. Hierdoor moet de klant ook minimaal voor 4 kg bestellen als hij zijn bestelling wilt afhalen.

    Guido

    (@guido07111975)

    Hoi,

    Je kunt op zich met wat extra code de button zichtbaar maken als verzending 0 euro is (afhalen). Hiervoor kan ik via de functie WC()->cart het bedrag aan verzendkosten opvragen. Maar dan is de error notificatie zeker ook niet nodig?

    Guido

    Thread starter Deleur

    (@deleur)

    De errornotificatie is eigenlijk wel goed, maar het liefst zou ik deze dan willen tonen op de checkout pagina en niet in de winkelmand zelf. Vanuit de winkelmand weet je namelijk nog niet of de klant zijn producten wilt afhalen of laten verzenden.

    De meeste ideale situatie lijkt mij:

    1. Klant heeft producten toegevoegd aan zijn winkelmand, waaronder 3 kg diepvriesvoer
    2. Klant bekijkt zijn winkelmand en klikt op ‘doorgaan naar afrekenen’
    3. Klant komt op de checkout pagina terecht waarop de check wordt gedaan of er voor minimaal 4 kg aan diepvriesproducten in de order zit.

    Indien dit niet het geval is dan moet alleen de verzendmethode ‘afhalen’ beschikbaar zijn en een melding verschijnen dat de bestelling minimaal 4 kg diepvries voer moet bevatten om te kunnen verzenden.

    Voldoet de klant wel aan de voorwaarde dan is er, vanzelfsprekend, geen probleem om de bestelling te kunnen verzenden.

    Mijn php kennis gaat dit helaas te boven.

    Guido

    (@guido07111975)

    Hoi,

    De bestaande code snippet aanpassen lukt me, maar wat jij wilt is zeker niet haalbaar met deze snippet.

    Ik stel voor om een plugin hiervoor te gaan gebruiken, zoals bijvoorbeeld Table Rate for WooCommerce. Zelf geen ervaring hier mee, maar er zijn nog veel meer plugins op dit gebied.

    Guido

    Thread starter Deleur

    (@deleur)

    Hoi Guido,

    Helaas krijg ik de wenselijke situatie ook niet voor elkaar met een plugin (o.a. Table Rate for Woocommerce).

    Ik denk dat ik toch maar verder ga met de huidige snippet. In principe is het van belang dat klanten onder de 4 kg diepvries voer, wel moeten kunnen afhalen.

    Zou het mogelijk zijn om met de huidige snippet de check op de winkelmand uit te schakelen en deze alleen te doen bij de checkout van de bestelling?

    Dus iets in de trant van:

    1. klant heeft 3 kg diepvries voer in zijn winkelmand
    2. Op de checkout pagina wordt de check gedaan of er minimaal 4 kg diepvriesvoer is besteld.
    3. Indien minder dan 4 kg dan mag er direct een melding verschijnen zoals dat nu ook gebeurt en zou verzending boven de €0 euro moeten worden uitgeschakeld tot er aan de voorwaarde van 4 kg is voldaan.

    Op deze manier zou afhalen dus actief blijven voor de klant.
    Indien het wel mogelijk is maar waar behoorlijk wat werk in zit, dan ga ik wel even op zoek naar een freelance programmeur die hier iets voor kan maken.

    In ieder geval bedankt voor de snelle reacties en input.

    Perry

    Guido

    (@guido07111975)

    Hoi Perry,

    Daarvoor moet een geheel nieuw stukje code voor geschreven worden. Vrij specifiek.
    Kwam de WooCommerce Weight Based Shipping plugin ook nog tegen, kun je eens proberen.

    Guido

11 reacties aan het bekijken - 1 tot 11 (van in totaal 11)