Hook WP_query prima di eseguire una query di ricerca

13 ott 2015, 01:04:17
Visualizzazioni: 14.2K
Voti: 0

Qualcuno sa se esiste un hook prima dell'esecuzione di una query di ricerca (non nel main loop) per modificare il parametro 's' ed evitare la divisione delle frasi in WordPress? Esempi sono benvenuti... grazie

P.S.: Ho già provato in questo modo, ma la prima parte della query SQL sembra indicare che WP ha già effettuato la ricerca e poi riesegue una query filtrata dai post_ids trovati inizialmente:

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' );

E questo è il contenuto del valore request (* rappresenta il prefisso della tabella) restituito da 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 '%stringa da cercare%' OR ***_posts.post_content like '%stringa da cercare%' )  ORDER BY FIELD( ***_posts.ID, 534,868,911,917 ) LIMIT 0, 3

Come puoi vedere, la ricerca originale è già stata effettuata e le mie modifiche influiscono solo sulla seconda query... Non so perché gli sviluppatori del core di WP l'abbiano implementato in questo modo, ma è un vero incubo...

Come posso agganciare la prima query, quella relativa alla ricerca originale?

2
Commenti

Cosa hai bisogno di fare esattamente

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

Devo bypassare la divisione in frasi di WordPress per eseguire una ricerca esatta nel titolo e nel contenuto. Ho provato i parametri 'exact' e 'sentence' negli argomenti della query, ma non è il mio caso. Ho anche provato alcuni filtri ma modificano il parametro senza bypassare la divisione. Devo apportare la modifica alla query SQL solo un momento prima dell'esecuzione effettiva

Nicola Boccardi Nicola Boccardi
13 ott 2015 11:49:08
Tutte le risposte alla domanda 2
0

Per evitare la divisione delle frasi di ricerca, utilizza la variabile di query sentence nell'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' );

Non l'ho testato, ma dovrebbe funzionare.

Buona programmazione!

27 apr 2018 09:44:01
1

Stai cercando l'hook pre_get_posts.

13 ott 2015 03:54:02
Commenti

Ho già provato in questo modo, ma sembra che potessi modificare solo i parametri, non la query sql. Quindi la frase nel parametro 's', con cui farei un match esatto, verrà nuovamente divisa... È un caso piuttosto complicato... L'unica alternativa sembra essere fare una query sql diretta, ma devo anche cercare in molti campi acf... ed è un vero incubo...

Nicola Boccardi Nicola Boccardi
13 ott 2015 12:12:23