Formulario de búsqueda avanzada con filtros para taxonomías personalizadas y campos personalizados

9 ene 2012, 18:23:57
Vistas: 71.3K
Votos: 32

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.

Formulario de búsqueda personalizado de WordPress filtrado por campos personalizados y taxonomías personalizadas

1
Comentarios

Si alguien tiene dificultades implementando la solución de Brady mencionada arriba (como me pasó a mí), aquí un consejo: Parece que WordPress tiene algunos problemas al pasar datos de sesión, así que probablemente tendrás que hacer algo adicional para que funcione correctamente. Los problemas se discuten aquí: http://www.frank-verhoeven.com/using-session-in-wordpress/ En mi caso, instalar el plugin "Simple Session Support" de Peter Wooster solucionó el problema. Hay un enlace al plugin en la sección de comentarios de la publicación.

SteveR SteveR
15 sept 2012 01:43:31
Todas las respuestas a la pregunta 4
5
16

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.

10 feb 2012 16:41:22
Comentarios

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 salocin
28 jun 2012 10:46:23

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

Scott Scott
28 jun 2012 11:06:50

Gracias Brady, ¿entonces la URL de la plantilla de la página?

salocin salocin
28 jun 2012 14:49:23

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

Scott Scott
28 jun 2012 16:15:37

¿Estás verificando si las taxonomías personalizadas tienen publicaciones con ellas como un campo personalizado? ¿Cómo exactamente estás llenando el formulario de búsqueda? @Brady gracias

Phil Hudson Phil Hudson
19 feb 2016 08:00:56
1

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/

11 ene 2012 10:54:36
Comentarios

esto no tiene en cuenta las relaciones entre publicaciones, que es la parte difícil de mi problema. Es mucho más fácil filtrar publicaciones por taxonomía, necesito filtrarlas por la taxonomía (o campo personalizado) de una publicación relacionada.

pax pax
14 ene 2012 19:09:33
1

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

10 ene 2012 08:26:56
Comentarios

No se ajusta al enfoque que necesito (con filtros específicos), pero es un complemento muy interesante, parece un excelente reemplazo para la función de búsqueda predeterminada, muchas gracias por señalarlo.

pax pax
10 ene 2012 19:37:23
1

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.

15 sept 2012 01:43:31
Comentarios

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?

Brian Fegter Brian Fegter
16 sept 2012 07:09:38