Búsqueda por palabra, categoría, etiqueta y autor

19 jul 2012, 15:48:43
Vistas: 20K
Votos: 2

Para implementar una página de búsqueda con estas funcionalidades, puedes utilizar WP_Query junto con un formulario de búsqueda. Aquí te muestro un ejemplo de cómo implementarlo:


// Formulario de búsqueda
function custom_search_form() {
    // Obtener términos para los selectores
    $categories = get_categories();
    $tags = get_tags();
    $authors = get_users(['who' => 'authors']);
    
    // Obtener valores actuales si existen
    $search_term = isset($_GET['s']) ? sanitize_text_field($_GET['s']) : '';
    $selected_cat = isset($_GET['category']) ? intval($_GET['category']) : '';
    $selected_tag = isset($_GET['tag']) ? intval($_GET['tag']) : '';
    $selected_author = isset($_GET['author']) ? intval($_GET['author']) : '';
    
    $form = '<form method="get" action="' . home_url('/') . '">';
    
    // Campo de búsqueda por palabra
    $form .= '<input type="text" name="s" value="' . esc_attr($search_term) . '" placeholder="Buscar por palabra...">';
    
    // Selector de categoría
    $form .= '<select name="category">';
    $form .= '<option value="">Seleccionar categoría</option>';
    foreach($categories as $category) {
        $form .= sprintf(
            '<option value="%s" %s>%s</option>',
            $category->term_id,
            selected($selected_cat, $category->term_id, false),
            esc_html($category->name)
        );
    }
    $form .= '</select>';
    
    // Selector de etiquetas
    $form .= '<select name="tag">';
    $form .= '<option value="">Seleccionar etiqueta</option>';
    foreach($tags as $tag) {
        $form .= sprintf(
            '<option value="%s" %s>%s</option>',
            $tag->term_id,
            selected($selected_tag, $tag->term_id, false),
            esc_html($tag->name)
        );
    }
    $form .= '</select>';
    
    // Selector de autor
    $form .= '<select name="author">';
    $form .= '<option value="">Seleccionar autor</option>';
    foreach($authors as $author) {
        $form .= sprintf(
            '<option value="%s" %s>%s</option>',
            $author->ID,
            selected($selected_author, $author->ID, false),
            esc_html($author->display_name)
        );
    }
    $form .= '</select>';
    
    $form .= '<input type="submit" value="Buscar">';
    $form .= '</form>';
    
    return $form;
}

// Función para procesar la búsqueda
function custom_search_query($query) {
    if (!is_admin() && $query->is_main_query() && $query->is_search()) {
        // Filtro por categoría
        if (!empty($_GET['category'])) {
            $query->set('cat', intval($_GET['category']));
        }
        
        // Filtro por etiqueta
        if (!empty($_GET['tag'])) {
            $query->set('tag_id', intval($_GET['tag']));
        }
        
        // Filtro por autor
        if (!empty($_GET['author'])) {
            $query->set('author', intval($_GET['author']));
        }
    }
    return $query;
}
add_filter('pre_get_posts', 'custom_search_query');

Para usar este código:

  1. Agrega el código en el archivo functions.php de tu tema
  2. Usa el shortcode [custom_search] o llama a la función custom_search_form() en tu plantilla
  3. Crea una página de búsqueda personalizada (search.php) para mostrar los resultados

Este código crea un formulario de búsqueda con:

  • Un campo de texto para búsqueda por palabra clave
  • Un selector desplegable para categorías
  • Un selector desplegable para etiquetas
  • Un selector desplegable para autores

El código maneja la sanitización de entradas y utiliza WP_Query para filtrar los resultados según los criterios seleccionados. Puedes personalizar el estilo del formulario con CSS según tus necesidades.

0
Todas las respuestas a la pregunta 2
1

Querrás añadir algunos botones de radio dentro de tu formulario de búsqueda. Luego agrega un filtro a tu búsqueda:

function filter_search( $query ) {
if( $query->is_search ) {
            if ( isset($_GET['tag']) )
            // modifica tu consulta de búsqueda aquí.
}
return $query;
}
add_filter( 'pre_get_posts' , 'filter_search' );

Influenciado por http://wordpress.org/support/topic/how-to-add-search-filter-by-custom-values#post-1463329

19 jul 2012 16:26:38
Comentarios

Lo tendré en mente en caso de que construya la cadena de consulta manualmente mediante casillas de radio y cuadros de texto. ¡Gracias!

p.a. p.a.
20 jul 2012 09:21:52
2

Si prefieres que un plugin de WordPress haga el trabajo por ti, echa un vistazo a Search Everything, en el repositorio de plugins de WordPress.

Mejora la funcionalidad de búsqueda predeterminada de WordPress en tres sencillos pasos usando Search Everything.

Mejor búsqueda en WordPress en tres pasos

Activa Configura opciones Buscar (quizás solo sean dos pasos)

Las opciones incluyen resaltado de búsqueda, búsqueda en páginas, extractos, archivos adjuntos, borradores, comentarios y campos personalizados (metadatos).

Lo que hace:

Search Everything incrementa la capacidad de la búsqueda predeterminada de WordPress, las opciones incluyen:

  • Resaltado de búsqueda
  • Buscar en todas las páginas
  • Buscar en todas las etiquetas
  • Buscar en taxonomías personalizadas (nuevo)
  • Buscar en todas las categorías
  • Buscar solo en páginas no protegidas por contraseña
  • Buscar en todos los comentarios
  • Buscar solo en comentarios aprobados
  • Buscar en todos los borradores
  • Buscar en todos los extractos
  • Buscar en todos los archivos adjuntos (tipo de publicación)
  • Buscar en todos los campos personalizados (metadatos)
  • Excluir publicaciones de la búsqueda
  • Excluir categorías de la búsqueda

[Plugin de WordPress]: Search Everything

19 jul 2012 16:44:21
Comentarios

¡Gran idea! Lo he probado para la búsqueda de tipos de posts personalizados y funciona, ¡gracias!

p.a. p.a.
20 jul 2012 09:20:52

Este plugin es útil, pero hace lo contrario de lo que necesito: toma como entrada una palabra y busca en etiquetas, categorías, títulos, etc. esa palabra. Lo que necesito son criterios como: categoríaZ & etiqueta "XYY" & título que contenga "Casa". Así que supongo que este plugin no es útil en este caso. ¿Correcto?

p.a. p.a.
20 jul 2012 10:29:18