Cârlige WP_query înainte de executarea unei interogări de căutare

13 oct. 2015, 01:04:17
Vizualizări: 14.2K
Voturi: 0

Cineva știe dacă există un hook înainte de executarea unei interogări de căutare (nu în bucla principală) pentru a modifica parametrul 's' și a evita divizarea frazelor în WordPress? Exemple sunt binevenite... mulțumesc

P.S.: Am încercat și în acest fel, dar prima parte a interogării SQL pare să indice că WP a efectuat deja căutarea și apoi rulează din nou o interogare filtrată după post_ids găsite inițial:

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

Și acesta este conținutul valorii request returnat de debug (* reprezintă prefixul tabelului):

[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

După cum puteți vedea, căutarea originală este deja efectuată și modificările mele afectează doar a doua interogare... Nu știu de ce dezvoltatorii de WordPress au implementat-o în acest fel, dar este o adevărată coșmar...

Cum pot să modific prima interogare, cea legată de căutarea originală?

2
Comentarii

Ce anume trebuie să faci

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

Trebuie să ocolesc separarea frazelor în WordPress pentru a face o căutare exactă în titlu și conținut. Am încercat parametrii 'exact' și 'sentence' în argumentele query-ului, dar nu se potrivesc cu cazul meu. Am încercat și niște filtre, dar ei doar modifică parametrul fără a ocoli separarea. Am nevoie să modific query-ul SQL chiar înainte de execuția reală

Nicola Boccardi Nicola Boccardi
13 oct. 2015 11:49:08
Toate răspunsurile la întrebare 2
0

Pentru a evita împărțirea frazelor de căutare, folosește variabila de interogare sentence în hook-ul 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' );

Nu am testat, dar ar trebui să funcționeze.

Programare plăcută!

27 apr. 2018 09:44:01
1

Căutați hook-ul WordPress pre_get_posts.

13 oct. 2015 03:54:02
Comentarii

Am încercat deja în felul acesta, dar se pare că am putut modifica doar parametrii, nu interogarea SQL. Deci fraza din parametrul 's', cu care aș face o potrivire exactă, va trece prin divizare din nou... Este un caz destul de complicat... Singura alternativă pare a fi să fac o interogare SQL directă, dar trebuie să caut și în multe câmpuri ACF... și asta e destul de coșmar...

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