¿Cómo limitar la búsqueda solo a títulos de entradas?

12 mar 2011, 16:06:33
Vistas: 31K
Votos: 29

¿Hay alguna manera de limitar la búsqueda solo a títulos de entradas? Sé que puedo modificar el archivo query.php del core, pero debe haber una forma de hacerlo con hooks, ¿verdad?

¡Gracias de antemano!

0
Todas las respuestas a la pregunta 1
8
39

Aquí tienes un filtro que hará el trabajo. Agrégalo al archivo functions.php de tu tema o en un plugin.

/**
 * Filtro SQL para buscar solo coincidencias en el título de las publicaciones.
 *
 * @link    http://wordpress.stackexchange.com/a/11826/1685
 *
 * @param   string      $search
 * @param   WP_Query    $wp_query
 */
function wpse_11826_search_by_title( $search, $wp_query ) {
    if ( ! empty( $search ) && ! empty( $wp_query->query_vars['search_terms'] ) ) {
        global $wpdb;

        $q = $wp_query->query_vars;
        $n = ! empty( $q['exact'] ) ? '' : '%';

        $search = array();

        foreach ( ( array ) $q['search_terms'] as $term )
            $search[] = $wpdb->prepare( "$wpdb->posts.post_title LIKE %s", $n . $wpdb->esc_like( $term ) . $n );

        if ( ! is_user_logged_in() )
            $search[] = "$wpdb->posts.post_password = ''";

        $search = ' AND ' . implode( ' AND ', $search );
    }

    return $search;
}

add_filter( 'posts_search', 'wpse_11826_search_by_title', 10, 2 );

La mayor parte del código está copiado de la clase WP_Query, excepto que se eliminaron las cláusulas post_content LIKE.

ACTUALIZACIÓN: Se eliminó like_escape() obsoleto desde la versión 4.0

12 mar 2011 16:51:08
Comentarios

¡funciona perfectamente, sabía que había un filtro para esto, no podía encontrarlo en ningún lugar del codex, muchas gracias!

Javier Villanueva Javier Villanueva
12 mar 2011 18:19:23

@TheDeadMedic acabo de probarlo en mi blog y esa consulta en particular ahora no devuelve ningún resultado, con o sin este código. ¿Alguna idea?

Ashfame Ashfame
4 ago 2011 02:37:00

Ahora está funcionando como siempre sin el código, pero el código no funcionó para mí. Mostró los mismos resultados :/

Ashfame Ashfame
4 ago 2011 10:32:42

@Ashfame He revisado mi respuesta.

TheDeadMedic TheDeadMedic
4 ago 2011 15:44:44

Gracias, funciona bien, si eliminas los {$n} cerca de {$term} hace una búsqueda exacta. Pero hay un problema, no busca términos con espacios como "jugo de manzana". Pero sí busca manzana.

User User
16 dic 2011 14:12:03

Sí, si eliminas {$n}, estás eliminando la inyección de cadena con comodín. Deja el código como está y usa el argumento de consulta URL exact=1 para controlar si la búsqueda es aproximada o explícita.

TheDeadMedic TheDeadMedic
16 dic 2011 19:58:17

Mensaje PHP: Error fatal de PHP: Llamada a método indefinido wpdb::esc_like() --- Si tienes una versión antigua de WordPress, esta es una función nueva a partir de WP 4.0

Jay Brunet Jay Brunet
10 nov 2015 01:14:13

¿En lugar de usar LIKE, podría buscar con regex? El patrón de mi título es un poco más complejo... Supongo que es una pregunta diferente pero agradecería cualquier pista. Gracias

Drewdavid Drewdavid
23 nov 2019 08:12:28
Mostrar los 3 comentarios restantes