WP/Woocommerce - bepaalde variaties add to cart onzichtbaar?

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Timmeah
  • Registratie: Maart 2004
  • Laatst online: 09-03 13:17
Heel specifiek verzoekje voor wordpress met WooCommerce. Ik heb daar een plugin toegevoegd voor product offertes, (YITH request a quote).

De request a quote krijg ik netjes onder de producten te zien naast de add to cart knop, echter onder bepaalde productvariaties is het niet handig om de add to cart knop te laten staan.

Heel simpel voorbeeld, als ik een t-shirt heb, kan ik hem in groen in XL direct bestellen met een bepaalde prijs. echter als ik er een tekst op wil, dan is het niet handig om die direct te laten bestellen. Dan wil ik dat dit gebeurd via de offerte knop. De add to cart mag dan onzichtbaar. (of op zijn minst niet aanklikbaar)


Ik heb de volgende code nu, maar die werkt niet, ik begrijp niet helemaal waarom. De slug voor de variatie is in dit geval optioneelpersonliseren, en het specifieke productvariatie is 24-1kleurenbedrukking

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
add_filter( 'woocommerce_variation_is_purchasable', 'conditional_variation_is_purchasable', 20, 2 );
function conditional_variation_is_purchasable( $purchasable, $product ) {



    $taxonomy  = 'optioneelpersonaliseren';
    $term_name =  '24-1kleurenbedrukking';



    $found = false;


    foreach ( $product->get_variation_attributes() as $variation_attribute => $term_slug ){
        $attribute_taxonomy = str_replace('attribute_', '', $variation_attribute); 
        $term = get_term_by( 'slug', $term_slug, $taxonomy ); 

        if($attribute_taxonomy == $taxonomy && $term->name == $term_name ){
            $found = true;
            break;
        }
    }

    if( $found )
        $purchasable = false;

    return $purchasable;
}

[ Voor 6% gewijzigd door Timmeah op 18-04-2018 10:57 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 08-09 14:12
Wat heb je zelf al geprobeerd? Wat is de waarde van $term ?

Full-stack webdeveloper in Groningen


Acties:
  • 0 Henk 'm!

  • dylandejonge
  • Registratie: Mei 2013
  • Laatst online: 06-11-2024

dylandejonge

Online Marketing Stratego

Hoi Timmeah,

Het is wellicht niet de antwoord op je coding vraag...
Maar Is dit wellicht wat voor je? Het bevat custom fields zodat je de tekst direct kan meegeven IPV offertes opvragen..

https://mihajlovicnenad.c...shirt-with-custom-fields/

Tevens zie ik om je:

if( $found )
$purchasable = false;

Geen begin & closing brackets staan. Zo is de uitkomst van deze code altijd false


if( $found ){
$purchasable = false;
}


Ignore the above :)

[ Voor 6% gewijzigd door dylandejonge op 24-04-2018 23:27 ]

Whatever the problem - Be part of the solution


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
dylandejonge schreef op dinsdag 24 april 2018 @ 23:00:
Tevens zie ik om je:

[...]

Geen begin & closing brackets staan.
Dat is ook nergens voor nodig. Of 't netjes is / best practice is is een tweede, maar nodig is 't niet.
dylandejonge schreef op dinsdag 24 april 2018 @ 23:00:
Zo is de uitkomst van deze code altijd false
Onwaar dus ;)
Wat wel een dingetje is: $purchasable heeft in 't geval dat $found naar false evalueert een ongedefinieerde waarde die vervolgens wel gereturned wordt. Ofwel: er is/wordt aan $purchasable geen waarde toegekend wanneer $found false is.

PHP:
1
2
3
4
5
6
7
8
9
10
function Test() {
  $foo = false;

  if ($foo)
    $bar = false;

  return $bar;
}

var_dump(Test());


Notice:  Undefined variable: bar on line 7

NULL

En daar curly-braces omheen zetten verandert niets aan de zaak:

PHP:
1
2
3
  if ($foo) {
    $bar = false;
  }

Dat geeft nog steeds dezelfde foutmelding ;)

Ik heb verder geen idee wat de code moet doen, maar volgens mij kun je:
PHP:
1
2
3
4
5
6
    $found = false;
    //... hier wordt nog e.e.a. met $found gedaan

    if( $found )
        $purchasable = false;
    return $purchasable;

beter schrijven als:
PHP:
1
2
3
4
    $found = false;
    //... hier wordt nog e.e.a. met $found gedaan

    return !$found;

