Retomando «a ratos» este blog me dispongo a explicar, (mas bien para mi propio beneficio) como he resuelto realizar consultas de custom post, que incluyen campos personalizados y estan organizados en taxonomias personalizadas.
Para entrar en el problema, me encuentro con un desarrollo de plantilla y gestion personalizada de inmuebles para una inmobiliaria y tengo mis custom post tipo inmueble que tienen unos cuantos campos propios del inmueble.
Necesito un widget que permita al usuario buscar inmuebles sobre cualquiera de estos campos personalizados.
Es un poco folloncillo, sobre todo por la consulta de los campos de provincia y poblacion porque el plugin habilitado para esto genera en la BD un array serializado del que hay que sacar la informacion para la consulta SQL. Tenia dos formas basicamente para hacer esto, generar la consulta sql directamente, o utilizar las funciones de wordpress para consultar post, ayudandome de la configuracion de opciones para la consulta. Estas opciones se pasan a la funcion de consulta en forma de array de arrays y claro para que funcione bien el formateo y la creacion de los arrays debe ser correcta para WordPress.
[code language=»php»]
if($referencia!=»)
{
//si se ha consultado por referencia, solo generamos el array de consulta
//por este campo
$arrayselect = array(‘relation’ => ‘AND’,’post_type’ => ‘inmueble’,’meta_key’=>’referencia’,’meta_value’=>$referencia);
}
else
{
//si no se ha incluido referencia, comenzamos a montar el array principal de consulta por taxonomias
$arrayselect = array(‘relation’ => ‘AND’,’post_type’ => ‘inmueble’);
//consifuramos la paginacion de post
$paged = get_query_var(‘paged’) ? get_query_var(‘paged’) : 1;
$arrayselect[‘paged’] = $paged;
$arrayselect[‘post_per_page’] = 5;
//query de taxonomias
$taxquery = array(‘relation’ => ‘AND’);
//agregar filtro por tipo de operacion (venta, alquiler)
if($operacion!=’-1′)
array_push($taxquery,array(‘taxonomy’ => ‘tx_operacion’,’terms’ => array($operacion),’field’ => ‘slug’));
//agregar filtro por estado del inmueble
if($estado!=’-1′)
array_push($taxquery,array(‘taxonomy’ => ‘tx_estado’,’terms’ => array($estado),’field’ => ‘slug’));
//agregar filtro por tipologia del inmueble(apartamento,duplex, etc..)
if($tipologia!=’-1′)
array_push($taxquery,array(‘taxonomy’ => ‘tx_tipologia’,’terms’ => array($tipologia),’field’ => ‘slug’));
//si se ha agregado alguno de los filtros anteriores, se agrega al array principal
if(sizeof($taxquery)>1)
{
//array_push($arrayselect,array(‘tax_query’=>$taxquery));
$arrayselect["tax_query"]=$taxquery;
}
//si se ha seleccionado algun valor de ubicacion, creamos el array de filtro por ubicacion
if($idprovincia!=’-1′ || $poblacion!=’-1′)
{
$metaquery = array(‘relation’ => ‘AND’);
//si se ha seleccionado la provincia
if($idprovincia!=’-1′)
{
$arrayprovincia = array(
‘key’ => ‘ubicacion’,
‘value’ => ‘"’.$idprovincia.’"’,
‘compare’ => ‘LIKE’
);
//agregamos filtro por provincia
array_push($metaquery,$arrayprovincia);
/*al haber seleccionado por provincia, consultamos si
tambien se ha seleccionado poblacion*/
if($poblacion!=’-1′)
{
$arraypoblacion = array(
‘key’ => ‘ubicacion’,
‘value’ => ‘"’.$poblacion.’"’,
‘compare’ => ‘LIKE’
);
array_push($metaquery,$arraypoblacion);
}
}
//y agregamos lo que se haya seleccionado anteriormente al filtro general de consulta
$arrayselect[‘meta_query’] = $metaquery;
$arrayselect[‘meta_key’] = ‘ubicacion’;
//agregamos el array ubicacion al select
array_push($arrayselect,$ubicacion);
}
}
wp_reset_query();
$wp_query = new WP_Query($arrayselect);
// y aqui tenemos el array de custom post para mostrarlo
[/code]
y este es el array que se utiliza en WP_Query
array (size=8) 'relation' => string 'AND' (length=3) 'post_type' => string 'inmueble' (length=8) 'paged' => int 1 'post_per_page' => int 5 'tax_query' => array (size=3) 'relation' => string 'AND' (length=3) 0 => array (size=3) 'taxonomy' => string 'tx_operacion' (length=12) 'terms' => array (size=1) ... 'field' => string 'slug' (length=4) 1 => array (size=3) 'taxonomy' => string 'tx_tipologia' (length=12) 'terms' => array (size=1) ... 'field' => string 'slug' (length=4) 'meta_query' => array (size=3) 'relation' => string 'AND' (length=3) 0 => array (size=3) 'key' => string 'ubicacion' (length=9) 'value' => string '"4"' (length=3) 'compare' => string 'LIKE' (length=4) 1 => array (size=3) 'key' => string 'ubicacion' (length=9) 'value' => string '"Roquetas de Mar"' (length=17) 'compare' => string 'LIKE' (length=4) 'meta_key' => string 'ubicacion' (length=9) 0 => null
Deja una respuesta