Creando un formulario de búsqueda para campos personalizados

10

He creado un tema para un concesionario de automóviles. Cada automóvil es un tipo de poste personalizado ("vehículo"), y tiene aproximadamente 12 campos personalizados con elementos como Marca, Modelo, Millaje, Tipo de combustible, etc. etc.

Básicamente, en la página de inicio quiero un formulario de búsqueda que tenga listas desplegables para Make & Modelo y contiene cualquier marca o modelo disponible.

También quiero que tenga 2 opciones por año, por lo que el usuario final puede seleccionar "2006" y "2012" y los resultados de búsqueda contienen todos los vehículos con el año entre esos dos números.

¿Hay algún complemento por ahí que pueda hacer esto?

Gracias por cualquier ayuda ... ¡Esto me ha estado volviendo loco por horas!

    
pregunta absdigital 15.10.2014 - 14:49

2 respuestas

13
  

respondido por el Mayeenul Islam 15.10.2014 - 17:45
17

Aunque la respuesta de @ MayeenulIslam podría funcionar, creo que la forma correcta de hacer una búsqueda avanzada es usando el gancho de acción pre_get_posts .

Paso 1: formulario de búsqueda

Este paso igual al paso 1 en la otra respuesta, solo cambió la identificación del "nombre" archivado utilizado para la búsqueda a "s", por lo que se usará directamente como campo de búsqueda. Guarde este código en searchform-advanced.php debajo de su carpeta de temas. Luego, use get_template_part( 'advanced', 'searchform' ); para cargarlo donde quiera que aparezca en su tema:

<form method="get" id="advanced-searchform" role="search" action="<?php echo esc_url( home_url( '/' ) ); ?>">

    <h3><?php _e( 'Advanced Search', 'textdomain' ); ?></h3>

    <!-- PASSING THIS TO TRIGGER THE ADVANCED SEARCH RESULT PAGE FROM functions.php -->
    <input type="hidden" name="search" value="advanced">

    <label for="s" class=""><?php _e( 'Name: ', 'textdomain' ); ?></label><br>
    <input type="text" value="" placeholder="<?php _e( 'Type the Car Name', 'textdomain' ); ?>" name="s" id="name" />

    <label for="model" class=""><?php _e( 'Select a Model: ', 'textdomain' ); ?></label><br>
    <select name="model" id="model">
        <option value=""><?php _e( 'Select one...', 'textdomain' ); ?></option>
        <option value="model1"><?php _e( 'Model 1', 'textdomain' ); ?></option>
        <option value="model2"><?php _e( 'Model 2', 'textdomain' ); ?></option>
    </select>

    <input type="submit" id="searchsubmit" value="Search" />

</form>

Paso 2: agrega filtros a la consulta de búsqueda

add_action( 'pre_get_posts', 'advanced_search_query' );
function advanced_search_query( $query ) {

    if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && ! is_admin() && $query->is_search && $query->is_main_query() ) {

        $query->set( 'post_type', 'vehicle' );

        $_model = $_GET['model'] != '' ? $_GET['model'] : '';

        $meta_query = array(
                            array(
                                'key'     => 'car_model', // assumed your meta_key is 'car_model'
                                'value'   => $_model,
                                'compare' => 'LIKE', // finds models that matches 'model' from the select field
                            )
                        )
        );
        $query->set( 'meta_query', $meta_query );

    }
}

Paso 3: Plantillas (opcional)

Con este método, la plantilla de búsqueda predeterminada de WordPress se usará para filtrar los resultados sin la necesidad de una consulta secundaria. Si desea usar una plantilla diferente para la búsqueda avanzada, puede usar el filtro template_include . Por ejemplo, si desea usar el archivo advanced-search-template.php como plantilla para los resultados del formulario de búsqueda avanzada:

add_action('template_include', 'advanced_search_template');
function advanced_search_template( $template ) {
  if ( isset( $_REQUEST['search'] ) && $_REQUEST['search'] == 'advanced' && is_search() ) {
     $t = locate_template('advanced-search-template.php');
     if ( ! empty($t) ) {
         $template = $t;
     }
  }
  return $template;
}
    
respondido por el cybmeta 02.02.2015 - 11:04

Lea otras preguntas en las etiquetas