De $purchasable variable is onnodig (hoewel 't wel de intentie / leesbaarheid verbetert). Maar hiermee elimineer je a) een variabele en b) het risico dat deze ongeïnitialiseerd is/blijft.

Alternatief, met extra variabele die in ieder geval altijd geïnitialiseerd wordt:
PHP:
1
2
3
4
5
    $found = false;
    //... hier wordt nog e.e.a. met $found gedaan

    $purchasable = !$found;
    return $purchasable;
Timmeah schreef op woensdag 18 april 2018 @ 10:40:
Ik heb de volgende code nu, maar die werkt niet, ik begrijp niet helemaal waarom.
Definieer "werkt niet"? Welke foutmelding krijg je? Wat gebeurt er wel wat er niet moet gebeuren of wat gebeurt er niet wat er wél moet gebeuren? Heb je al gedebugged (Debuggen: Hoe doe ik dat?) en zo ja: hoe dan? Wat waren je conclusies daar uit?

[ Voor 91% gewijzigd door RobIII op 24-04-2018 23:19 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • jugger naut
  • Registratie: September 2010
  • Laatst online: 16-09 14:14
'Het werkt niet' is nogal vaag. Probeer anders te loggen tot waar jouw functie komt om zo te kijken waar het niet doet wat jij wil.

Acties:
  • 0 Henk 'm!

  • dylandejonge
  • Registratie: Mei 2013
  • Laatst online: 06-11-2024

dylandejonge

Online Marketing Stratego

RobIII schreef op dinsdag 24 april 2018 @ 23:02:
[...]

Dat is ook nergens voor nodig. Of 't netjes is / best practice is is een tweede, maar nodig is 't niet.
Goed om te weten.. Maar dat is het dus in ieder geval niet het probleem 8)7

Mijn eerste tweede ingeving zegt kijk is wat:
$attribute_taxonomy & $term teruggeven in je foreach loop en of dat klopt met de gewenste waardes:

$taxonomy = 'optioneelpersonaliseren';
$term_name = '24-1kleurenbedrukking';

Vervolgens kijk wat found doet.

Ik ben in ieder geval wel benieuwd naar de oplossing man!

Whatever the problem - Be part of the solution


Acties:
  • 0 Henk 'm!

  • Timmeah
  • Registratie: Maart 2004
  • Laatst online: 09-03 13:17
dank voor de reacties allemaal. Mijn project lag even stil en toen had ik in de tussentijd een andere oplossing doorgevoerd voor de time-being zonder code (producten op out-of-stock zetten, zodat add to cart onklikbaar wordt, vervolgens moet je de offerte-knop wel indrukken, met een aanpassing van het label out-of-stock werkt dat eigenlijk ook goed)

maar ga met bovenstaande tips ook aan de gang, dat is wel een mooiere oplossing als ik dat in een childtheme weg kan zetten.

Acties:
  • 0 Henk 'm!

  • dylandejonge
  • Registratie: Mei 2013
  • Laatst online: 06-11-2024

dylandejonge

Online Marketing Stratego

RobIII schreef op dinsdag 24 april 2018 @ 23:02:
[...]

Dat is ook nergens voor nodig. Of 't netjes is / best practice is is een tweede, maar nodig is 't niet.


[...]

Onwaar dus ;)
Wat wel een dingetje is: $purchasable heeft in 't geval dat $found naar false evalueert een ongedefinieerde waarde die vervolgens wel gereturned wordt. Ofwel: er is/wordt aan $purchasable geen waarde toegekend wanneer $found false is.

PHP:
1
2
3
4
5
6
7
8
9
10
function Test() {
  $foo = false;

  if ($foo)
    $bar = false;

  return $bar;
}

var_dump(Test());


Notice:  Undefined variable: bar on line 7

NULL

En daar curly-braces omheen zetten verandert niets aan de zaak:

PHP:
1
2
3
  if ($foo) {
    $bar = false;
  }

Dat geeft nog steeds dezelfde foutmelding ;)

Ik heb verder geen idee wat de code moet doen, maar volgens mij kun je:
PHP:
1
2
3
4
5
6
    $found = false;
    //... hier wordt nog e.e.a. met $found gedaan

    if( $found )
        $purchasable = false;
    return $purchasable;

beter schrijven als:
PHP:
1
2
3
4
    $found = false;
    //... hier wordt nog e.e.a. met $found gedaan

    return !$found;

De $purchasable variable is onnodig (hoewel 't wel de intentie / leesbaarheid verbetert). Maar hiermee elimineer je a) een variabele en b) het risico dat deze ongeïnitialiseerd is/blijft.

Alternatief, met extra variabele die in ieder geval altijd geïnitialiseerd wordt:
PHP:
1
2
3
4
5
    $found = false;
    //... hier wordt nog e.e.a. met $found gedaan

    $purchasable = !$found;
    return $purchasable;



[...]

Definieer "werkt niet"? Welke foutmelding krijg je? Wat gebeurt er wel wat er niet moet gebeuren of wat gebeurt er niet wat er wél moet gebeuren? Heb je al gedebugged (Debuggen: Hoe doe ik dat?) en zo ja: hoe dan? Wat waren je conclusies daar uit?
Een vraag voor jou dan @RobIII (mooi moment voor mij om PHP beter te leren begrijpen) :

Hij doet toch de: add_filter( 'woocommerce_variation_is_purchasable', 'conditional_variation_is_purchasable', 20, 2 );

Dat betekend dat op het moment dat de data_filter actief wordt uitgevoerd door woocommerce; woocommerce_variation_is_purchasable

Geeft hij dan niet de eerste parameter, in dit geval $purchasable, standaard true mee? en kan je door middel van de filter hem manipuleren door false mee te geven?

Eigenlijk net als $product, die krijgt hij ook mee vanuit woocommerce_variation_is_purchasable.. :-)

