• Opgelost famouswolluf

    (@famouswolluf)


    Via pre_get_posts breid ik de query uit met filters.
    Om bepaalde redenen heb ik ook zelf de prijs filter gemaakt.

    De code die ik hiervoor gebruik:

    $minprice = 0;
    $maxprice = 0;
    if ( isset( $_GET['min_price'] ) && $_GET['min_price'] > 0 ) $minprice = $_GET['min_price'];
    if ( isset( $_GET['max_price'] ) && $_GET['max_price'] > 0 ) $maxprice = $_GET['max_price'];
    
    if ( $minprice > 0 || $maxprice > 0 ) {
    	$compare = '=';
    	$metavalue = '';
    	if ( $minprice > 0 && $maxprice > 0 ) { $compare = 'between'; $metavalue = array( $minprice, $maxprice ); }
    	if ( $minprice > 0 && $maxprice <= 0 ) { $compare = '>='; $metavalue = $minprice; }
    	if ( $maxprice > 0 && $minprice <= 0 ) { $compare = '<='; $metavalue = $maxprice; }
    
    	$query->set( 'meta_key', 'price' );
    	$query->set( 'meta_value', $metavalue );
    	$query->set( 'meta_compare', $compare );
    }

    Echter het grote probleem is dat als ik een min_price opgeef van 10 ik ook alles krijg van 2 etc omdat WordPress dit als een string vergelijkt.
    Hoe krijg ik het voorelkaar dat het numeriek vergeleken wordt?

2 reacties aan het bekijken - 1 tot 2 (van in totaal 2)
  • Thread starter famouswolluf

    (@famouswolluf)

    Ik ben nu iets verder ik heb namelijk de volgende regel toegevoegd:
    $query->set( 'meta_type', 'decimal' );

    Echter als ik nu minprice op 10 zet en maxprice op 20
    Krijg ik ook resultaten als 9,86 en 20,30
    Maar deze 2 horen er uiteraard niet bij.

    Zet ik hem op 10.50 tot 20 dan verdwijnt wel alles voor 10,50 zoals het moet maar die van 20,30 verdwijnt niet.

    Thread starter famouswolluf

    (@famouswolluf)

    Ik heb de oplossing gevonden:
    Het is (oude) mysql bug: https://bugs.mysql.com/bug.php?id=61691

    Ik heb de regel verandert naar:
    $query->set( 'meta_type', 'DECIMAL(20,2)' );

2 reacties aan het bekijken - 1 tot 2 (van in totaal 2)
  • Het onderwerp ‘Producten filteren op prijs’ is gesloten voor nieuwe reacties.