Добавление пользовательских полей в поиск WordPress

8 янв. 2015 г., 12:05:23
Просмотры: 13.6K
Голосов: 6

Я хочу добавить пользовательские поля ("introduction" и "ensavoirplus") в поиск WordPress, но SQL запрос формируется неверно. Я не понимаю, делаю ли я ошибку или WordPress не поддерживает такую возможность. Моя попытка не работает... Я не знаю почему, ведь я делаю всё точно по документации Codex.

Вот мой код:

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, потому что мне нужно OR вместо AND, а строки 13,14,15,16 должны идти сразу после строки 7, чтобы всё работало правильно.

Кто-нибудь сталкивался с подобной ошибкой и если да, то в чём причина?

Спасибо

0
Все ответы на вопрос 3
1

Благодаря 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');

Не тестировал, но суть вы поняли...

9 янв. 2015 г. 11:29:05
Комментарии

Спасибо за ваш ответ, первое условие "OR" не меняет "AND" (перед первым meta_key) в SQL-коде... Я заметил изменения в WP 4.1 относительно order meta_query, и мне кажется, это не решает мою проблему: /

ecaLdipS ecaLdipS
9 янв. 2015 г. 12:28:37
0

пожалуйста, никогда не делайте так: 'value' => $_GET['s'] ... $query->get('s');, get_search_query, или sanitize_key($_GET['s']) — все это более безопасные варианты. Технически, нам вообще не следует использовать GET-параметры в WordPress, это не лучшая практика. Это значение GET может содержать всякие неприятные вещи, и мы не хотим передавать его в базу данных, не убедившись, что оно чистое.

Кроме того, вы используете оператор LIKE... так что, возможно, стоит добавить кавычки вокруг значения для более строгого соответствия.

'value' => '"'.$query->get('s').'"';
7 нояб. 2018 г. 22:29:08
0
-1

Я просмотрел ваш код, но не могу найти, что не так с вашим кодом. У меня есть простое решение. Вы можете использовать бесплатный сторонний плагин для WordPress — WP Extended Search — и выбрать мета-ключи, которые хотите добавить в результаты поиска. Этот плагин помогает расширить стандартный поиск WordPress и включить в результаты поиска метаданные записей, таксономии и пользовательские типы записей.

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

WP Extended Search - расширение поиска в WordPress

Надеюсь, это поможет...!!

26 июн. 2018 г. 20:23:35