Поиск по произвольным полям (без четко заданного запроса)

Добрый день, уважаемые форумчани. Возникла необходимость организации поиска постов, по части произвольного поля.

Именно по части а не строго задавая его значение. С полным значением проблем нет, даже способов реализации несколько, а вот с поиском по части запрос – проблема. Встречал реализацию плагином поиском по произвольным полям, но для меня не подходит, так как база сайта около 1 гб а хостинг обычный шаред.

Код который выводит до 50 постов, произвольное поле которого состоит из слова "Орёл".

<?php
query_posts( array(
‘meta_query’ => array(
array(
‘key’ => ‘_aioseop_description’,
‘value’ => ‘Орёл’,
)
),
‘posts_per_page’ => ’50’
) );?>
<?php while (have_posts()) : the_post(); ?>
<p><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
<?php endwhile;wp_reset_query();?>

Также задавал похожие запросы напрямую в БД, но не получается задать плавающие границы, что бы поиск включал не все посты, где значение может произвольного поля не обязательно полностью совпадает с маской поиска.

$pages = $wpdb->get_results(
"SELECT post_id
FROM $wpdb->postmeta
WHERE meta_key = ‘_aioseop_description’
AND meta_value = ‘Орёл’
"
);
/* вытаскивает из базы данных заголовки и содержимое
всех опубликованных страниц */
if( $pages ) {
foreach ( $pages as $page ) {
echo $page->post_id;
}
}

Несмотря на это, запрос напрямую к sql нечеткой маской задать получается:

SELECT *
FROM `wp_postmeta`
WHERE `meta_key` LIKE ‘_aioseop_description’
AND `meta_value` LIKE ‘%орел%’ (именно знаки процента показывают что ищем лишь слово среди всего пула текста)
LIMIT 0 , 30

Подскажите, можно ли реализовать необходимую задачу? Так сказать модернизировать первый или второй код, чтобы получить результат как в последнем sql запросе.

Столкнулся с подобной ситуацией как и у вас, только делал поиск по названию поста.
Вот костыль, который делает поиск по неточному запросу:

[code-
function __search_by_title_only( $search, &$wp_query ) {
global $wpdb;
if ( empty( $search ) )
return $search; // skip processing – no search term in query
$q = $wp_query->query_vars;

$n = ! empty( $q[‘exact’] ) ? ” : ‘%’;
$search = ”;
$searchand = ”;

$qs = $q[‘search_terms’];
$str_s = implode(‘ ‘, $qs);

preg_match_all(‘~(\pL+)~u’,$str_s,$matches);
$words=array_unique($matches[0]);

$true_words=Array();
if (count($words)) {
foreach($words as $word) {
// Обрабатывать только слова длиннее 3 символов
if (strlen($word)>3) {
// От слов длиннее 7 символов отрезать 2 последних буквы
if (strlen($word)>7) {
$word=substr($word,0,(strlen($word)-2));
}
// От слов длиннее 5 символов отрезать последнюю букву
elseif (strlen($word)>5) {
$word=substr($word,0,(strlen($word)-1));
}
$true_words
=addcslashes(addslashes($word),’%_’);
}
}
}
// Список уникальных поисковых слов
$true_words=array_unique($true_words);

foreach ( $true_words as $term ) {
$term = esc_sql( like_escape( $term ) );
$search .= "{$searchand}($wpdb->posts.post_title LIKE ‘{$n}{$term}{$n}’)";
$searchand = ‘ AND ‘;
}
if ( ! empty( $search ) ) {
$search = " AND ({$search}) ";
if ( ! is_user_logged_in() )
$search .= " AND ($wpdb->posts.post_password = ”) ";
}
return $search;
}
add_filter( ‘posts_search’, ‘__search_by_title_only’, 500, 2 );
[/code]

Anonymous
Отправить
Ответ на: