Goedemiddag,

Ik maak gebruik van deze query


SELECT * 
FROM wp_posts p
LEFT JOIN wp_postmeta pm ON (pm.post_id = p.ID AND pm.meta_key = '_sku')
WHERE p.post_title LIKE '%rad%' 
OR IF(pm.meta_value IS NULL, 0, pm.meta_value LIKE '%rad%')



<?php
	echo $row['post_title'];
	echo $row['meta_value'];
?>


wp_posts
[table]
[tr][td]ID[/td][td]post_title[/td][/tr]
[tr][td]1[/td][td]radio[/td][/tr]
[tr][td]2[/td][td]televisie[/td][/tr]
[/table]

wp_postmeta
[table]
[tr][td]meta_id[/td][td]post_id[/td][td]meta_key[/td][td]meta_value[/td][/tr]
[tr][td]1[/td][td]1[/td][td]price[/td][td]12.50[/td][/tr]
[tr][td]2[/td][td]1[/td][td]_sku[/td][td]5876gh7[/td][/tr]
[tr][td]3[/td][td]1[/td][td]thumb_id[/td][td]56[/td][/tr]
[tr][td]4[/td][td]2[/td][td]price[/td][td]342.50[/td][/tr]
[tr][td]5[/td][td]2[/td][td]_sku[/td][td]tv784[/td][/tr]
[tr][td]6[/td][td]2[/td][td]thumb_id[/td][td]78[/td][/tr]
[/table]


Met deze query zoek ik in de post_title en in de meta_value kolom als kolom meta_key de waarde _sku bevat.
Zo kan ik zoeken op naam en artikelnummer.

De query zoals hierboven geeft als resultaat
- Radio
- 5876gh7

Maar ik wil ook de price en de thumb_id hebben uit de kolom meta_value.
Als ik het rood gemarkeerde weghaal
LEFT JOIN wp_postmeta pm ON [color="#ff0000"]([/color]pm.post_id = p.ID [color="#ff0000"]AND pm.meta_key = '_sku')[/color] krijg ik alle meta_values terug maar dan word er ook in alle meta_values gezocht wat alleen mag als de meta_key _sku is.

Wat dien ik aan te passen in mijn query?
@adoptive Solutions,


Deze had ik al geprobeerd opzich krijg ik het dan inderdaad in een array maar dan zit ik weer met die dubbele post_title.
Je kunt de subarrays aan het wp_posts ID hangen.

Als je mijn aanpak gebruikte met de "dubbele data" in de records, kun je dit heel eenvoudig doen:

<?php
$data = array();
$query = '...'; // mijn eerdere query
$res = $db->query($query);
while ($row = $res->fetch_assoc()) {
    // indien het subarray nog niet bestaat, maak deze aan
    if (false === isset($data[$row['ID']])) {
        // kopieer wp_posts specifieke data eenmalig bij creatie subarray
        $data[$row['ID']] = array(
            'id' => $row['ID'],
            'post_title' => $row['post_title'],
        );
    }
    // nu kun je zonder zorgen alle overige key-value paren aan dit subarray toevoegen
    // de isset-controle garandeert immers dat dit subarray bestaat
    $data[$row['ID']][$row['meta_key']] = $row['meta_value'];
}
?>
Hi Thomas,


Deze code werkt inderdaad prima. Echter heb ik nog een vraag.

In de kolom meta_key word per artikel nog een record aangemaakt met manage_stock en stock met in de meta_value de waarde yes voor manage_stock en een aantal voor stock.

[table]
[tr][td]meta_id[/td][td]post_id[/td][td]meta_key[/td][td]meta_value[/td][/tr]
[tr][td]1[/td][td]1[/td][td]price[/td][td]12.50[/td][/tr]
[tr][td]2[/td][td]1[/td][td]_sku[/td][td]5876gh7[/td][/tr]
[tr][td]3[/td][td]1[/td][td]thumb_id[/td][td]56[/td][/tr]
[tr][td]4[/td][td]1[/td][td]manage_stock[/td][td]yes[/td][/tr]
[tr][td]5[/td][td]1[/td][td]stock[/td][td]5[/td][/tr]
[tr][td]6[/td][td]2[/td][td]price[/td][td]342.50[/td][/tr]
[tr][td]7[/td][td]2[/td][td]_sku[/td][td]tv784[/td][/tr]
[tr][td]8[/td][td]2[/td][td]thumb_id[/td][td]78[/td][/tr]
[tr][td]9[/td][td]2[/td][td]stock[/td][td]10[/td][/tr]
[tr][td]10[/td][td]2[/td][td]manage_Stock[/td][td] yes[/td][/tr]
[/table]

Als de record meta_key -> manage_stock meta_value-> yes is dan voeg de record meta_key -> stock de waarde van meta_value toe.
Omdat het systeem de ene keer de record manage_stock boven de record stock zet en de ene keer andersom dus de stock boven de manage stock zet kan ik dit niet oplossen met een if statement in de loop zoals ik onderstaand heb geprobeerd.

