Search Everything
-
Не ищет по имени категории. Т.е. если у Вас есть категория «Молоко», но в посте этой категории нет слова «молоко», то поиск Вам не выдаст ничего. Хотя категорию он ищет, но только если Вы будете искать адрес категории на латинице — «moloko».
Вся проблема в том, что стоит плагин RusToLat, который из «молоко» делает «moloko». А Search Everything к этому не готов.
-
Может стоит подойти к к проблеме более правильно.
Искать каждое имя категории и описание: ДА.
Вот этот код(не считая поиска по описанию категории) ищет по полю wp_terms.slug, а надо чтоб искал по полю wp_terms.name// create the search categories query function se_build_search_categories() { global $wp_query, $wpdb; $s = $wp_query->query_vars['s']; $search_terms = $this->se_get_search_terms(); $exact = $wp_query->query_vars['exact']; $search = ''; if ( !empty($search_terms) ) { // Building search query for categories slug. $n = ($exact) ? '' : '%'; $searchand = ''; $searchSlug = ''; foreach($search_terms as $term) { $term = addslashes_gpc($term); $searchSlug .= "{$searchand}(tter.slug LIKE '{$n}".sanitize_title_with_dashes($term)."{$n}')"; $searchand = ' AND '; } if (!$sentence && count($search_terms) > 1 && $search_terms[0] != $s ) { $searchSlug = "($searchSlug) OR (tter.slug LIKE '{$n}".sanitize_title_with_dashes($s)."{$n}')"; } if ( !empty($searchSlug) ) $search = " OR ({$searchSlug}) "; // Building search query for categories description. $searchand = ''; $searchDesc = ''; foreach($search_terms as $term) { $term = addslashes_gpc($term); $searchDesc .= "{$searchand}(ttax.description LIKE '{$n}{$term}{$n}')"; $searchand = ' AND '; } $sentence_term = $wpdb->escape($s); if (!$sentence && count($search_terms) > 1 && $search_terms[0] != $sentence_term ) { $searchDesc = "($searchDesc) OR (ttax.description LIKE '{$n}{$sentence_term}{$n}')"; } if ( !empty($searchDesc) ) $search = $search." OR ({$searchDesc}) "; } $this->se_log("categories where: ".$search); return $search; }
Хотя опять же, я не понимаю вот чего.
Я изменил поле wp_terms.slug одной из категорий. Изменил, в смысле поменял на русское название. Начал искать по этому русскому названию, но поиск ничего не находит. Хотя он ведь по этому полю ищет o_Oэто ошибка в плагине можете писать автору, чтобы исправлял
// add where clause to the search query function se_search_where($where) { global $wp_query, $wpdb; $searchQuery = ''; //add filters based upon option settings if ("Yes" == $this->options['se_use_tag_search']) { $searchQuery .= $this->se_build_search_tag(); } if ("Yes" == $this->options['se_use_category_search']) { $searchQuery .= $this->se_build_search_categories(); } if ("Yes" == $this->options['se_use_metadata_search']) { $searchQuery .= $this->se_build_search_metadata(); } if ("Yes" == $this->options['se_use_excerpt_search']) { $searchQuery .= $this->se_build_search_excerpt(); } if ("Yes" == $this->options['se_use_comment_search']) { $searchQuery .= $this->se_build_search_comments(); } if ($searchQuery != '') { $where = str_replace( ")))", ")$searchQuery))", $where ); } echo '<div>';print_r($searchQuery);echo '</div><br />'; echo '<div>';print_r($where);echo '</div>'; if ($this->options['se_exclude_posts_list'] != '') { $where .= $this->se_build_exclude_posts(); } if ($this->options['se_exclude_categories_list'] != '') { $where .= $this->se_build_exclude_categories(); } $this->se_log("global where: ".$where); return $where; }
строка $searchQuery успешно создается но не вставляется в общий запрос $where
$where = str_replace( ")))", ")$searchQuery))", $where );
причем это только когда более 2 слов
Я бы написал автору если б английский знал)
Надо кому-то типо Лекактуса или Соники написать.
Хотя, конечно, до них тяжело достучаться.В запросе не встречаются три скобки, поэтому замена не срабатывает:
$where = str_replace( ")))", ")$searchQuery))", $where );
Можно исправить, например, так:
$where = substr_replace($where, ")$searchQuery) ", strrpos($where, ')) '));
Можно даже не менять сам плагин, если добавить исправленную функцию в
functions.php
активной темы:function se_search_where_fixed($where) { global $wp_query, $wpdb, $SE; $searchQuery = ''; if ( empty($SE) ) return; //add filters based upon option settings if ("Yes" == $SE->options['se_use_tag_search']) { $searchQuery .= $SE->se_build_search_tag(); } if ("Yes" == $SE->options['se_use_category_search']) { $searchQuery .= $SE->se_build_search_categories(); } if ("Yes" == $SE->options['se_use_metadata_search']) { $searchQuery .= $SE->se_build_search_metadata(); } if ("Yes" == $SE->options['se_use_excerpt_search']) { $searchQuery .= $SE->se_build_search_excerpt(); } if ("Yes" == $SE->options['se_use_comment_search']) { $searchQuery .= $SE->se_build_search_comments(); } if ($searchQuery != '') { $where = substr_replace($where, ")$searchQuery) ", strrpos($where, ')) ')); } if ($SE->options['se_exclude_posts_list'] != '') { $where .= $SE->se_build_exclude_posts(); } if ($SE->options['se_exclude_categories_list'] != '') { $where .= $SE->se_build_exclude_categories(); } $SE->se_log("global where: ".$where); return $where; } if ( class_exists('SearchEverything') ) { remove_filter('posts_search', array($SE, 'se_search_where')); add_filter('posts_search', 'se_search_where_fixed'); }
Sergey Biryukov, ОГРОМНОЕ СПАСИБО!) Работает как надо)
Sergey Biryukov, Ваше решение работает только в FF.
Я не знаю почему, но в Opera, Chrome, IE — не работает.Мне кажется, Вы знаете. По крайней мере, надеюсь, что знаете. 🙂
Оказалось проще — работало только для авторизованных пользователей 🙂 Для неавторизованных к запросу добавлялось условие отсутствия пароля для просмотра записей, и замена опять не выполнялась.
Исправил строку с заменой —
substr_replace()
— в предыдущем сообщении.Sergey Biryukov, спасибо) работает хорошо 🙂
- Тема «Search Everything» закрыта для новых ответов.