изменить поисковый запрос wordpress - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть поисковый запрос, который выполняется через пользовательский тип записи, но он ищет все части текста, а не полные предложения.

Например, если вы ищете Menta в качестве названия компании, в текстовом содержимом также будет отображаться запись Comple menta ry.

Мне нужно найти способизменить эту функцию ниже, чтобы выполнить поиск только по названию поста и ничего больше, что было бы идеальным решением.Или, если это невозможно, то искать только полные слова, а не части.Я надеюсь, что это имеет смысл.

Это код:

    function aitIncludeMetaInSearch($where) {
        remove_filter('posts_where', 'aitIncludeMetaInSearch');

        global $wpdb;
        // this filter callbeck can be used in ajax requests
        // search string doesn't exist in ajax requests
        // therefore search keyword must be passed as a global query from other scope
        global $__ait_query_data;
        $searchKeyword = $__ait_query_data['search-params']['s'];

        // list of meta keys where we are searching
        $metaKeys = array('subtitle', 'features_search_string');
        $metaKeys = "'" . implode( "', '", esc_sql( $metaKeys ) ) . "'";

        $toFind = "(".$wpdb->posts . ".post_title";

        $likeClause = $wpdb->esc_like( $searchKeyword );
        $likeClause = '%' . $likeClause . '%';

        // search in postmeta values and return array of post ids
        $subQuery = $wpdb->prepare(
            "SELECT group_concat(post_id) as ids FROM {$wpdb->postmeta} AS postmeta
                WHERE postmeta.meta_value LIKE %s
                AND postmeta.meta_key IN ({$metaKeys})",
            $likeClause
        );
        $subQuery = "(FIND_IN_SET(".$wpdb->posts.".ID, (".$subQuery."))) OR ";

        $subqueryLength = strlen($subQuery);

        $positions = aitFindStrPos($toFind, $where);

        $newWhere = $where;
        for ($i = 0; $i < sizeof($positions); $i++) {
            // insert subquery on each position where $toFind occured
            // consider that each next position is moved by the length of previously inserted subquery
            $newWhere = substr_replace($newWhere, $subQuery, $positions[$i] + $i * $subqueryLength, 0);
        }

        // Return revised WHERE clause
        return $newWhere;
    }

Любая помощь будет отличной: D

1 Ответ

0 голосов
/ 14 сентября 2018

Эта функция выглядит так, как будто она предназначена для добавления в мета-поиск, а не для ограничения существующего поиска только заголовком поста. Если вы хотите это сделать, попробуйте удалить имеющийся у вас код и использовать его здесь:

Поиск по WordPress только в заголовке сообщения

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

См .: Поиск "соответствия всего слова" в MySQL

function aitIncludeMetaInSearch($where) {
    remove_filter('posts_where', 'aitIncludeMetaInSearch');

    global $wpdb;
    // this filter callbeck can be used in ajax requests
    // search string doesn't exist in ajax requests
    // therefore search keyword must be passed as a global query from other scope
    global $__ait_query_data;
    $searchKeyword = $__ait_query_data['search-params']['s'];

    // list of meta keys where we are searching
    $metaKeys = array('subtitle', 'features_search_string');
    $metaKeys = "'" . implode( "', '", esc_sql( $metaKeys ) ) . "'";

    $toFind = "(".$wpdb->posts . ".post_title";

    $likeClause = $wpdb->esc_like( $searchKeyword );
    $regexClause = '[[:<:]]' . $likeClause . '[[:>:]]';

    // search in postmeta values and return array of post ids
    $subQuery = $wpdb->prepare(
        "SELECT group_concat(post_id) as ids FROM {$wpdb->postmeta} AS postmeta
            WHERE postmeta.meta_value REGEXP %s
            AND postmeta.meta_key IN ({$metaKeys})",
        $regexClause
    );
    $subQuery = "(FIND_IN_SET(".$wpdb->posts.".ID, (".$subQuery."))) OR ";

    $subqueryLength = strlen($subQuery);

    $positions = aitFindStrPos($toFind, $where);

    $newWhere = $where;
    for ($i = 0; $i < sizeof($positions); $i++) {
        // insert subquery on each position where $toFind occured
        // consider that each next position is moved by the length of previously inserted subquery
        $newWhere = substr_replace($newWhere, $subQuery, $positions[$i] + $i * $subqueryLength, 0);
    }

    // Return revised WHERE clause
    return $newWhere;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...