Adăugare câmpuri personalizate la căutare

8 ian. 2015, 12:05:23
Vizualizări: 13.6K
Voturi: 6

Vreau să adaug câmpuri personalizate ("introduction" și "ensavoirplus") la căutarea în Wordpress, dar codul SQL nu este exact. Nu înțeleg dacă fac o greșeală sau dacă WP nu poate face asta. Încercarea mea eșuează... Nu știu de ce deoarece fac exact ce spune codex-ul.

Acesta este codul meu:

function recherche_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', 'recherche_avancee');

Și acesta este codul SQL:

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

Erorile sunt la linia 13, deoarece nu vreau un AND ci un OR și liniile 13,14,15,16 ar trebui să meargă imediat după linia 7 pentru ca totul să funcționeze.

A mai avut cineva același tip de eroare și dacă da, de unde a provenit?

Mulțumesc

0
Toate răspunsurile la întrebare 3
1

Datorită WordPress 4.1 poți face mai bine pentru meta_query: https://make.wordpress.org/core/2014/10/20/update-on-query-improvements-in-4-1/

function recherche_avancee($query) {
    if (!is_admin() && $query->is_search) {
        $meta_query = array(
           'relation' => 'OR',
            array(
              'relation' => 'OR',
              array(
               'key' => 'introduction',
               'value' => get_search_query(),
               'compare' => 'LIKE',
              ),
              array(
               'key' => 'en_savoir_plus_page',
               'value' => get_search_query(),
               'compare' => 'LIKE',
             ),
           ),
        );
        
        $query->set('meta_query', $meta_query);
    }
}
add_action('pre_get_posts', 'recherche_avancee');

Nu am testat, dar înțelegeți ideea...

9 ian. 2015 11:29:05
Comentarii

Mulțumesc pentru răspuns, relația de ordine "OR" nu schimbă "AND" (înaintea primului meta_key) în codul SQL... Am observat schimbarea diferită începând cu WP 4.1 în meta_query și simt că asta nu rezolvă problema mea :/

ecaLdipS ecaLdipS
9 ian. 2015 12:28:37
0

te rog să nu faci niciodată asta: 'value' => $_GET['s'] ... $query->get('s');, get_search_query, sau sanitize_key($_GET['s']) sunt opțiuni mai sigure. Tehnic, nu ar trebui să folosim parametrii GET în WordPress deloc, nu este o practică recomandată. Valoarea GET ar putea fi tot felul de lucruri rele și nu vrem să o transmitem către baza de date fără a ne asigura că este curată.

De asemenea, folosești operatorul LIKE... așa că poate ar fi bine să adaugi ghilimele în jurul valorii pentru o potrivire mai strictă.

'value' => '"'.$query->get('s').'"';
7 nov. 2018 22:29:08
0
-1

Am revizuit codul tău, dar nu reușesc să identific problema din codul tău. Am o soluție simplă. Poți folosi un plugin WordPress gratuit de la terți, WP Extended Search și să selectezi metacheile pe care dorești să le incluzi în rezultatele căutării. Acest plugin ajută la extinderea căutării implicite din WordPress și include metadatele articolelor, taxonomiile și tipurile personalizate de articole în rezultatele căutării.

WP Extended Search: https://wordpress.org/plugins/wp-extended-search/

Interfața plugin-ului WP Extended Search

Sper că acest lucru te ajută...!!

26 iun. 2018 20:23:35