Aggiungere campi personalizzati alla ricerca in WordPress

8 gen 2015, 12:05:23
Visualizzazioni: 13.6K
Voti: 6

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

0
Tutte le risposte alla domanda 3
1

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

9 gen 2015 11:29:05
Commenti

Grazie per la tua risposta, la prima relazione di ordine "OR" non cambia l'"AND" (prima del primo meta_key) nel codice SQL ... Ho visto il cambiamento diverso da WP 4.1 nell'ordine meta_query e sento che questo non risolve il mio problema: /

ecaLdipS ecaLdipS
9 gen 2015 12:28:37
0

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').'"';
7 nov 2018 22:29:08
0
-1

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/

Plugin WP Extended Search per estendere la ricerca in WordPress

Spero che questo ti aiuti...!!

26 giu 2018 20:23:35