[ Voor 2% gewijzigd door dylandejonge op 24-04-2018 23:43 . Reden: Beargumentatie edit ]

Whatever the problem - Be part of the solution


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
dylandejonge schreef op dinsdag 24 april 2018 @ 23:37:
Een vraag voor jou dan @RobIII (mooi moment voor mij om PHP beter te leren begrijpen) :
Ik heb geen idee; je vraag heeft namelijk niets met PHP te maken maar met WordPress/Woocommerce en met beide doe ik nooit iets. Dus je zult gewoon, net als iedereen, de documentatie moeten lezen ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • dylandejonge
  • Registratie: Mei 2013
  • Laatst online: 06-11-2024

dylandejonge

Online Marketing Stratego

RobIII schreef op woensdag 25 april 2018 @ 09:11:
[...]

Ik heb geen idee; je vraag heeft namelijk niets met PHP te maken maar met WordPress/Woocommerce en met beide doe ik nooit iets. Dus je zult gewoon, net als iedereen, de documentatie moeten lezen ;)
En toch geef je hierboven een PHP antwoord op een WooCommerce filter gerelateerde vraag en ik probeer daar vervolgens op in te haken ;)

Maar het klopt 100% wat je zegt, de documentatie liegt niet dat lijkt me de beste optie haha! d:)b

Whatever the problem - Be part of the solution


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
dylandejonge schreef op woensdag 25 april 2018 @ 13:03:
En toch geef je hierboven een PHP antwoord op een WooCommerce filter gerelateerde vraag en ik probeer daar vervolgens op in te haken ;)
8)7 Je zegt het zelf: een PHP antwoord. Generieke code (zoals de voorbeelden die ik gaf) en syntax (zoals 't curly braces gedoe) is "gewoon" PHP en kan ik je prima mee helpen. Wat de functies van WP WooCommerce doen weet ik niet want daar weet ik geen zak van en gaf ik dan ook 0 antwoord noch commentaar op. Dus ik weet niet hoe jij tot die conclusie komt... :?

Met "beide" bedoelde ik WP/WooCommerce, niet PHP. Daar weet ik wél e.e.a. van af ;) Misschien dat daar de verwarring zat?

[ Voor 14% gewijzigd door RobIII op 25-04-2018 14:37 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • dylandejonge
  • Registratie: Mei 2013
  • Laatst online: 06-11-2024

dylandejonge

Online Marketing Stratego

RobIII schreef op woensdag 25 april 2018 @ 14:34:
[...]
Wat de functies van WP WooCommerce doen weet ik niet want daar weet ik geen zak van en gaf ik dan ook 0 antwoord noch commentaar op. Dus ik weet niet hoe jij tot die conclusie komt... :?
Wat wel een dingetje is: $purchasable heeft in 't geval dat $found naar false evalueert een ongedefinieerde waarde die vervolgens wel gereturned wordt. Ofwel: er is/wordt aan $purchasable geen waarde toegekend wanneer $found false is."
Daar zit de verwarring (y).

Als ik het in PHP uitleg, i.p.v. WooCommerce / WP snap je dan wel waar mijn comment vandaan komt?

En nogmaals dit is mijn comment:
"Dat $purchasable niet gedefinieerd is is niet erg, aangezien het geen ongedefinieerde waarde is maar, als het goed is, een waarde meekrijgt tijdens de call van de functie. (dat doet tenslotte een filter)

PHP: filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

function Test($purchasable, $product) {
    $found = false;
    if ($product){
        $found = true;
    }
  
  if ($found)
    $purchasable = false;

  return $purchasable;
}

//Simulatie gebruik filter, die called Test met twee parameters, purchasable & Product
$result = Test(true, 'product');
var_dump($result);


bool(false)
 


Het is overigens gaan aanval op je kennis hoor, je bent niet voor niets een mod toch? ;)
Ik ben gewoon nieuwsgierig naar de oplossing.

Whatever the problem - Be part of the solution


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
dylandejonge schreef op woensdag 25 april 2018 @ 16:42:

Het is overigens gaan aanval op je kennis hoor, je bent niet voor niets een mod toch? ;)
Zo zag ik het ook niet :>
En kennis is fijn maar niet echt vereist natuurlijk ;) De meeste mod-taken hebben weinig écht inhoudelijk met techniek te maken ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1