web-dev-qa-db-fra.com

Ajouter des champs personnalisés à la recherche

Je souhaite ajouter un champ personnalisé ("introduction" et "ensavoirplus") à la recherche de Wordpress, mais le code SQL n'est pas exact. Je ne comprends pas si je fais une erreur ou si WP ne peux pas le faire. Mais ma tentative échoue ... Je ne sais pas pourquoi parce que je fais exactement ce que dit le codex.

Ceci est mon 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');

Et voici le code 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

Les erreurs sont sur la ligne 13, parce que je ne veux pas deETmais deOUet les lignes 13,14,15,16 devraient aller juste après la ligne 7 pour que tout fonctionne .

Quelqu'un a déjà eu le même genre d'erreur et si oui d'où venait-il?

Merci

5
ecaLdipS

Grâce à WordPress 4.1, vous pouvez faire mieux pour 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');

N'a pas testé mais vous avez eu l'idée ...

1
ArnaudBan

veuillez ne jamais faire ceci: 'value' => $_GET['s'] ... $query->get('s');, get_search_query , ou sanitize_key($_GET['s']) sont toutes des options plus sûres. Techniquement, nous ne devrions pas du tout utiliser get-params dans wordpress, ce n'est pas une meilleure pratique. Cela pourrait être une panoplie de mauvaises choses, et nous ne voulons pas le transmettre à la base de données sans nous assurer qu'il est propre.

En outre, vous utilisez l'opérateur LIKE ... vous pouvez donc ajouter des guillemets autour de la valeur pour une correspondance plus stricte.

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