it-swarm.com.de

Fügen Sie benutzerdefinierte Felder zur Suche hinzu

Ich möchte eine benutzerdefinierte Felder ("Einführung" und "ensavoirplus") zur Suche in Wordpress hinzufügen, aber der SQL-Code ist nicht genau. Ich verstehe nicht, ob ich einen Fehler mache oder ob WP dies nicht kann. Aber mein Versuch scheitert ... Ich weiß nicht warum, weil ich genau das tue, was der Kodex sagt.

Das ist mein Code:

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

Und das ist der SQL-Code:

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

Die Fehler sind in Zeile 13, weil ich nicht einUNDwill, sondern einODERund die Zeilen 13, 14, 15, 16 sollten direkt nach Zeile 7 stehen, dass alles funktioniert .

Jemand hatte bereits die gleiche Art von Fehler und wenn ja, woher kam er?

Vielen Dank

5
ecaLdipS

Dank WordPress 4.1 können Sie meta_query verbessern: 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');

Hab nicht getestet aber du kommst auf die Idee ...

1
ArnaudBan

bitte tun Sie dies niemals: 'value' => $_GET['s'] ... $query->get('s');, get_search_query oder sanitize_key($_GET['s']) sind alle sicherer. Technisch gesehen sollten wir Get-Parameter in WordPress überhaupt nicht verwenden, es ist keine Best-Practice. Dieser Wert kann alles Mögliche sein, was schlecht ist, und wir möchten ihn nicht an die Datenbank weitergeben, ohne sicherzustellen, dass er sauber ist.

Außerdem verwenden Sie den Operator LIKE, sodass Sie den Wert möglicherweise in Anführungszeichen setzen möchten, um eine genauere Übereinstimmung zu erzielen.

'value' => '"'.$query->get('s').'"';
0
admcfajn