Formulario de búsqueda avanzada con filtros para taxonomías personalizadas y campos personalizados
Me gustaría construir un formulario de búsqueda avanzada para un tipo de contenido personalizado específico, que tenga filtros para los campos personalizados, taxonomías personalizadas y para las propiedades (campos y taxonomías) de otro tipo de contenido personalizado que estará vinculado al primer tipo de contenido mediante un campo de relación personalizado.
Recientemente he comenzado a trabajar con tipos de contenido personalizados, campos y taxonomías de WordPress, me encanta hasta ahora pero para aprovecharlo al máximo me gustaría poder realizar búsquedas adecuadamente. ¿Necesito hacerlo manualmente? Si es así, ¿cómo?
PD: Si es relevante, estoy usando los plugins: Advanced Custom Fields y Custom Post Type UI.
A continuación he creado un ejemplo de cómo se vería el filtrado y cómo podría relacionarse con los tipos de contenido mencionados arriba.
Creo que algo como esto sería mejor que lo escribieras tú mismo.
Echa un vistazo a: http://www.catalysthomes.co.uk/homes-for-sale/
Las propiedades se cargan en un CPT (Custom Post Type) y tengo mi propia búsqueda personalizada en la barra lateral. De esa búsqueda, se buscan varias cosas como taxonomías, campos personalizados y se ordena por fecha, precio, etc.
¿Cómo logro esto? Envío el formulario a una plantilla de página y desde allí manejo los datos del post y construyo un nuevo WP_query basado en los criterios de búsqueda. Uso sesiones para almacenar las variables de búsqueda para poder paginar los resultados.
WP_Query es muy potente. Echa un vistazo: http://codex.wordpress.org/Class_Reference/WP_Query
Ahí puedes usar meta_query
para consultar múltiples campos personalizados y usar tax_query
para consultar tus taxonomías, además hay más. A continuación te muestro cómo está construido el mío para que te hagas una idea.
Archivo de plantilla:
<?php
$temp = $wp_query;
$wp_query = NULL;
$args = array();
?>
<?php include("functions/Homes-for-sale/propertyrawresults.php"); ?>
<?php include("functions/Homes-for-sale/propertysearchresults.php"); ?>
<?php
$args['post_type'] = "homes-for-sale";
$args['showposts'] = 10;
$args['paged'] = $paged;
$wp_query = new WP_Query($args);
?>
<?php include("functions/Homes-for-sale/propertylistlayout.php"); ?>
Resultados sin procesar
<?php
if($_POST['sortby']) {
$_SESSION['prop_selectedsortby'] = $_POST['sortby'];
}
switch($_SESSION['prop_selectedsortby']) {
case "name-asc": $args['order'] = "ASC"; $args['orderby'] = "title"; break;
case "name-desc": $args['orderby'] = "title"; break;
case "price-asc": $args['order'] = "ASC"; $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
case "price-desc": $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
case "date-asc": $args['order'] = "ASC"; break;
default: /* No es necesario establecer argumentos aquí ya que wp query tiene valores por defecto */ break;
}
$selectedsortby[$_SESSION['prop_selectedsortby']] = " selected=\"selected\"";
?>
Resultados de búsqueda
<?php
if( ! empty( $_SESSION['s_property_ptype'] ) ) {
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_types_nbrs',
'value' => $_SESSION['s_property_ptype']
);
}
if( ! empty( $_SESSION['s_property_development'] ) ) {
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_ofdevelopment',
'value' => $_SESSION['s_property_development']
);
}
if( isset( $_SESSION['s_property_area'] ) && 0 != $_SESSION['s_property_area'] ) {
$args['tax_query'][] = array(
'taxonomy' => 'areas',
'field' => 'id',
'terms' => array( (int) $_SESSION['s_property_area'] ),
);
}
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_bedrooms',
'value' => $_SESSION['s_property_bedrooms_min'],
'compare' => '>=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_bedrooms',
'value' => $_SESSION['s_property_bedrooms_max'],
'compare' => '<=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_bathrooms',
'value' => $_SESSION['s_property_bathrooms_min'],
'compare' => '>=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_bathrooms',
'value' => $_SESSION['s_property_bathrooms_max'],
'compare' => '<=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_fmv',
'value' => $_SESSION['s_property_min_price'],
'compare' => '>=',
'type' => 'SIGNED'
);
$args['meta_query'][] = array(
'key' => 'chb_homes_for_sale_specifics_fmv',
'value' => $_SESSION['s_property_max_price'],
'compare' => '<=',
'type' => 'SIGNED'
);
?>
Diseño de lista Solo un bucle estándar de WP para mostrar extractos e información de los posts.

Hola Brady, Gracias por este ejemplo. ¿Podría pedirte, si es posible, que compartas el formulario? En él, ¿a qué URL lo estás enviando?

@salocin - Esa información se puede obtener mirando el código fuente de la página en la URL proporcionada en la respuesta

El formulario está en catalysthomes.co.uk. Puedes ver el código fuente y ver cómo funciona el formulario

Prueba el plugin Taxonomy Picker junto con Relevanssi. Una combinación letal.
http://www.squidoo.com/taxonomy-picker-wordpress-plugin http://wordpress.org/extend/plugins/relevanssi/

Echa un vistazo al plugin Relevanssi, podría hacer lo que estás buscando: http://wordpress.org/extend/plugins/relevanssi/

Si alguien está teniendo dificultades para implementar la solución de Brady mencionada anteriormente (como me pasó a mí), aquí hay una pista: parece que WordPress tiene algunos problemas al pasar datos de sesión, por lo que probablemente tendrás que hacer algo adicional para que funcione correctamente. Los problemas se discuten aquí
En functions.php:
function init_sessions() {
if (!session_id()) {
session_start();
}
}
add_action('init', 'init_sessions');
En tu plantilla:
/**
* Habilitar sesiones
*/
if (!session_id())
session_start();
En mi caso, instalar el plugin "Simple Session Support" de Peter Wooster solucionó el problema.

Hola Steve. Gracias por publicar tu primera respuesta aquí. Me alegra tenerte en WPSE. Para futuras referencias, las respuestas no deberían depender completamente de un enlace externo. Si el enlace se desactiva, tu respuesta pierde utilidad. ¿Te importaría actualizar tu respuesta con un par de fragmentos de código relevantes como ejemplo?
