web-dev-qa-db-ja.com

検索にカスタムフィールドを追加する

Wordpressの検索にカスタムフィールド( "Introduction"と "ensavoirplus")を追加したいのですが、SQLコードが正確ではありません。私がミスをしたのか、WPができないのかわかりません。しかし、私の試みは失敗します...私はコーデックスが正確に言うことをするので私は理由を知りません。

これは私のコードです:

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

これが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

_と_ はしたくないが _と_ は行13、14、15、16はすべてうまくいくので行13、14、15、16に行くべきだからです。

誰かがすでに同じ種類のエラーを抱えていますが、もしそうなら、どこから来ましたか?

ありがとう

5
ecaLdipS

WordPress 4.1のおかげで、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');

テストしませんでしたが、あなたはアイデアを得ます...

1
ArnaudBan

絶対にしないでください:'value' => $_GET['s'] ... $query->get('s');get_search_query 、またはsanitize_key($_GET['s'])は、すべて安全なオプションです。技術的には、ワードプレスでget-paramsを使用してはいけません。ベストプラクティスではありません。それが価値を得ることはあらゆる種類の悪いことかもしれません、そして私たちはそれがきれいであることを確認せずにdbにそれを渡したくないです。

また、LIKE演算子を使用しています...そのため、より厳密な一致のために値の前後に引用符を追加することをお勧めします。

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