8722 sujets

Développement web côté serveur, CMS

Bonjour

J'ai créé un formulaire de recherche :
<form class="inte-rech" method="post" action="<?php echo get_permalink(500); ?>">
	<input type="text" name="localisation" id="localisation" value="" placeholder="Ville, code postal" />
	<select name="budget" id="budget" class="custom-select">
		<option value="0">Indiférent</option>
		<option value="10000">Moins de 15 000 €</option>
		<option value="15000">De 15 000 à 20 000 €</option>
		<option value="20000">De 20 000 à 25 000 €</option>
		<option value="25000">De 25 000 à 30 000 €</option>
		<option value="30000">De 30 000 à 35 000 €</option>
		<option value="35000">De 35 000 à 40 000 €</option>
		<option value="40000">De 40 000 à 45 000 €</option>
		<option value="45000">45 000 € et plus</option>
	</select>
	<select name="surface" id="surface" class="custom-select">
		<option value="0">Indiférent</option>
		<option value="200">Moins de 300 m&sup2;</option>
		<option value="300">De 300 à 600 m&sup2;</option>
		<option value="600">De 600 à 1000 m&sup2;</option>
		<option value="1000">Plus de 1000 m&sup2;</option>
	</select>
</form><!-- .inte-rech -->


Ce formulaire renvoi vers une page "résultat de la recherche" et dans cette page je dois afficher la liste des maisons correspondante aux critère de ma recherche.

Pour cela je me sert de la table wp_postmata (champs : meta_id, post_id, meta_key, meta_value).

Seulement :
- l'input "localisation" correspond au champ meta_key = cpt_codePostal OU meta_key = cpt_ville
- le select "budget" correspond au champ meta_key = cpt_prixVente
- le select "surface" correspond au champ meta_key = cpt_surfaceCadastrale


Et j'ai fait une requête comme suit :
$localisation = $_POST['localisation'];
echo '<strong>Localisation :</strong> '.$localisation.'<br/>';
 
$rayon = $_POST['rayon'];
echo '<strong>Rayon :</strong> '.$rayon.'<br/>';
 
$budget = $_POST['budget'];
echo '<strong>Budget :</strong> '.$budget.'<br/>';
 
$surface = $_POST['surface'];
echo '<strong>Surface :</strong> '.$surface.'<br/>';
 
 
if($localisation != ""){ $sql_loc = 'AND pm.meta_key = ("cpt_ville" OR "cpt_codePostal") AND pm.meta_value LIKE "'.$localisation.'" '; }
else{ $sql_loc = ''; }
 
if($budget != 0){
	if($budget == 10000)    { $sql_budg = 'AND pm.meta_key = "cpt_prixVente" AND pm.meta_value < 15000 '; } // Moins de 15 000 €
	elseif($budget == 15000){ $sql_budg = 'AND pm.meta_key = "cpt_prixVente" AND pm.meta_value BETWEEN 15000 AND 20000 '; } // De 15 000 à 20 000 €
	elseif($budget == 20000){ $sql_budg = 'AND pm.meta_key = "cpt_prixVente" AND pm.meta_value BETWEEN 20000 AND 25000 '; } // De 20 000 à 25 000 €
	elseif($budget == 25000){ $sql_budg = 'AND pm.meta_key = "cpt_prixVente" AND pm.meta_value BETWEEN 25000 AND 30000 '; } // De 25 000 à 30 000 €
	elseif($budget == 30000){ $sql_budg = 'AND pm.meta_key = "cpt_prixVente" AND pm.meta_value BETWEEN 30000 AND 35000 '; } // De 30 000 à 35 000 €
	elseif($budget == 35000){ $sql_budg = 'AND pm.meta_key = "cpt_prixVente" AND pm.meta_value BETWEEN 35000 AND 40000 '; } // De 35 000 à 40 000 €
	elseif($budget == 40000){ $sql_budg = 'AND pm.meta_key = "cpt_prixVente" AND pm.meta_value BETWEEN 40000 AND 45000 '; } // De 40 000 à 45 000 €
	elseif($budget == 45000){ $sql_budg = 'AND pm.meta_key = "cpt_prixVente" AND pm.meta_value > 45000 '; } // 45 000 € et plus
}else{
	$sql_budg = '';
}
 
