Ganchos de WP_query antes de ejecutar una consulta de búsqueda

13 oct 2015, 01:04:17
Vistas: 14.2K
Votos: 0

¿Alguien sabe si existe un gancho antes de la ejecución de una consulta de búsqueda (no en el bucle principal) para cambiar el parámetro 's' y evitar la división de frases de WordPress? Se agradecen ejemplos... gracias

PD: También lo intenté de esta manera, pero la primera parte de la consulta SQL parece indicar que WP ya realizó la búsqueda y luego volvió a ejecutar una consulta filtrada por los post_ids encontrados primero:

function alter_the_query( $where = '' ) {
global $wpdb, $table_prefix, $wp_query;
$tmpQobj = $wp_query->queried_object;
$tmpTitle = $wp_query->queried_object->post_title;

$where .= $wpdb->prepare( " AND ({$table_prefix}posts.post_title like %s OR {$table_prefix}posts.post_content like %s )", "%{$tmpTitle}%", "%{$tmpTitle}%" );

debug($where);

return $where;
}
add_filter( 'posts_where', 'alter_the_query' );

Y este es el contenido del valor request (* representa el prefijo de tabla) devuelto por debug:

[request] => SELECT SQL_CALC_FOUND_ROWS  ***_posts.ID FROM ***__posts  WHERE 1=1  AND ***__posts.ID IN (534,868,911,917) AND ***__posts.post_type IN ('multimedia', 'news', 'social_project', 'publication') AND ((***__posts.post_status = 'publish')) AND (***__posts.post_title like '%string to search%' OR ***__posts.post_content like '%string to searchs%' )  ORDER BY FIELD( ***__posts.ID, 534,868,911,917 ) LIMIT 0, 3

Como puedes ver, la búsqueda original ya se realizó y mis cambios solo afectan la segunda consulta... No sé por qué los desarrolladores del núcleo de WP lo hicieron así, pero es bastante problemático...

¿Cómo puedo enganchar la primera consulta, la relacionada con la búsqueda original?

2
Comentarios

¿Qué necesitas hacer exactamente?

Pieter Goosen Pieter Goosen
13 oct 2015 08:39:37

Necesito evitar la división de frases de WordPress para realizar una búsqueda exacta en el título y contenido. He probado los parámetros 'exact' y 'sentence' en los argumentos de la consulta, pero no es mi caso. También he intentado algunos filtros pero cambian el parámetro sin evitar la división. Necesito hacer el cambio en la consulta SQL justo antes de su ejecución real

Nicola Boccardi Nicola Boccardi
13 oct 2015 11:49:08
Todas las respuestas a la pregunta 2
0

Para evitar la división de frases de búsqueda, utiliza la variable de consulta sentence en el hook pre_get_posts:

function only_search_for_full_phrase( $query ) {
    if ( $query->is_search() && $query->is_main_query() ) {
        $query->set( 'sentence', true );
    }
}
add_action( 'pre_get_posts', 'only_search_for_full_phrase' );

No lo he probado, pero debería funcionar.

¡Feliz codificación!

27 abr 2018 09:44:01
1

Estás buscando el hook pre_get_posts.

13 oct 2015 03:54:02
Comentarios

Ya intenté de esta manera, pero parece que solo pude cambiar los parámetros, no la consulta SQL. Así que la frase en el parámetro 's', con la que haría una coincidencia exacta, pasará dividiéndose de nuevo... Es un caso bastante complicado... La única alternativa parece ser hacer una consulta SQL directa, pero también necesito buscar en muchos campos ACF... y esto es toda una pesadilla...

Nicola Boccardi Nicola Boccardi
13 oct 2015 12:12:23