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

28

Me gustaría crear un formulario de búsqueda avanzada para un tipo de publicación personalizado específico, con filtros para los campos personalizados de tipos de publicación personalizados, taxonomías personalizadas y propiedades de tipos de publicación personalizada (campos y taxonomías) independientes que serán enlaces al primer tipo de publicación mediante un campo de relación personalizado.

Recientemente empecé con los tipos de correos personalizados, campos y taxonomías de WP. Me encanta hasta ahora, pero para aprovechar al máximo me gustaría poder buscarlo correctamente. ¿Necesito hacerlo manualmente? Si es así, ¿cómo?

PS. Si importa, estoy usando los complementos: Campos personalizados personalizados y IU de tipo de publicación personalizada .

A continuación, me he burlado de un ejemplo de cómo se vería el filtrado y cómo podría relacionarse con los tipos de publicación anteriores.

    
pregunta pax 09.01.2012 - 17:23

4 respuestas

16

Creo que algo como esto sería mejor que escribieras tú mismo.

Eche un vistazo a: enlace

Las propiedades se cargan en un CPT y tengo mi propia búsqueda personalizada en la barra lateral. De esa búsqueda se busca una serie de cosas tales como taxonomías, campos personalizados y orden por fecha, precio, etc.

Entonces, ¿cómo logro esto? Presento el formulario a una plantilla de página y desde allí trato con los datos de la publicación y construyo una nueva WP_query basada en los criterios de búsqueda. Utilizo sesiones para almacenar las variables de búsqueda para poder paginar los resultados.

WP_Query es muy potente. Eche un vistazo: enlace

Allí puede usar meta_query para consultar varios campos personalizados y usar tax_query para consultar sus taxonomías, y hay más. A continuación se muestra cómo se construye el mío para darle 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 need to set arguments here as wp query defaults */ 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 de WP estándar para mostrar extractos e información de la publicación.

    
respondido por el Brady 10.02.2012 - 15:41
2

Pruebe el complemento del selector de taxonomía juntos con Relevanssi. Combinación asesina.

enlace http://wordpress.org/extend/plugins/relevanssi/

    
respondido por el Hexagon 11.01.2012 - 09:54
0

Eche un vistazo al complemento Relevanssi, podría hacer lo que está buscando: enlace

    
respondido por el Jens Wedin 10.01.2012 - 07:26
0

Si alguien está teniendo dificultades para implementar la solución de Brady anterior (como lo hice), aquí hay una pista: parece que WordPress tiene algunos problemas al pasar los datos de la sesión, por lo que probablemente tendrá que hacer algo adicional para que funcione correctamente. Los problemas se se discuten aquí

En functions.php:

function init_sessions() {
  if (!session_id()) {
  session_start();
 }
}
add_action('init', 'init_sessions');

En tu plantilla:

/**
* Enable sessions
*/
if (!session_id())
session_start();

Por mi parte, el complemento " Simple Session Support " de Peter Wooster hizo el truco.

    
respondido por el SteveR 15.09.2012 - 00:43

Lea otras preguntas en las etiquetas