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...!!