Aggiungere campi personalizzati alla ricerca in WordPress
Voglio aggiungere dei campi personalizzati ("introduzione" e "ensavoirplus") alla ricerca di WordPress, ma il codice SQL non è corretto. Non capisco se sto facendo un errore o se WordPress non può farlo. Il mio tentativo fallisce... Non so perché perché ho seguito esattamente ciò che dice il codex.
Questo è il mio codice:
function ricerca_avancee( $query ) {
if ( !is_admin() && $query->is_search ) {
$custom_fields = array(
"introduction",
"en_savoir_plus_page"
);
$meta_query = array('relation' => 'OR');
foreach($custom_fields as $cf) {
array_push($meta_query, array(
'key' => $cf,
'value' => $_GET['s'],
'compare' => 'LIKE'
));
}
$query->set("meta_query", $meta_query);
}
}
add_action( 'pre_get_posts', 'ricerca_avancee');
E questo è il codice SQL generato:
1. SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
2. FROM wp_posts
3. INNER JOIN wp_postmeta
4. ON ( wp_posts.ID = wp_postmeta.post_id )
5. WHERE 1=1
6. AND (((wp_posts.post_title LIKE '%environnement%')
7. OR (wp_posts.post_content LIKE '%environnement%')))
8. AND wp_posts.post_type IN ('post', 'page', 'attachment')
9. AND (wp_posts.post_status = 'publish'
10. OR wp_posts.post_status = 'miseenavant'
11. OR wp_posts.post_author = 3
12. AND wp_posts.post_status = 'private')
13. AND ( ( wp_postmeta.meta_key = 'introduction'
14. AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%environnement%' )
15. OR ( wp_postmeta.meta_key = 'en_savoir_plus_page'
16. AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%environnement%' ) )
17. GROUP BY wp_posts.ID
18. ORDER BY wp_posts.menu_order ASC
19. LIMIT 0, 10
Gli errori sono alla riga 13, perché non voglio un AND ma un OR e le righe 13,14,15,16 dovrebbero essere subito dopo la riga 7 affinché tutto funzioni.
Qualcuno ha già avuto lo stesso tipo di errore e se sì, da cosa dipende?
Grazie

Grazie a WordPress 4.1 puoi ottenere risultati migliori con meta_query: https://make.wordpress.org/core/2014/10/20/update-on-query-improvements-in-4-1/
function ricerca_avanzata($query) {
if (!is_admin() && $query->is_search) {
$meta_query = array(
'relation' => 'OR',
array(
'relation' => 'OR',
array(
'key' => 'introduzione',
'value' => get_search_query(),
'compare' => 'LIKE',
),
array(
'key' => 'approfondisci_pagina',
'value' => get_search_query(),
'compare' => 'LIKE',
),
),
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'ricerca_avanzata');
Non l'ho testato ma hai capito il concetto...

per favore non fare mai così: 'value' => $_GET['s']
... $query->get('s');
, get_search_query, oppure sanitize_key($_GET['s'])
sono tutte opzioni più sicure. Tecnicamente non dovremmo affatto usare i parametri GET in WordPress, non è una best practice. Quel valore GET potrebbe contenere ogni sorta di elementi dannosi, e non vogliamo passarlo al database senza esserci assicurati che sia pulito.
Inoltre, stai usando l'operatore LIKE
... quindi potresti voler aggiungere virgolette attorno al valore per un matching più rigoroso.
'value' => '"'.$query->get('s').'"';

Ho esaminato il tuo codice ma non riesco a trovare cosa non va nel tuo codice. Ho una soluzione semplice. Puoi usare un plugin WordPress gratuito di terze parti, WP Extended Search, e selezionare i meta key che vuoi includere nei risultati di ricerca. Questo plugin aiuta ad estendere la ricerca predefinita di WordPress e include i meta post, le tassonomie e i tipi di post personalizzati nei risultati di ricerca.
WP Extended Search: https://wordpress.org/plugins/wp-extended-search/
Spero che questo ti aiuti...!!
