• Здравствуйте, решил настроить поиск по произвольным полям. Суть простая, добавляю в поле дополнительные названия, чтобы пост было легче найти в поиске (речь о поиске внутри сайта). Поиск по тексту статьи отключил. В итоге работает, но нагрузка на БД возросла в двое, чтобы не менять тариф хостинга, решил попробовать оптимизировать или подыскать более удачный код.

    Возможно у кого-то есть готовое решение или возможность помочь оптимизировать данный код. За помощь отправлю вознаграждение.


    Вот мой вариант, поиск идет сразу по двум полям «pole1, pole2»

    function cf_search_join( $join ) {
    global $wpdb;

    if ( is_search() ) {
    $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }

    return $join;
    }
    add_filter('posts_join', 'cf_search_join' );

    function cf_search_where( $where ) {
    global $pagenow, $wpdb;

    if ( is_search() ) {
    $where = preg_replace(
    "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
    "(" . $wpdb->posts . ".post_title LIKE $1) OR (" . $wpdb->postmeta . ".meta_value LIKE $1 AND " . $wpdb->postmeta . ".meta_key IN ( 'pole1', 'pole2' ) )", $where );
    }

    return $where;
    }
    add_filter( 'posts_where', 'cf_search_where' );

    function cf_search_distinct( $where ) {
    global $wpdb;

    if ( is_search() ) {
    return "DISTINCT";
    }

    return $where;
    }
    add_filter( 'posts_distinct', 'cf_search_distinct' );

Просмотр 15 ответов — с 1 по 15 (всего 17)
  • Добавьте в базе в таблицу постмета индекс для поля метакей — хоть немного попустит.

    Автор rootey

    (@rootey)

    Можно подробней, как добавить эту таблицу?

    еще раз прочитайте

    Автор rootey

    (@rootey)

    Тогда, как добавить постмета индекс для поля метакей ?

    phpmyadmin поможет сделать, там все есть для этого

    Автор rootey

    (@rootey)

    Попробую разобраться, спасибо.

    Посмотрите еще на запрос. Использование LIKE обычно сильно нагружает на больших объемах.

    Автор rootey

    (@rootey)

    Вы можете помочь с этим? Сомневаюсь, что я смогу переделать запрос, не хватит знаний.

    @ravilr63 там к сожалению полнотекстовый поиск, LIKE не уберешь из meta_value и post_title поиска… поэтому чуть ускорить можно по метакей индексом. хорошо хоть автор по контенту не ищет.

    что только люди ни делают, лишь бы плагинами не пользоваться….

    Автор rootey

    (@rootey)

    Сделал sql запрос SHOW INDEX FROM wp_postmeta;
    Это означает, что индекс уже есть в базе или нужно добавить еще?

    Да, индекс есть. Вот это почитайте https://dba.stackexchange.com/questions/95658/how-does-like-query-work-with-indexed-table

    После изучения этого поста практический результат нулевой. Но все равно спасибо за подсказки.
    Удалось найти альтернативный код, который ищет по полю и при этом добавление или удаление идекса работает. SQL запрос обрабатывается в 10 раз быстрее с индексом, за 0,1секунду.

    Только вот сам поиск работает не так как нужно. Меняется принцип поиска. Вместо поиска по точному сочетанию поисковой фразы, выдаются все посты, где встречается хотя бы одно слово из поисковой фразы. Так же хотелось бы отключить поиск по контенту статьи и добавить два произвольных поля вместо одного. Может кто помочь доработать эти тонкости?) Если желающие помочь найдутся пишите сюда или вличку. За помощь отправлю благодарность. Вот сам код.

    add_filter( 'posts_clauses', 'km_metadata_search' );

    # Добавляем поиск по метаполям в базовый поиск WordPress
    function km_metadata_search( $clauses ){
    global $wpdb;

    if( ! is_search() || ! is_main_query() )
    return $clauses;

    $clauses['join'] .= " LEFT JOIN $wpdb->postmeta kmpm ON (ID = kmpm.post_id)";

    $clauses['where'] = preg_replace(
    "/OR +\( *$wpdb->posts.post_content +LIKE +('[^']+')/",
    "OR (kmpm.meta_value LIKE $1) $0",
    $clauses['where']
    );

    // если нужно искать в указанном метаполе
    $clauses['where'] .= $wpdb->prepare(' AND kmpm.meta_key = %s', 'pole1' );

    $clauses['distinct'] = 'DISTINCT';

    // дебаг итогового запроса
    0 && add_filter( 'posts_request', function( $sql ){ die( $sql ); } );

    return $clauses;
    }

    Если желающие помочь найдутся пишите сюда или вличку. За помощь отправлю благодарность.

    это запрещено правилами форума.
    А «личку» тебе для начала придется создать самостоятельно. Нет ее на этом форуме.

    Понятно, сообщение отредактировать уже возможности нет. Если можете подсказать что-то по данному коду, пишите тут. Буду рад любой помощи.

Просмотр 15 ответов — с 1 по 15 (всего 17)
  • Тема «Настроить поиск по произвольным полям» закрыта для новых ответов.