<?php
while($row = mysqli_fetch_assoc($result)){
	if (false === isset($data[$row['ID']])) {
		$data[$row['ID']] = array(
        	'id' 			=> $row['ID'],
            'post_title' 	=> $row['post_title'],
            'price'			=> '-',
            'stock'			=> 'geen voorraad'
        );
        
	}
	
	if($row['meta_key'] == '_price' ){
		if($row['meta_value'] !== ''){	
   			$data[$row['ID']]['price']	 = $row['meta_value'];
   		}else{
   			$data[$row['ID']]['price'] = '-';
   		}
    }
    
    if($row['meta_key'] == '_stock_status' ){
    	$data[$row['ID']]['stock_status'] = $row['meta_value'];
    }
    
     if($row['meta_key'] == '_manage_stock' ){
     	if($row['meta_value'] == 'yes'){
     		if($row['meta_key'] == '_stock' ){
     			$data[$row['ID']]['stock'] = $row['meta_value'];
     		}
     	}	
     }
}
?>


Moet ik dan nog een andere hulp array maken of nog een losse query om dit voor elkaar te krijgen?

Nee? Intruceer gewoon twee velden (manage_stock (default false), stock (default 0)) en vul beide in als de records voorbij komen. Voeg vervolgens wat logica toe om de juiste informatie weer te geven, op grond van de uiteindelijke waarden van manage_stock en stock.

Overigens, dit:
<?php
if($row['meta_key'] == '_price' ){
    if($row['meta_value'] !== ''){    
        $data[$row['ID']]['price']     = $row['meta_value'];
    }else{
        $data[$row['ID']]['price'] = '-';
    }
}
?>

Is toch niet nodig? Overschrijf de default alleen als dat nodig is:
<?php
if ($row['meta_key'] == '_price' && $row['meta_value'] !== '') {
    $data[$row['ID']]['price'] = $row['meta_value'];
}
?>

Houd het simpel.
Duidelijk Thomas,


Maar als ik de manage_stock default op false heb staan en de record met stock word eerder geladen dan moet ik deze dan ergens in een variable zetten en als de manage_stock record is gelezen en yes is toevoegen aan array?


<?php
if($row['meta_key'] == '_manage_stock' ){
         if($row['meta_value'] == 'yes'){
             if($row['meta_key'] == '_stock' ){
                 $data[$row['ID']]['stock'] = $row['meta_value'];
             }
         }    
     }
?>

Deze code zal van de bovenstaande table alleen werken op post_id 1 en niet op post_id 2
Bryan De Baar op 03/06/2020 00:59:43
Duidelijk Thomas,

Nou ja, niet helemaal dus :p.

Bryan De Baar op 03/06/2020 00:59:43
Maar als ik de manage_stock default op false heb staan en de record met stock word eerder geladen dan moet ik deze dan ergens in een variable zetten en als de manage_stock record is gelezen en yes is toevoegen aan array?

Dat is precies wat ik in mijn vorige reactie voorstelde. Sla in plaats van "yes" simpelweg true op.

Als daar dan het moment is om stock weer te geven inspecteer je eerste manage_stock:
<?php
$stock = $whatever[$productId]['manage_stock'] ? $whatever[$productId]['stock'] : 'niet op voorraad';
?>

Of wat voor logica van toepassing is, ik weet niet onder welke voorwaarden je wat wilt weergeven.

Je zou dit alles ook generieker kunnen maken door een whitelist op te stellen voor de meta_keys waarin je geinteresseerd bent, en hier vervolgens ook "vertaalregels" aan kunnen hangen om de informatie nog wat te ordenen voordat je dit intern in een hulparray opslaat.
Hi Bryan,


Als je nu eerst een variabel aanmaakt voor _stock en _manage_stock en vervolgens een if statement toepast op deze?

<?php
while($row = mysqli_fetch_assoc($result)){	
	if (false === isset($data[$row['ID']])) {
//we zetten manage_stock (ms_on) op no als defautl
		$ms_on = 'no';
		$data[$row['ID']] = array(
        	'id' 			=> $row['ID'],
            'post_title' 	=> $row['post_title'],
            'price'			=> '-',
//stock zetten we op 0 als default
            'stock'			=> '0',
        );    
    }
        
		if ($row['meta_key'] == '_price' && $row['meta_value'] !== '') {
    		$data[$row['ID']]['price'] = $row['meta_value'];
		}
		
//we slaan de meta_value van stock op in een variabel
		if ($row['meta_key'] == '_stock' && $row['meta_value'] !== '') {
    		$stock = $row['meta_value'];
		}
//we slaan de meta_value van _manage_stock op in een variable
		if ($row['meta_key'] == '_manage_stock' && $row['meta_value'] !== '') {
    		$ms_on = $row['meta_value'];
		}
//omdat beide variables nu gevuld zijn door de default of zijn overschreven door je resultaten kunnen we nu een if statement maken en dan stock in de array zetten	
		if($ms_on == 'yes'){
			$data[$row['ID']]['stock'] = $stock;
		}	
}
?>
Of je regelt dit gewoon ergens anders? Code wordt onwijs wollig op deze manier.

Gebruik (ook) op zijn minst Boolse waarden in plaats van een variabele met waarden als 'yes' en 'no' alsjeblieft, dit type bestaat niet voor niets...
Bedankt voor jullie reacties.

@Jop dit werkt inderdaad :)

@Thomas helaas hanteert dit systeem de waarde yes ipv true. Ik ben dus gebonden aan yes.
Ik bedoel de variabele die je zelf definieert. Er is geen enkele reden om (in je interne administratie) die stompzinnige waarden aan te houden.

Reageren