if($surface != 0){
	if($surface == 200)		{ $sql_surf = 'AND pm.meta_key = "cpt_surfaceCadastrale" AND pm.meta_value < 300 '; } // Moins de 300 m2
	elseif($surface == 300) { $sql_surf = 'AND pm.meta_key = "cpt_surfaceCadastrale" AND pm.meta_value BETWEEN 300 AND 600 '; } // De 300 à 600 m2
	elseif($surface == 600) { $sql_surf = 'AND pm.meta_key = "cpt_surfaceCadastrale" AND pm.meta_value BETWEEN 600 AND 1000 '; } // De 600 à 1000 m2
	elseif($surface == 1000){ $sql_surf = 'AND pm.meta_key = "cpt_surfaceCadastrale" AND pm.meta_value > 1000 '; } // Plus de 1000 m2
}else{
	$sql_surf = '';
}
 
$resultats = $wpdb->get_results('
	SELECT pm.meta_id, pm.post_id, pm.meta_key, pm.meta_value
	FROM wp_posts p, wp_postmeta pm
	WHERE p.ID = pm.post_id
	AND p.post_type = "annonces"
	'.$sql_loc.'
	'.$sql_budg.'
	'.$sql_surf.'
	GROUP BY pm.post_id
');
 
foreach($resultats as $resultat){
	echo 'meta_id : '.$resultat->meta_id.'<br/>';
	echo 'post_id : '.$resultat->post_id.'<br/>';
	echo 'meta_key : '.$resultat->meta_key.'<br/>';
	echo 'meta_value : '.$resultat->meta_value.'<br/><br/>';
}



Mais du coup le résultat de ma requête est vide vu qu'on ne peut pas (tel quel en tt cas) faire une requête sur une seule table mais vérifier plusieurs champs.

Comment parvenir au résultat ?
En espérant avoir été assez claire ^^

Précision, je suis sous WordPress 3.9.1.

Merci d'avance
Bonjour,

J'ai l'impression que je n'ai pas tout compris à ton problème: en gros, quand tu ne saisis pas de localisation, ta requête fonctionne?

Peut-être que ta condition WHERE est incorrecte pour la localisation? Personnellement, j'aurais plutôt mis un truc du genre:
$sql_loc = 'AND ((pm.meta_key = "cpt_ville" AND pm.meta_value LIKE "'.$localisation.'" ) OR (pm.meta_key = "cpt_codePostal" AND pm.meta_value LIKE "'.$localisation.'"))';

Car dans l'idéal, il faudrait vérifier que tu as l'association clé/valeur pour la ville et la valeur entrée, OU l'association clé/valeur pour le code postal et la valeur entrée.

Bon courage en tout cas!
Bonjour

En fait je me suis embarquée dans un truc un peu compliqué alors qu'il y avait plus simple...

Voici ce qu'il faut faire (sous WordPress) :
$args['post_type'] = 'annonces';
$args['posts_per_page'] = 6;
$args['order'] = 'DESC';
$args['orderby'] = 'post_date';

if($localisation != ""){
	$args['meta_query'][] = array(
		'key'		=> 'cpt_codePostal',
		'value'		=> $localisation,
		'compare'	=> 'LIKE'
	);
}

if($budget != 0){
	if($budget == 100000){
		$value = 150000;
		$compare = "<";
	}elseif($budget == 450000){
		$value = 450000;
		$compare = ">";
	}else{
		$value = array($budget, ($budget+50000));
		$compare = "BETWEEN";
	}
	$args['meta_query'][] = array(
		'key'		=> 'cpt_prixVente',
		'value'		=> $value,
		'type'		=> 'numeric',
		'compare'	=> $compare
	);
}

if($surface != 0){
	if($surface == 200){
		$value = 300;
		$compare = "<";
	}elseif($surface == 300){
		$value = array($surface, 600);
		$compare = "BETWEEN";
	}elseif($surface == 600){
		$value = array($surface, 1000);
		$compare = "BETWEEN";
	}elseif($surface == 1000){
		$value = 1000;
		$compare = ">";
	}
	$args['meta_query'][] = array(
		'key'		=> 'cpt_surfaceCadastrale',
		'value'		=> $value,
		'type'		=> 'numeric',
		'compare'	=> $compare
	);
}
query_posts($args);
if( have_posts() ) :
	while( have_posts() ) : the_post();
		echo $post->ID.'<br/>';
		echo get_the_title().'<br/>';
		echo 'cpt_codePostal : '.get_post_meta($post->ID, 'cpt_codePostal', true).'<br/>';
		echo 'cpt_prixVente : '.get_post_meta($post->ID, 'cpt_prixVente', true).'<br/>';
		echo 'cpt_surfaceCadastrale : '.get_post_meta($post->ID, 'cpt_surfaceCadastrale', true).'<br/>';
		echo get_permalink().'<br/><br/>';
	endwhile;
else :
	echo 'Aucun biens';
endif; //have_posts 


Bonne journée