• Решено Misha1990

    (@misha1990)


    Не ищет по имени категории. Т.е. если у Вас есть категория «Молоко», но в посте этой категории нет слова «молоко», то поиск Вам не выдаст ничего. Хотя категорию он ищет, но только если Вы будете искать адрес категории на латинице — «moloko».

    Вся проблема в том, что стоит плагин RusToLat, который из «молоко» делает «moloko». А Search Everything к этому не готов.

Просмотр 8 ответов — с 16 по 23 (всего 23)
  • Автор Misha1990

    (@misha1990)

    Может стоит подойти к к проблеме более правильно.
    Искать каждое имя категории и описание: ДА.
    Вот этот код(не считая поиска по описанию категории) ищет по полю 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 слов

    Автор Misha1990

    (@misha1990)

    Я бы написал автору если б английский знал)
    Надо кому-то типо Лекактуса или Соники написать.
    Хотя, конечно, до них тяжело достучаться.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    В запросе не встречаются три скобки, поэтому замена не срабатывает:

    $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');
    }

    Автор Misha1990

    (@misha1990)

    Sergey Biryukov, ОГРОМНОЕ СПАСИБО!) Работает как надо)

    Sergey Biryukov, Ваше решение работает только в FF.
    Я не знаю почему, но в Opera, Chrome, IE — не работает.

    Мне кажется, Вы знаете. По крайней мере, надеюсь, что знаете. 🙂

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Оказалось проще — работало только для авторизованных пользователей 🙂 Для неавторизованных к запросу добавлялось условие отсутствия пароля для просмотра записей, и замена опять не выполнялась.

    Исправил строку с заменой — substr_replace() — в предыдущем сообщении.

    Sergey Biryukov, спасибо) работает хорошо 🙂

Просмотр 8 ответов — с 16 по 23 (всего 23)
  • Тема «Search Everything» закрыта для новых ответов.