Un buscador con php y html para el index.php del blog en ClassicPress (y WordPress)

Hoy me ha dado por probar un pequeño buscador en la página del listado de posts del blog. Es muy simple y se puede hacer con php y html. Lo he puesto de pruebas en el index.php, que es mi página raíz del blog, la página principal.

He añadido este código:

<form role="search" method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>">
    <input type="text" id="search" name="s" value="<?php echo get_search_query(); ?>" placeholder="Buscar...">
</form>

La fuente de la que he sacado el form de búsqueda es esta web de developer.wordpress.org, concretamente adaptando el código del "Default HTML4 Form". Lo anterior se ve así:

Se ve la portada del blog con el nuevo formulario de búsqueda que permite filtrar los posts por conceptos que se busquen

Me he basado en el buscador de los blogs Bear Blog, aunque funcionan algo diferente. En mi caso, tienes que escribir una palabra o lo que quieras buscar y dar al enter; y ya ves los posts con esa palabra que buscas. En el caso de Bear Blog va filtrando según buscas. Creo que es porque en mi caso todo es con php y html, y quizá Bear Blog use javascript. De hecho, si apago el javascript con UblockOrigin en un blog de Bear Blog, deja de verse el buscador.

También, tal como está el mío, busca no solo en el título de los posts, sino en todo el contenido. Aquí por ejemplo hay una búsqueda del concepto "mastodon", y se ve que filtra posts con mastodon en el título y entradas donde se menciona mastodon en el texto. Lo veo útil:

Se ve un ejemplo de búsqueda del concepto mastodon. Sale "mastodon" en el cuadro de búsqueda y los posts donde mastodon sale en el título y también en el texto de los posts (más allá del título)

Para conseguir que busque solo en los títulos, habría que modificar el functions.php añadiendo lo siguiente:

function __search_by_title_only( $search, &$wp_query )
{
    global $wpdb;
    if(empty($search)) {
        return $search; // skip processing - no search term in query
    }
    $q = $wp_query->query_vars;
    $n = !empty($q['exact']) ? '' : '%';
    $search =
    $searchand = '';
    foreach ((array)$q['search_terms'] as $term) {
        $term = esc_sql($wpdb->esc_like($term));
        $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
        $searchand = ' AND ';
    }
    if (!empty($search)) {
        $search = " AND ({$search}) ";
        if (!is_user_logged_in())
            $search .= " AND ($wpdb->posts.post_password = '') ";
    }
    return $search;
}
add_filter('posts_search', '__search_by_title_only', 500, 2);

Este código lo he sacado de esta web de stackoverflow.com. Así, la misma búsqueda del concepto mastodon, filtra los posts con dicho concepto en el título de los posts:

Se ve un ejemplo de búsqueda del concepto mastodon. Sale "mastodon" en el cuadro de búsqueda y los posts donde mastodon sale en el título gracias al código añadido al functions.php

No sé si dejaré el buscador visible o si lo dejaré apagado en el código, pero está bien tenerlo ahí por si acaso; y no sé si prefiero que busque en todo el contenido de los posts o solo en el título. Lo voy a dejar unos días probando ambas opciones a ver qué tal. La verdad es que con el control+f se va a todos lados.

Edito hoy mismo: al final no dejo el buscador: efectivamente, con control+f se llega a lo mismo.

Fin: post publicado el 2 octubre de 2024 por Pedro Lázaro Rodríguez; con licencia Creative Commons CC BY-NC-SA 4.0 y sobre el tema (o temas): Software Libre

Volver al top de la página